word2vec 사용해서 한 단어와 연관된 단어들 찾아보기

2018. 5. 17. 06:55Python-이론/python-인공지능

word2vec를 사용해서 단어를 벡터 데이터로 나타내기



사람들은 단어를 사용할 때 이 단어가 어느 의미를 뜻하고 어느 단어들과 비슷하다는 것을 당연히 느낄 수 있습니다. 하지만 컴퓨터는 어떻게 느낄까요???? 우리 컴퓨터는 0과 1밖에 모르는데 ㅠㅠ 그래서 단어들에게 벡터값을 주어 이단어와 다른 단어가 얼마나 가깝고 연관되어 있는지 값을 나타낼 수 있습니다. 하지만 이렇게 어려운걸 어떻게 만들어내냐구요?? 당연히 모듈로 만들어져있습니다. 지금부터 이 모듈을 다운받아 보겠습니다.


gensim Download


pip3 install gensim 을 통해서 다운받을 수 있습니다.




그럼 이전 글의 토지데이터를 사용해서 예제를 실행시켜 보겠습니다.



from konlpy.tag import Twitter
from gensim.models import word2vec
from bs4 import BeautifulSoup
import codecs


fp = codecs.open('toji.txt','r',encoding = 'utf-16')
twitter = Twitter()
bsData = BeautifulSoup(fp,'html.parser')
body = bsData.select_one('body > text')
lines = body.getText()
lines = lines.split('\n')
twitter = Twitter()
result = []
for line in lines:
    r = []
    words = twitter.pos(line,norm=True)
    for word in words:
        if word[1] not in ["Punctuation","Eomi","Josa"]:
            r.append(word[0])
    result.append(" ".join(r).strip())

fileName = "toji.wakati"

with open(fileName,'w') as fp:
    fp.write("\n".join(result))

data = word2vec.LineSentence(fileName)
model = word2vec.Word2Vec(data,
        size=200,window=10,hs=1,min_count=2,sg=1)
# size -> 200차원백터로 바꾸어주라
# window -> 주면 단어는 앞뒤로 10개
# min_count -> 출현 빈도는 2개 미만은 제외하라
# sg -> 분석 방법론은 CBOW와 Skip-Gram 둘중 후자를 선택해라
# hs -> hs가 1이면 softmax를 트레이닝할때 사용  0이면 0이 아닌경우 음수로 샘플링됩니다.
model.save("toji.model")



이렇게 model을 생성해준다. 모델 생성 후 참조 해줄 때


from gensim.models import word2vec

model = word2vec.Word2Vec.load('toji.model')
things = model.most_similar(positive["집"])
print(things) 



이런식으로 사용해주면 소설속의 집과 관련되 단어를 알아볼 수 있다.