다양한 기업에서 미리 훈련된 단어 벡터 모형을 공개했다. 그중 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 |