Text Classification - penny4860/study-note GitHub Wiki
- ์ฐธ๊ณ ์๋ฃ
- ํ ์ํ๋ก์ ๋จธ์ ๋ฌ๋์ผ๋ก ์์ํ๋ ์์ฐ์ด ์ฒ๋ฆฌ
- ์ด๋ฏธ์ง์ Text์ ๋ณด๋ค์ ์ด์ฉํ ์ผํ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ AI
- convolutional neural network for sentence classification
1. ๋ฐ์ดํฐ ๋ถ์
- Histogram
- x์ถ : ๋ ์ด๋ธ
- y์ถ : ๋ฐ์ดํฐ ์ซ์ / ๋ฌธ์ฅ์ ๊ธธ์ด
- Box Plot
- ๋ ์ด๋ธ ๋ณ ๋ฐ์ดํฐ ์ซ์
- ์๋ ํด๋ผ์ฐ๋
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ๋จ์ด๋ฅผ ์๊ฐํ
2. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- ํ๋ถ๊ธฐ๋ก tokenizing
- ์ด๊ฐ ์ถ์ถ ์ต์
:
stem=True
- sentence -> word list
- ์ด๊ฐ ์ถ์ถ ์ต์
:
- ๋ถ์ฉ์ด (stopword) ์ญ์
- vectorize
- index ๋ณํ : tf.Tokenizer ๋ชจ๋
- word list๋ฅผ index list๋ก ๋ณํ
- ํจ๋ฉ : tf.pad_sequence ๋ชจ๋
- ๋ชจ๋ index list๋ฅผ fixed length๋ก ๋ง์ถ๋ค.
- index ๋ณํ : tf.Tokenizer ๋ชจ๋
3. RNN text ๋ถ๋ฅ๊ธฐ
- index list
- Embedding Layer
- LSTM -> LSTM
- ์ด์ step์ ์ถ๋ ฅ๊ณผ
- ํ์ฌ step์ Embedding Layer ์ถ๋ ฅ์ ์ ๋ ฅ๋ฐ๋๋ค.
- fc + softmax
4. CNN text ๋ถ๋ฅ๊ธฐ
- index list :
[sequence,]
[30]
- embed list :
[sequence, embed-size, 1]
[30, 64, 1]
- cnn :
- input tensor :
[sequence, embed-size, 1]
- kernel :
[kh-size, kw-size, input-depth, output-depth]
[1/2/3/4, embed-size, 1, n-filters]
- kh-size๋ฅผ ์ฌ๋ฌ๊ฐ๋ก filtering ํ๊ณ concat
- ๋ค์ด๋ฒ ์นดํ ๊ณ ๋ฆฌ ๋งค์นญ์ ๊ฒฝ์ฐ 1/2/3/4 4๊ฐ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํจ.
- output tensor :
[sequence, 1, n-filters*4]
- input tensor :
- max pooling
[sequence, 1, n-filters*4]
==>[1, 1, n-filters*4]
- flatten
[1, 1, n-filters*4]
==>[n-filters*4,]
- fc + softmax
[n-filters*4,]
==>[n-categories,]
4.1. Text CNN ๊ตฌํ ๊ณผ์
1) ํ์ต ๋ฐ์ดํฐ ์ ๋ฆฌ
text / label
์ 1๊ฐ์ ํ ์คํธํ์ผ๋ก ์ ์ฅ- pandas๋ก 1๋ฒ์ ์ฝ๊ฑฐ์ค๊ฑฐ๋
readlines()
๋ก 1์ค์ฉ ์ฝ์ด์ค์.
2) Text ์ ์ ์์
- ํ๊ตญ์ด์ ๊ฒฝ์ฐ ํ๋ถ๊ธฐ๋ฅผ ์จ์ ์ ์ ์์ ์ ํด์ค์ผ ํจ.
- ์กฐ์ฌ์ ๊ฑฐ / ๋ถ์ฉ์ด์ ๊ฑฐ
3) word2vec ๋ชจ๋ธ ๋น๋
- gensim ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํด์ ๋จ์ด๋ฅผ vector๋ก ๋ฐ๊ฟ์ฃผ๋ word2vec model์ ๋น๋ํ๋ค.
model = Word2Vec(cleaned_text_list, 64, window, min_count)
# model.mv.voca : ๋จ์ด์ฌ์
# ๋จ์ด์ฌ์ ์ ์๋ ๋จ์ด๋ 64-d vector๋ก ๋ง๋ค์ด์ค์ ์๋ค.
4) keras Tokenizer ๋น๋
- ๋จ์ด 1๊ฐ๋ฅผ ์ซ์ 1๊ฐ (index)๋ก ๋ฐ๊ฟ์ฃผ๋
Tokenizer
๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์์
# 0๋ฒ index๋ ๋จ์ด ์ฌ์ ์ ์๋ ๋ชจ๋ ๋จ์ด(unknown)์ index
t = Tokenizer(voca_size + 1)
t.fit_on_text(...)
# json ํ์ผ๋ก ์ ์ฅ
5) ์๋ฒ ๋ฉ ๋งคํธ๋ฆญ์ค ๋น๋
-
3)๊ณผ์
์์ ๋ง๋ค์ด๋์ ์๋ฒ ๋ฉ ๋งคํธ๋ฆญ์ค๋ฅผ keras์์ ์ฌ์ฉํ ์ ์๋ ํํ์ matrix๋ก ๋ฐ๊พธ์ด ์ฃผ๋ ์์ -
์ ์ถ๋ ฅ ๊ด๊ณ
- ์
๋ ฅ
- word2vec ๋ชจ๋ธ :
3)๊ณผ์
์์ ๋น๋ - keras Tokenizer :
4)๊ณผ์
์์ ๋น๋
- word2vec ๋ชจ๋ธ :
- ์ถ๋ ฅ
- ์๋ฒ ๋ฉ matrix :
[voca_size + 1, 64]
- 0-th row vector :
unknown
์ ๋ํ embedding vector - 1-th row vector : keras Tokenizer์ 1๋ฒ index์ ๋จ์ด์ ๋ํ embedding vector
- 0-th row vector :
- ์๋ฒ ๋ฉ matrix :
- ์
๋ ฅ
-
๋จ์ด ---> index ---> embedding vector
- ๋จ์ด ---> index
- Tokenizer
- index ---> embedding vector
- word2vec
- ๋จ์ด ---> index
6) Keras Model ๊ตฌํ
Embedding Layer -> cnn -> pooling -> fc + softmax
- Embedding Layer
- ์
๋ ฅ
- index list :
[1, 10, 0, 0, 0]
- index list :
- ์ถ๋ ฅ
- embeding vector :
(5, 64)
- embeding vector :
- ์
๋ ฅ
7) Batch Generator ๊ตฌํ
- (index_list, ys) ๋ฅผ ํ์ตํ ๋ชจ๋ธ์ ๋๊ฒจ์ผ ํจ.
- ๊ฐ batch ๋ณ๋ก
- xs : raw text ---> cleaned text ---> index
- ์ ์ ํจ์ :
2)
์์ ํ๋ถ๊ธฐ ์ธ๊ฒ - Tokenizer :
4)
์์ ๋น๋ํ keras tokenizer๋ฅผ ์ธ๊ฒ
- ์ ์ ํจ์ :
- ys : ์นดํ
๊ณ ๋ฆฌ ํ
์คํธ ---> ์นดํ
๊ณ ๋ฆฌ ์ธ๋ฑ์ค ---> 1-hot
category text : index
ํ ์ด๋ธ์ ๋ง๋ค์ด์ผ ํจ.
- xs : raw text ---> cleaned text ---> index
8) ์์ธก๊ณผ์
- ์
์ถ๋ ฅ
- input : raw text
- output : ์นดํ ๊ณ ๋ฆฌ text
- ์ค๋น๋ฌผ
- ์ ์ ํจ์ :
2)
์์ ์ฌ์ฉํ ํ๋ถ๊ธฐ - Keras Tokenizer :
4)
์์ ๋น๋ํ keras tokenizer - ํ์ตํ ๋ชจ๋ธ
category text : index
ํ ์ด๋ธ
- ์ ์ ํจ์ :
- ๊ณผ์
- raw text ---> cleaned text
- ์ ์ ํจ์ ์ฌ์ฉ
- cleaned text ---> index
- Keras Tokenizer ์ฌ์ฉ
- index ---> pred category index
- ๋ชจ๋ธ
- category index ---> ์นดํ
๊ณ ๋ฆฌ text
category text : index
ํ ์ด๋ธ์ ์ญ์ผ๋ก ์ฌ์ฉ
- raw text ---> cleaned text