4.1 ์๋ฒ ๋ฉ์ด๋?
์๋ฒ ๋ฉ embedding
- ์ปดํจํฐ๋ ์์น ์ฐ์ฐ๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์์ฐ์ด๋ฅผ ์ซ์๋ ๋ฒกํฐ ํํ๋ก ๋ณํํ๋ ์ผ๋ จ์ ๊ณผ์ .
- ๋จ์ด๋ ๋ฌธ์ฅ์ ์์นํํด ๋ฒกํฐ ๊ณต๊ฐ์ผ๋ก ํํํ๋ ๊ณผ์
- ๋ง๋ญ์น์ ์๋ฏธ์ ๋ฐ๋ผ ๋ฒกํฐํํ๊ธฐ ๋๋ฌธ์ ๋ฌธ๋ฒ์ ์ธ ์ ๋ณด๊ฐ ํฌํจ
์๋ฒ ๋ฉ์ ๊ธฐ๋ฒ
- ๋ฌธ์ฅ ์๋ฒ ๋ฉ
๋ฌธ์ฅ ์ ์ฒด๋ฅผ ๋ฒกํฐ๋ก ํํํ๋ ๋ฐฉ๋ฒ
1. ์ฅ์ : ์ ์ฒด ๋ฌธ์ฅ์ ํ๋ฆ์ ํ์ ํด ๋ฒกํฐ๋ก ๋ณํํ๊ธฐ ๋๋ฌธ์ ๋ฌธ๋งฅ์ ์๋ฏธ๋ฅผ ์ง๋
- ๋จ์ด ์๋ฒ ๋ฉ์ ๋นํด ํ์ง์ด ์ข๊ณ , ์์ฉ ์์คํ ์ ๋ง์ด ์ฌ์ฉ๋จ
2. ๋จ์ : ์๋ฒ ๋ฉํ๊ธฐ ์ํด ๋ง์ ๋ฌธ์ฅ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฉฐ ํ์ตํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ๋ค์ด๊ฐ
- ๋จ์ด ์๋ฒ ๋ฉ
๊ฐ๋ณ ๋จ์ด๋ฅผ ๋ฒกํฐ๋ก ํํํ๋ ๋ฐฉ๋ฒ
1. ์ฅ์ : ํ์ต ๋ฐฉ๋ฒ์ด ๊ฐ๋จํ์ฌ ์ค๋ฌด์์ ๋ง์ด ์ฌ์ฉ๋จ
2. ๋จ์ : ๋์์ด์์ด์ ๋ํ ๊ตฌ๋ถ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฏธ๊ฐ ๋ค๋ฅด๋๋ผ๋ ๋จ์ด์ ํํ๊ฐ ๊ฐ๋ค๋ฉด ๋์ผํ ๋ฒกํฐ๊ฐ์ผ๋ก ํํ
4.2 ๋จ์ด ์๋ฒ ๋ฉ
- ๋ง๋ญ์น์์ ๊ฐ๊ฐ์ ๋จ์ด๋ฅผ ๋ฒกํฐ๋ก ๋ณํํ๋ ๊ธฐ๋ฒ
- ์๋ฏธ์ ๋ฌธ๋ฒ์ ์ ๋ณด๋ฅผ ์ง๋๊ณ ์์ผ๋ฉฐ, ๋จ์ด๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ค์ํ ๋ชจ๋ธ ์กด์ฌ
" ํ ํฌ๋์ด์ง์ ํตํด ์ถ์ถ๋ ํ ํฐ๋ค์ ์ด๋ป๊ฒ ๋จ์ด ์๋ฒ ๋ฉํ ์ง.."
4.2.1 ์-ํซ ์ธ์ฝ๋ฉ one-hot encoding
- ๋จ์ด๋ฅผ ์ซ์ ๋ฒกํฐ๋ก ๋ณํํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ
- ์์๋ค ์ค ๋จ ํ๋์ ๊ฐ๋ง 1์ด๊ณ ๋๋จธ์ง ์์๊ฐ์ 0์ธ ์ธ์ฝ๋ฉ์ ์๋ฏธ
- ์-ํซ ์ธ์ฝ๋ฉ์ผ๋ก ๋์จ ๊ฒฐ๊ณผ๋ฅผ ์-ํซ ๋ฒกํฐ๋ผ๊ณ ํ๋ฉฐ, ์ ์ฒด ์์ ์ค ๋จ ํ๋์ ๊ฐ๋ง 1์ด๊ธฐ ๋๋ฌธ์ ํฌ์sparse ๋ฒกํฐ๋ผ๊ณ ํจ
- ์-ํซ ์ธ์ฝ๋ฉ
from konlpy.tag import Komoran
import numpy as np
komoran = Komeran()
text = "์ค๋ ๋ ์จ๋ ๊ตฌ๋ฆ์ด ๋ง์์."
# ๋ช
์ฌ๋ง ์ถ์ถ
nouns = komoran.nouns(text)
print(nouns)
# ๋จ์ด ์ฌ์ ๊ตฌ์ถ ๋ฐ ๋จ์ด๋ณ ์ธ๋ฑ์ค ๋ถ์ฌ
dics = {}
for word in nouns:
if word not in dics.keys():
dics[word] = len(dics)
print(dics)
# ์-ํซ ์ธ์ฝ๋ฉ
nb_classes = len(dics)
targets = list(dics.values())
one_hot_targets = np.eyes(nb.classes)[targets]
print(one_hot_targets)
- ์-ํซ ์ธ์ฝ๋ฉ ์์ ๊ฒฐ๊ณผ
['์ค๋', '๋ ์จ', '๊ตฌ๋ฆ']
{'์ค๋':0, '๋ ์จ':1, '๊ตฌ๋ฆ':2}
[[1.0.0.]
[0.1.0.]
[0.0.1.]]
- ์-ํซ ์ธ์ฝ๋ฉ ํน์ง
1. ๊ฐ๋จํ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋นํด ์ข์ ์ฑ๋ฅ์ ๊ฐ์ง๊ณ ์์ด ๋ง์ ์ฌ๋์ด ์ฌ์ฉ์ค
2. ๋จ์ํ ๋จ์ด์ ์์์ ์ํ ์ธ๋ฑ์ค๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฝ๋ฉ๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋จ์ด์ ์๋ฏธ๋ ์ ์ฌํ ๋จ์ด์์ ๊ด๊ณ๋ฅผ ๋ด๊ณ ์์ง ์์
3. ๋จ์ด ์ฌ์ ์ ํฌ๊ธฐ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์-ํซ ๋ฒกํฐ์ ์ฐจ์๋ ์ปค์ง๊ฒ ๋๋๋ฐ, ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ ๊ณ์ฐ์ ๋ณต์ก๋๊ฐ ์ปค์ง
: ๋๋ถ๋ถ ์์๊ฐ 0์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๋นํจ์จ์
4.2.2 ํฌ์ ํํ๊ณผ ๋ถ์ฐ ํํ
- ํฌ์ ํํ์ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ์ฐจ์์ด ๋ ๋ฆฝ์ ์ธ ์ ๋ณด๋ฅผ ์ง๋๊ณ ์์ด ์ฌ๋์ด ์ดํดํ๊ธฐ์ ์ง๊ด์ ์ธ ์ฅ์ ↔ ๋จ์ด ์ฌ์ ์ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น์ ๊ณ์ฐ ๋ณต์ก๋๊ฐ ์ปค์ง๋ ๋จ์ + ๋จ์ด ๊ฐ์ ์ฐ๊ด์ฑ์ด ์ ํ ์์ด ์๋ฏธ๋ฅผ ๋ด์ ์ ์์
- ์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ํ๊ธฐ ์ํด์๋? ๊ธฐ๋ณธ ํ ํฐ์ด ๋๋ ๋จ์ด์ ์๋ฏธ์ ์ฃผ๋ณ ๋จ์ด ๊ฐ์ ๊ด๊ณ๊ฐ ๋จ์ด ์๋ฒ ๋ฉ์ ํํ๋์ด์ผ ํจ
→ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ ๋จ์ด ๊ฐ์ ์ ์ฌ์ฑ์ ์ ํํํ๋ฉด์๋ ๋ฒกํฐ ๊ณต๊ฐ์ ์ ์ฝํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ์ : ๋ถ์ฐ ํํ distributed representation
- ๋ถ์ฐํํ
ํ๋์ ์ฐจ์์ ๋ค์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์.
๋ฐ์ดํฐ ์์ค์ ์ต์ํํ๋ฉด์ ๋ฒกํฐ ์ฐจ์์ด ์์ถ๋๋ ํจ๊ณผ
์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ฐจ์์ ๋ฐ์ดํฐ๋ฅผ ์ต๋ํ ๋ฐ์ง์ํฌ ์ ์์ด ๋ฐ์ง ํํ dense representation ์ด๋ผ ๋ถ๋ฅด๊ธฐ๋ ํจ.
(๋ฐ์ง ํํ์ผ๋ก ๋ง๋ค์ด์ง ๋ฒกํฐ๋ฅผ ๋ฐ์ง ๋ฒกํฐ dense vector ๋ผ๊ณ ํจ)
- ๋ถ์ฐ ํํ์ ์ฅ์
1. ์๋ฒ ๋ฉ ๋ฒกํฐ์ ์ฐจ์์ ๋ฐ์ดํฐ ์์ค์ ์ต์ํํ๋ฉด์ ์์ถํ ์ ์์. : ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ฐจ์์ด ๋๋ฌด ๋์์ง๋ฉด ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ํ์ต์ด ์ด๋ ค์์ง๋ ์ฐจ์์ ์ ์ฃผ curse of dimensionality ๋ฌธ์ ๊ฐ ๋ฐ์ํจ
2. ์๋ฒ ๋ฉ ๋ฒกํฐ์๋ ๋จ์ด์ ์๋ฏธ, ์ฃผ๋ณ ๋จ์ด ๊ฐ์ ๊ด๊ณ ๋ฑ ๋ง์ ์ ๋ณด๊ฐ ๋ดํฌ๋์ด ์์ด ์ผ๋ฐํ ๋ฅ๋ ฅ์ด ๋ฐ์ด๋จ.
4.2.3 Word2Vec
" ์-ํซ ์ธ์ฝ๋ฉ์ ๊ฒฝ์ฐ ๊ตฌํ์ ๊ฐ๋จํ์ง๋ง, ์ฑ๋ด์ ๊ฒฝ์ฐ ๋ง์ ๋จ์ด๋ฅผ ์ฒ๋ฆฌํ๋ฉด์ ๋จ์ด ๊ฐ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ ์ ์์ด์ผ ์ข์ ์ฑ๋ฅ์ด ๋์ค๋๋ฐ.. ์-ํซ ์ธ์ฝ๋ฉ์ ์ด๊ฑธ ๋ชป ํ๋ค๋ ๋จ์ ์ด ์๋ค."
" ๋ฐ๋ผ์ ๋ถ์ฐ ํํ ํํ ๋จ์ด ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉํ ๊ฑด๋ฐ.. ์ ๊ฒฝ๋ง ๊ธฐ๋ฐ ๋จ์ด ์๋ฒ ๋ฉ์ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ธ Word2Vec ๋ชจ๋ธ์ ์์๋ณด์"
Word2Vec
- 2013๋ ๊ตฌ๊ธ์์ ๋ฐํํ์ผ๋ฉฐ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ ๋จ์ด ์๋ฒ ๋ฉ ๋ชจ๋ธ
- ๊ธฐ์กด ์ ๊ฒฝ๋ง ๊ธฐ๋ฐ์ ๋จ์ด ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ๋นํด ๊ตฌ์กฐ์ ์ฐจ์ด๋ ํฌ๊ฒ ์์ง๋ง ๊ณ์ฐ๋์ ํ๊ธฐ์ ์ผ๋ก ์ค์ฌ ๋น ๋ฅธ ํ์ต์ ๊ฐ๋ฅํ๊ฒ ํ๋ค!
- CBOW continuous bag-of-words ์ skip-gram ๋ ๊ฐ์ง ๋ชจ๋ธ๋ก ์ ์
CBOW ๋ชจ๋ธ
- ๋งฅ๋ฝ์ด๋ผ ํํ๋๋ ์ฃผ๋ณ ๋จ์ด๋ค์ ์ด์ฉํด ํ๊น ๋จ์ด๋ฅผ ์์ธกํ๋ ์ ๊ฒฝ๋ง ๋ชจ๋ธ
- ์ ๊ฒฝ๋ง์ ์ ๋ ฅ์ ์ฃผ๋ณ ๋จ์ด๋ค๋ก ๊ตฌ์ฑํ๊ณ ์ถ๋ ฅ์ ํ๊น ๋จ์ด๋ก ์ค์ ํด ํ์ต๋ ๊ฐ์ค์น ๋ฐ์ดํฐ๋ฅผ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ก ํ์ฉ
- ํ๊น ๋จ์ด์ ์์ค๋ง ๊ณ์ฐํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ํ์ต ์๋๊ฐ ๋น ๋ฅธ ์ฅ์
skip-gram ๋ชจ๋ธ
- CBOW ๋ชจ๋ธ๊ณผ ๋ฐ๋๋ก ํ๋์ ํ๊น ๋จ์ด๋ฅผ ์ด์ฉํด ์ฃผ๋ณ ๋จ์ด๋ค์ ์์ธกํ๋ ์ ๊ฒฝ๋ง ๋ชจ๋ธ
- ์ ์ถ๋ ฅ์ด CBOW ๋ชจ๋ธ๊ณผ ๋ฐ๋์ฌ์ ์์ธกํด์ผํ๋ ๋งฅ๋ฝ์ด ๋ ๋ง์์ง : ๋จ์ด ๋ถ์ฐ ํํ๋ ฅ์ด ์ฐ์ํด CBOW ๋ชจ๋ธ์ ๋นํด ์๋ฒ ๋ฉ ํ์ง์ด ์ฐ์
- Word2Vec ๋ชจ๋ธ ํ์ต ์์
from gensim.models import Word2Vec
from konlpy.tag import Komoran
import time
# ๋ค์ด๋ฒ ์ํ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ์ฝ์ด์ด
def read_review_data(filename):
with open(filename, 'r') as f:
data = [line.split('\t') for line in f.read().splitlines()]
data = data[1:] # ํค๋ ์ ๊ฑฐ
return data
# ํ์ต ์๊ฐ ์ธก์ ์์
start = time.time()
# ๋ฆฌ๋ทฐ ํ์ผ ์ฝ์ด์ค๊ธฐ
print('1) ๋ง๋ญ์น ๋ฐ์ดํฐ ์ฝ๊ธฐ ์์')
review_data = read_review_data('./ratings.txt')
print(len(review_data)) # ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ์ ์ฒด ๊ฐ์
print('1) ๋ง๋ญ์น ๋ฐ์ดํฐ ์ฝ๊ธฐ ์๋ฃ : ', time.time() - start)
# ๋ฌธ์ฅ ๋จ์๋ก ๋ช
์ฌ๋ง ์ถ์ถํด ํ์ต ์
๋ ฅ ๋ฐ์ดํฐ๋ก ๋ง๋ฆ
print('2) ํํ์์์ ๋ช
์ฌ๋ง ์ถ์ถ ์์')
komoran = Komoran()
docs = [komoran.nouns(sentence[1]) for sentense in review_data]
print('2) ํํ์์์ ๋ช
์ฌ๋ง ์ถ์ถ ์๋ฃ : ', time.time() - start)
# Word2Vec ๋ชจ๋ธ ํ์ต
print('3) Word2Vec ๋ชจ๋ธ ํ์ต ์์')
komoran = Komoran()
docs = [komoran.nouns(sentence[1]) for sentense in review_data]
print('3) Word2Vec ๋ชจ๋ธ ํ์ต ์๋ฃ : ', time.time() - start)
# ๋ชจ๋ธ ์ ์ฅ
print('4) ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ์์')
model.save('nvml.model')
print('4) ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ์๋ฃ : ', time.time() - start)
# ํ์ต๋ ๋ง๋ญ์น ์, ์ฝํผ์ค ๋ด ์ ์ฒด ๋จ์ด ์
print("corpus_count : ", model.corpus_count)
print("courpus_total_words : ", model.corpus_total_words)