Word2Vec #3, 모델 활용(사용)하기

    Word2Vec로 구현할 수 있는 서비스는 무궁무진하다. 분류, 연관키워드와 같은 직접적인 서비스를 구현할 수도 있으며 최종 서비스를 위한 전처리 과정에서도 활용될 수 있다.

     

    참고로 이 포스팅은 이전에 작성한 Word2Vec #2, 기본적인 모델 구현(생성)하기에서 만든 모델을 기반으로 설명이 이어진다.

     

    Word2Vec 사용하기

     

    Word2Vec Source Code

    from gensim.models import Word2Vec
    
    model_okt = Word2Vec.load('word2vec_okt.model')

     

    코모란 버전과 Okt 버전 모두 모델을 만들었지만, 이번 포스팅에서는 Okt 버전만 사용해보도록 한다.

     

     

    # 단어 벡터 확인
    print('영웅 : ', model_okt.wv['영웅'])

    벡터가 잘 뽑혔는지 확인하기 위해서 모델에서 wv라는 메소드를 호출하고 인자값으로 "영웅"이라는 단어를 넣어봤다. 

     

    영웅 : [-9.53578353e-02 -2.38286689e-01 -2.57303745e-01 6.12352937e-02 -3.98829520e-01 2.59928912e-01 -6.59594610e-02 2.58342952e-01 -2.87664890e-01 5.45273721e-01 -1.14477970e-01 -5.58262765e-02 1.33680895e-01 1.54101595e-01 -3.60306919e-01 -1.90171793e-01 -3.85400988e-02 -2.14818522e-01 -2.85072625e-01 3.57092917e-01 -1.61479399e-01 5.00444882e-02 2.78616369e-01
    ...
    1.45796776e-01 1.18690366e-02 -1.82599530e-01 -3.17415744e-01 -1.80878565e-01 6.18982539e-02 3.90249848e-01 -2.79767543e-01 1.97384372e-01 1.26737103e-01 4.66748685e-01 -4.37544495e-01 3.03992122e-01 4.22266394e-01 -8.57910439e-02 5.48166856e-02 9.09721017e-01 -1.40185073e-01 -2.71795690e-01 -1.66658282e-01 1.52720464e-02]

    우리가 알기 힘든 분산 표현 벡터값들로 이루어진 것을 알 수 있다.

     

    단어간 유사도 확인

    # 단어 유사도 확인
    print('영웅, 히어로 -> ', model_okt.wv.similarity(w1='영웅', w2='히어로'))
    print('캡틴아메리카, 아이언맨 -> ', model_okt.wv.similarity(w1='캡틴아메리카', w2='아이언맨'))
    print('배트맨, 아이언맨 -> ', model_okt.wv.similarity(w1='배트맨', w2='아이언맨'))

    우선 코모란 버전의 모델을 이용하여 여러가지 테스트를 진행하였다. 일단 두개의 단어간 유사도를 구해보도록 한다.

     

    영웅, 히어로 -> 0.47277752
    캡틴아메리카, 아이언맨 -> 0.60534054
    배트맨, 아이언맨 -> 0.47893476

    유사도는 1에 가까울수록 유사하며 0에 가까울수록 유사하지 않다고 판단하는데 이와 같이 0.5 정도로 단어들간의 유사성이 어느정도 있다 알 수 있다.

     

    연관 단어 TopN개 출력

    print('마동석->', model_okt.wv.most_similar("마동석", topn=10))
    print('히어로->', model_okt.wv.most_similar("히어로", topn=10))
    print('스타워즈->', model_okt.wv.most_similar("스타워즈", topn=10))
    print('아이언맨->', model_okt.wv.most_similar("아이언맨", topn=10))
    print('배트맨->', model_okt.wv.most_similar("배트맨", topn=10))
    print('우주->', model_okt.wv.most_similar("우주", topn=10))

    두번째로 지정된 단어와 가장 유사하다 생각하는 단어를 10개 선정하여 출력해보았다.

     

    마동석-> [('김래원', 0.6940276026725769), ('승범', 0.6892002820968628), ('박건형', 0.6874715089797974), ('고준희', 0.6846013069152832), ('곽도원', 0.6815499067306519), ('이기광', 0.6812789440155029), ('개새', 0.6773989796638489), ('조보아', 0.6756688952445984), ('재연배우', 0.6754568815231323), ('몬한다', 0.6744173765182495)]

    히어로-> [('피조', 0.6446285247802734), ('크리처', 0.6152229309082031), ('조폭마누라', 0.6012677550315857), ('물의', 0.5922855734825134), ('반칙왕', 0.5906374454498291), ('로맨스코미디', 0.5837960839271545), ('첩보물', 0.5819399952888489), ('러시아워', 0.5796491503715515), ('마블', 0.576407790184021), ('와이어액션', 0.575066864490509)]

    스타워즈-> [('호빗', 0.694210946559906), ('나이트메어', 0.6772298216819763), ('이블', 0.6631914377212524), ('더망작', 0.6508381366729736), ('이블데드', 0.6489325761795044), ('똥칠', 0.6478619575500488), ('레지던트', 0.6455955505371094), ('다크라이', 0.6427701115608215), ('이편', 0.6402461528778076), ('트랜스포터', 0.6381957530975342)]

    아이언맨-> [('조폭마누라', 0.6703446507453918), ('어벤져스', 0.64905846118927), ('트랜스포터', 0.6313374638557434), ('아메리칸파이', 0.6275106072425842), ('이편', 0.6152130961418152), ('후퇴', 0.6092355251312256), ('슈퍼맨', 0.6090192198753357), ('다도', 0.6061230897903442), ('캡틴아메리카', 0.6053405404090881), ('리부트', 0.6026279926300049)]

    배트맨-> [('비긴즈', 0.8039929270744324), ('다크나이트', 0.7107942700386047), ('신용카드', 0.6907522678375244), ('캣우먼', 0.6841399073600769), ('포에버', 0.6464098691940308), ('그린랜턴', 0.6271287202835083), ('라이즈', 0.6031827330589294), ('놀란', 0.5907407402992249), ('슈트', 0.5895997881889343), ('크리스토퍼', 0.5893052220344543)]

    우주-> [('지구', 0.5851208567619324), ('에덴', 0.5672097206115723), ('대자연', 0.5661648511886597), ('인류', 0.5616238117218018), ('해양', 0.5607922077178955), ('발자취', 0.5582533478736877), ('스카이워커', 0.5582015514373779), ('사투', 0.5540465116500854), ('샐러맨더', 0.5467883348464966), ('허블', 0.5454199910163879)]

    몇몇개는 사용하기 힘든 경우도 있지만, 대체로는 이해가 되는 퀄리티를 보여준다. 

     

    첫번째 벡터를 그냥 출력하는 것은 워드임베딩으로서의 워드투벡터의 사용을 의미하며, 2번째 단어간의 유사도나 3번째의 TopN개의 연관 단어의 경우 직접적으로 서비스를 할 수 있을 것이다. 물론 이 수준을 그대로 런칭한다면 이상한 단어가 갑툭튀해서 사용자가 이상하게 느낄테니 전처리 혹은 후처리 과정이 필수겠지만, 그대로 대충 의미가 있는 과정을 진행했으리라 생각한다.

     

     

    연관포스팅

    Word2Vec #1, (개념, CBOW와 Skip-gram)

    Word2Vec #2, 기본적인 모델 구현(생성)하기

     

    댓글

    Designed by JB FACTORY