๋ค์ํ ๊ธฐ์ ์์ ๋ฏธ๋ฆฌ ํ๋ จ๋ ๋จ์ด ๋ฒกํฐ ๋ชจํ์ ๊ณต๊ฐํ๋ค. ๊ทธ์ค genism์ด ๊ฐ์ฅ ์ธ๊ธฐ๊ฐ ์๋ค.
NLPIA ํจํค์ง๋ฅผ ํตํด ์ค์ต
from nlpia.data.loaders import get_data
word_vectors = get_data('word2vec')
gensim.models.utils_any2vec:loaded (3000000, 300) matrix load
์ดํ๊ฐ ์์ผ๋ฉด ๋จ์ด ๋ฒกํฐ ๋ชจํ์ ์๋ ฅ๋ ๊ทธ๋งํผ ์ค์ด๋ ๋ค. ํด๋น ๋จ์ด ๋ฒกํฐ๊ฐ ์กด์ฌํ์ง ์๋ ๋จ์ด๋ค์ ํฌํจํ ๋ฌธ์์ ๋ํด์๋ NLP ํ์ดํ๋ผ์ธ์ด ์ข์ ์ฑ๊ณผ๋ฅผ ๋ด์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ๋จ์ด ๋ฒกํฐ ๋ชจํ์ ํฌ๊ธฐ๋ ๊ฐ๋ฐ ๋์ค์๋ง ์ ํํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
genism.KeyedVectors.most_similar() ๋ฉ์๋๋ ์ฃผ์ด์ง ๋จ์ด ๋ฒกํฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋จ์ด ๋ฒกํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฐพ์์ค๋ค. ํค์๋ ์ธ์์ positive์ ๋จ์ด๋ค์ ๋ชฉ๋ก์ ์ง์ ํ๋ฉด ์ด ๋ฉ์๋๋ ํด๋น ๋จ์ด ๋ฒกํฐ๋ค์ ๋ํ ๊ฒ์ ํด๋นํ๋ ๋จ์ด ๋ฒกํฐ๋ค์ ์ฐพ๋๋ค. ๋จ์ด ๋ฒกํฐ๋ฅผ ๋นผ๋ ค๋ฉด negative์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. topn ์ธ์๋ ๋ฉ์๋๊ฐ ๋๋ ค์ค ๊ฒฐ๊ณผ์ ๊ฐ์๋ฅผ ์ง์ ํ๋ค.
์ ํต์ ์ธ ์ ์์ด ์ฌ์ ๋ค๊ณผ ๋ฌ๋ฆฌ word2vec์ ์ ์์ด ๊ด๊ณ๋ฅผ ๋ ๋จ์ด ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ปํ๋ ํ๋์ ์ฐ์๊ฐ์ผ๋ก ์ ์ํ๋ค. ์ด๋ word2vec ์์ฒด๊ฐ ํ๋์ ์ฐ์ ๋ฒกํฐ ๊ณต๊ฐ ๋ชจํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
word_vectors.most_similar(positive=['cooking','potatoes'],topn=5)
# [('cook', 0.6973530054092407),
# ('oven_roasting', 0.6754531860351562),
# ('Slow_cooker', 0.6742031574249268),
# ('sweet_potatoes', 0.6600279808044434),
# ('stir_fry_vegetables', 0.6548758745193481)]
genism ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌด๊ดํ ๋จ์ด๋ค์ ์ฐพ์์ฃผ๋ doesnt_match() ๋ฉ์๋๋ ์๋ค. 4๊ฐ์ ๋จ์ด๋ค๊ณผ ๋น๊ตํด ๊ฐ์ฅ ์ ์๊ฐ ๋ฎ์ computer๊ฐ ๋ฌด๊ดํ ๋จ์ด๋ค๋ก ๋์จ๋ค.
word_vectors.doesnt_match("potatoes milk cake computer".split())
# 'computer'
king + woman - man = ?
word_vectors.most_similar(positive=['king','woman'],negative=['man'],topn=2)
# [('queen', 0.7118192911148071), ('monarch', 0.6189674139022827)]
word_vectors.similarity('princess','queen')
# 0.7070532
word_vectors['phone']
word_vectors['phone'].shape
# (300,)
๊ฐ๋ณ ๋จ์ด๋ 1X300 ์ฐจ์์ numpy ํ ๋ฒกํฐ์ด๋ค. ๋จ์ด ๋ฒกํฐ๋ฅผ ๊ตฌ์ฑํ๋ ์ด ์๋ง์ ์ฑ๋ถ๋ค์ ์๋ฏธ๋ฅผ ํ์ ํ๋ ๊ฒ์ ์ด๋ ต์ง๋ง, ์ด ์์น๋ค์ ์ผ์ฐจ ๊ฒฐํฉ์ ํตํด ๋์์ด๋ฅผ ์ฐพ์ ์ ์๋ค.
๋๋ง์ ๋จ์ด ๋ฒกํฐ ๋ชจํ ๋ง๋ค๊ธฐ
genism ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ ์์ญ ํนํ word2vec ๋ชจํ์ ํ๋ จํ๊ธฐ ์ ์ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ด ํ์ํ๋ค.
์ ์ฒ๋ฆฌ ๋จ๊ณ
ํ์ํ ๊ฒ์ ๋ง๋ญ์น์ ๋ฌธ์๋ค์ ๋ฌธ์ฅ๋ค๋ก ๋ถํดํ๊ณ ๋ฌธ์ฅ๋ค์ ํ ํฐ๋ค๋ก ๋ถํดํ๋ ๊ฒ์ด๋ค. genism์ word2vec ๋ชจํ์ ๊ฐ ๋ฌธ์ฅ์ด ํ ํฐ๋ค์ ๋ชฉ๋ก์ธ ๋ฌธ์ฅ ๋ชฉ๋ก์ด ํ์ํ๋ค.
from gensim.models.word2vec import Word2Vec
num_features = 300 # ๋จ์ด ๋ฒกํฐ ์ฐจ์ ์
min_word_count = 3 # word2vec๋ชจํ์ ํฌํจ ์ํฌ ๋จ์ด์ ์ต์๋น๋ ๋ง๋ญ์น๊ฐ ์๋ค๋ฉด ์ต์๋น๋๋ฅผ ๋ ์ค์ด๊ณ ํฌ๋ค๋ฉด ๋ ํค์ด๋ค
num_workers = 2 # ํ๋ จ์ ์ฌ์ฉํญ cpu ์ฝ์ด ์, ์ฃผ์ด์ง ์์คํ
์ ์ฝ์ด์ ๋ง๊ฒ multiprocessing ๋ชจ๋์ ์ ์ ํ๋ค.
window_size = 6 # ๋ฌธ๋งฅ ๊ตฌ๊ฐ์ ํฌ๊ธฐ
subsampling = 1e-3 # ๊ณ ๋น๋ ์ฉ์ด๋ฅผ ์ํ ๋ถํ์ง ๋ฌธํฑ๊ฐ
model = Word2Vec(
token_list,
workers=num_workers,
size=num_features,
min_count=min_word_count,
window=window_size,
sample=subsampling
)
init_sims๋ฅผ ํตํด ๋ชจํ์ ๋๊ฒฐ(=grad_zero) ํ ์๋์ธต์ ๊ฐ์ค์น๋ฅผ ์ ์ฅํ๊ณ ๋จ์ด ๊ณต๋ ์ถํ ํ๋ฅ ๋ค์ ์์ธกํ๋ ์ถ๋ ฅ ๊ฐ์ค์น๋ ํ๊ธฐํ๋ค. ์ด๋ ๊ฒ ํ๊ธฐํ ๋ชจํ์ ๋ค์์ ๋ค์ train ํ ์ ์๋ค.
model.init_sims(replace=True)
model_name = "my_domain_specific_word2vec_model"
model.save(model_name)
'๐ฃ๏ธ Natural Language Processing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Word2vec Vs GloVe (0) | 2021.03.08 |
---|---|
BERT (Deep Bidirectional Transformers for Language Understanding) (0) | 2021.03.03 |
[Word2Vec] ๊ณ์ฐ (0) | 2021.03.01 |
[Word2Vec] ์ฐ์ ๋จ์ด ๋ชจ์ (0) | 2021.03.01 |
[Word2Vec] ์คํต๊ทธ๋จ ์ ๊ทผ ๋ฐฉ์ (0) | 2021.02.28 |