ML&DL

임베딩 - FastText

joyHong 2020. 8. 13. 01:17

임베딩 기법 중 하나인 Word2Vec을 활용하여 특정 코퍼스를 임베딩해보았다.

그리고 Word2Vec 결과에 유사도 상위 단어 목록을 체크도 해보았는데

간혹 단어를 입력하다보면 어휘에 없는 단어라는 메세지가 나오는 경우가 있다.

이는 코퍼스에 포함되어 있지 않은 단어이기 때문에 임베딩 값이 없다.

하지만 FastText는 각 단어를 문자 단위 n-gram으로 표현하기 때문에 이러한 부분을 어느 정도 커버할 수 있다.

이번 예에서는 gensim에서 제공하는 fasttext를 활용하여 임베딩하는 과정을 기록한다.

 

코드

from gensim.models import FastText
from tqdm import tqdm


corpus_fname = 'D:/Data/embedding/data/tokenized/corpus_mecab.txt'
model_fname = 'D:/Data/embedding/data/word-embeddings/fasttext/fasttext'


print('corpus 생성')
corpus = [sent.strip().split(" ") for sent in tqdm(open(corpus_fname, 'r', encoding='utf-8').readlines())]

print("학습 중")
model = FastText(corpus, size=100, workers=4, sg=1, iter=6, word_ngrams=1)
model.save(model_fname)

# https://projector.tensorflow.org/ 에서 시각화 하기 위해 모델을 따로 저장
model.wv.save_word2vec_format(model_fname + "_vis")
print('완료')

 

Word2Vec과 사실 크게 다를 바 없다.

 

큰 차이는 학습을 위해 FastText() 클래스를 사용한다는 점이다.

 

실행이 완료되면 결과를 확인해 보도록 한다.

 

코드

from gensim.models import FastText


# 모델을 로딩하여 가장 유사한 단어를 출력
loaded_model = FastText.load("D:/Data/embedding/data/word-embeddings/fasttext/fasttext")
print(loaded_model.wv.vectors.shape)

print(loaded_model.wv.most_similar("최민식", topn=5))
print(loaded_model.wv.most_similar("남대문", topn=5))
print(loaded_model.wv.similarity("헐크", '아이언맨'))
print(loaded_model.wv.most_similar(positive=['어벤져스', '아이언맨'], negative=['스파이더맨'], topn=1))

 

실행 결과

그럼 이번에는 어휘에 없는 단어인 "춥맨식", "님대문"을 입력해 보았다.

 

실행 결과

임베딩이 문자 단위 n-gram 벡터의 합으로 표현되기 때문에 어휘에 없는 단어에 대해서도 어느 정도 추정하여 결과를 내놓는다.

 

임베딩 프로젝터에 시각화를 해보고 싶으면 

학습 후 저장한 별도의 모델 파일을 

[[[model.wv.save_word2vec_format(model_fname + "_vis")  로 저장한 것]]]

python -m gensim.scripts.word2vec2tensor --input fasttext_vis --output fasttext_vis

터미널에서 실행하여 2개의 tsv를 생성하면 된다.

* fasttext_vis 파일의 경로 주의