-
한국어 뉴스 데이터로 딥러닝 시작하기 - 4. doc2vec 모델 훈련하기프로그래밍/자연어처리 2017. 3. 3. 13:42728x90반응형
한국어 뉴스 데이터로 딥러닝 시작하기
4. doc2vec 모델 훈련하기
word2vec이나 doc2vec을 사용하기 위해서는 gensim 패키지를 설치해야한다.
gensim은 topic modeling 관련 corpus 및 알고리즘들이 포함되어 있는 파이썬 패키지이다.
아래 gensim 설치 페이지를 참고해서 gensim을 설치하자.
아래는 doc2vec 관련 사이트들이다.
특히 doc2vec 사용 예제 스크립트는 정말 유용하니 doc2vec 사용시 참고하면 좋을 것이다.
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-gensim728x90반응형'프로그래밍 > 자연어처리' 카테고리의 다른 글
weka 메모리 사이즈 증가하기 ( Java heap space 오류 관련) (0) 2017.04.02 자연어처리 오픈소스 프로젝트 시작하기 (0) 2017.03.10 word2vec/doc2vec 언어별 데모 사이트 모음 (2) 2017.03.03 mecab에 사용자사전/기분석 추가하기 (1) 2017.02.20 sklearn CountVectorizer 클래스 사용법 (0) 2017.02.09