word2vec 들어가며

Minsuk Heo 허민석 유튜브 채널의 [딥러닝 자연어처리] Word2Vec 동영상을 살펴보면 워드2벡(word2vec)의 기본개념을 잡을 수 있다.

  • Chris McCormick (19 Apr 2016), “Word2Vec Tutorial - The Skip-Gram Model”
  • McCormick, C. (2016, April 19). Word2Vec Tutorial - The Skip-Gram Model. Retrieved from http://www.mccormickml.com
In [1]:
from IPython.display import HTML

HTML('<iframe width="300" height="180" src="https://www.youtube.com/embed/sY4YyacSsLc" frameborder="0" allowfullscreen></iframe>')
Out[1]:

환경설정

구글 뉴스 문서(Google News documents)가 가장 유명해서 Mikolov 기학습된 모형을 받아 이를 활용한다. 다운로드 받는 사전학습 모형을 .load_word2vec_format() 메쏘드로 불러읽어들인다. 구글 뉴스 모형은 크기가 1.5GB로 단어가 3백만로 200차원으로 되어 있어 이를 32비트 컴퓨터에서는 열수가 없고 충분한 메모리가 확보되어야 가능하다.

1.5GB 학습된 모형을 불러올 경우 메모리가 적은 컴퓨터의 경우 문제가 될 수 있어 limit=300000 인자를 넣어 다소 정확도는 희생하더라도 빠른 후속 작업이 되도록 설정을 변경시킨다.

In [2]:
from gensim.models.keyedvectors import KeyedVectors
w2vec = KeyedVectors.load_word2vec_format(\
        './model/GoogleNews-vectors-negative300.bin.gz', binary=True, limit=900000)

word2vec 유명한 사례

word2vec의 유명한 사례로 많이 회자되는 king - man + woman 연산을 하게 되면 어떤 결과가 나오는지 직접 데이터를 넣어 확인해보자. 정답은 queen이 나와야 한다.

In [3]:
w2vec.most_similar(positive=['king', 'woman'], negative=['man'], topn=3)
Out[3]:
[('queen', 0.7118192911148071),
 ('monarch', 0.6189674139022827),
 ('princess', 0.5902431607246399)]

유사도

두 단어간의 유사도는 w2vec 객체의 .similarity() 메쏘드를 사용해서 계산해도 된다. 혹은 아래와 같이 numpy를 사용해서 계산해도 된다.

In [4]:
w2vec.similarity('korea', 'japan')
Out[4]:
0.5648358846375967

두 단어간 유사도를 계산하는 방식은 다음 수식에 따라 korea, japna을 넣어주면 유사도를 구할 수 있다.

\begin{equation*} cos(\pmb x, \pmb y) = \frac {\pmb x \cdot \pmb y}{||\pmb x|| \cdot ||\pmb y||} \end{equation*}

In [5]:
import numpy
cosine_similarity = numpy.dot(w2vec['korea'], w2vec['japan'])\
                    /(numpy.linalg.norm(w2vec['korea']) * \
                      numpy.linalg.norm(w2vec['japan']))
cosine_similarity
Out[5]:
0.56483585

word2vec 활용사례

chef와 유사한 단어 5개를 뽑아보자. chef는 우리가 친숙한 요리관련 요리사를 지칭할 수도 있지만, DevOps에서 소프트웨어를 지칭할 수도 있다. negative를 사용하게 되면 food관련 내용을 제외하고 관련 유사성이 높은 단어를 추출하는 것도 가능하다.

In [6]:
w2vec.most_similar(positive=['chef'], topn=5)
Out[6]:
[('Chef', 0.823263943195343),
 ('pastry_chef', 0.7945826053619385),
 ('sous_chef', 0.793190598487854),
 ('chefs', 0.7798833250999451),
 ('Executive_Chef', 0.7338546514511108)]
In [7]:
w2vec.most_similar(positive=['chef', 'software'], negative=['food'], topn=5)
Out[7]:
[('Software', 0.48984354734420776),
 ('iLife_iWork', 0.47542810440063477),
 ('programmer', 0.4731772243976593),
 ('Qlusters', 0.4657154083251953),
 ('Pramati', 0.46331697702407837)]

word2vec 경쟁자들

구글에서 Tomas Mikolov와 동료들이 word2vec을 만들어 논문도 내고 훈련된 모형도 공개하는 동안 스탠포드대학 Jeffrey Pennington은 역전파(backpropagation)을 학습 알고리즘으로 사용하는 word2vec의 단점을 극복할 수 있는 GloVe(Global Vectors)를 출시하였다. SVD를 근간으로 하고 있으 역전파 알고리즘과 비교하여 성능이 대폭 향상되었다. 페이스북도 fastText를 내놓으면서 인접 단어 대신 n-문자를 예측하는 것으로 바꿔 오탈자에 강건하면서, 영어뿐만 아니라 294개 언어로 학습된 모형을 내놓았다.

따라서, 공부는 word2vec, 특정 영역에 활용될 word2vec 모형개발에는 GloVe를 다국어에는 fastText가 각자 장점을 내세우면서 가축을 벌이고 있다.

fastText

fastText 웹사이트 Download → Word vectors for 157 languages에서 학습된 모형을 불러와서 특정 한글에 대해 유사 단어를 확인하는 것이 가능하다. 크기가 4.2GB라고 나옵니다.

In [8]:
from gensim.models.fasttext import FastText

#fb_fastText = FastText.load_fasttext_format(model_file="")
#fb_fastText.most_similar('soccer')

추천시스템

word2vec 혹은 doc2vec을 사용하여 상품/서비스/문서 추천시스템을 구축하는 것도 가능하다.