ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 한국어 뉴스 데이터로 딥러닝 시작하기 - 4. doc2vec 모델 훈련하기
    프로그래밍/자연어처리 2017. 3. 3. 13:42
    반응형





    한국어 뉴스 데이터로 딥러닝 시작하기 



    4. doc2vec 모델 훈련하기 



    1. 한국어 위키 덤프 다운로드 받기 바로가기  

    2. 위키 덤프 데이터 파싱하기 바로가기

    3. 위키 데이터 한국어 형태소 태깅하기 바로가기




    word2vec이나 doc2vec을 사용하기 위해서는 gensim 패키지를 설치해야한다. 

    gensim은 topic modeling 관련 corpus 및 알고리즘들이 포함되어 있는 파이썬 패키지이다. 



    아래 gensim 설치 페이지를 참고해서 gensim을 설치하자. 


    gensim 설치 페이지 바로가기 



    아래는 doc2vec 관련 사이트들이다. 

    특히 doc2vec 사용 예제 스크립트는 정말 유용하니 doc2vec 사용시 참고하면 좋을 것이다. 


    doc2vec API 

     https://radimrehurek.com/gensim/models/doc2vec.html


    doc2vec github

     https://github.com/RaRe-Technologies/gensim/tree/develop/gensim/models


     https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-IMDB.ipynb



    아래는 doc2vec model 훈련 스크립트이다.  




    #-*- coding: utf-8 -*-


    from gensim.models import doc2vec

    import sys

    import multiprocessing



    reload(sys)

    sys.setdefaultencoding('utf-8')


    cores = multiprocessing.cpu_count()


    #doc2vec parameters

    vector_size = 300

    window_size = 15

    word_min_count = 2

    sampling_threshold = 1e-5

    negative_size = 5

    train_epoch = 100

    dm = 1 #0 = dbow; 1 = dmpv

    worker_count = cores #number of parallel processes


    print len(sys.argv)

    if len(sys.argv) >= 3:

    inputfile = sys.argv[1]

    modelfile = sys.argv[2]

    else:

    inputfile = "./data/sample.txt"

    modelfile = "./model/doc2vec.model"


    word2vec_file = modelfile + ".word2vec_format"


    sentences=doc2vec.TaggedLineDocument(inputfile)

    #build voca 

    doc_vectorizer = doc2vec.Doc2Vec(min_count=word_min_count, size=vector_size, alpha=0.025, min_alpha=0.025, seed=1234, workers=worker_count)

    doc_vectorizer.build_vocab(sentences)


    # Train document vectors!

    for epoch in range(10):

    doc_vectorizer.train(sentences)

    doc_vectorizer.alpha -= 0.002 # decrease the learning rate

    doc_vectorizer.min_alpha = doc_vectorizer.alpha # fix the learning rate, no decay


    # To save

    doc_vectorizer.save(modelfile)

    doc_vectorizer.save_word2vec_format(word2vec_file, binary=False)






    생성한 모델 파일을 로딩해서 간단하게 테스트를 해보자. 




    >>> import gensim
    >>> import sys
    >>> reload(sys)
    <module 'sys' (built-in)>
    >>> sys.setdefaultencoding('utf-8')

    >>> model = gensim.models.Doc2Vec.load("/home/wiki/stock/model/wiki_pos_tokenizer_without_taginfo.model")


    >>> pprint(model.most_similar(u'정조', topn=20))
    [(영조, 0.7687888741493225),
     (세조, 0.7312556505203247),
     (성종, 0.7187798023223877),
     (선조, 0.6738545894622803),
     (고종, 0.6698656678199768),
     (명종, 0.668306827545166),
     (숙종, 0.6636559367179871),
     (순조, 0.6635199189186096),
     (중종, 0.6620699167251587),
     (철종, 0.6494218707084656),
     (현종, 0.6376042366027832),
     (공민왕, 0.6369210481643677),
     (충렬왕, 0.6366174817085266),
     (헌종, 0.6334968209266663),
     (효종, 0.6176850199699402),
     (게이초, 0.6152774095535278),
     (인조, 0.611142635345459),
     (겐로쿠, 0.6079166531562805),
     (광해군, 0.6072803139686584),
     (태종, 0.6041624546051025)]





    결과는 그럴듯하다. 
    다음은 그 유명한 왕 - 남자 + 여자 = 여왕 이 제대로 나오나 확인해보겠다. 


    v(KING) – v(MAN) + v(WOMAN) = v(QUEEN) 







    >>> pprint(model.most_similar(positive=[u'여자', u'왕'], negative=[u'남자']))
    [(추기경, 0.45528921484947205),
     (동상, 0.451805979013443),
     (방언, 0.44704046845436096),
     (국왕, 0.4468614459037781),
     (성품, 0.44469308853149414),
     (패러다임, 0.43862420320510864),
     (총독, 0.4380437433719635),
     (도장, 0.43768829107284546),
     (연합군, 0.4367105960845947),
     (감독, 0.42979687452316284)]




    여왕이라고 딱 나와주면 좋을 것 같은데 나오지 않았다 -_-!

    혹시 해서 vector를 1000개로 테스트하니 그제서야 여왕이 결과에 포함되었다. 
    당연한 이야기겠지만 벡터의 개수가 생성된 벡터 스페이스의 결과에 영향을 주는것을 확인하였다 -_-!



    >>> pprint(model.most_similar(positive=[u'여자', u'왕'], negative=[u'남자']))
    [(국왕, 0.34298175573349),
     (왕인, 0.2681395709514618),
     (초등, 0.2596897780895233),
     (여왕, 0.2578367292881012),
     (성당, 0.23974566161632538),
     (군, 0.23846948146820068),
     (의원, 0.23629550635814667),
     (출신, 0.233859583735466),
     (감독, 0.2312195748090744),
     (도서관, 0.23090218007564545)]











    참고로 위 코드들 및 기훈련된 doc2vec model 파일들은 아래 github에 올려두었다. 
    앞으로 진행되는 다른 연재 자료들도 계속 추가할 예정이니 필요하신 분은 watch를 걸어주셍 : ) 


     https://github.com/roboreport/doc2vec-api/










    참고: http://textminingonline.com/training-word2vec-model-on-english-wikipedia-by-gensim


    728x90
    반응형
Designed by Tistory.