minhui study

Word2Vec으로 문장을 벡터로 변환하기 본문

Python/챗봇

Word2Vec으로 문장을 벡터로 변환하기

minhui 2020. 7. 18. 14:03

Word2Vec

문장 내부의 단어를 벡터로 변환하는 도구이다. 단어의 연결을 기반으로 단어의 연관성을 벡터로 만들어준다. 즉, 단어를 벡터로 표현해주는 것이다. 이를 활용하면 단어의 의미를 파악할 수 있다.

 

단어를 벡터로 만들면 단어와 단어의 유사도를 쉽게 확인할 수 있다. 

다음 그림은 Word2Vec으로 글을 읽게 하고 단어를 2차원 그래프에 그린 것이다. 그림을 보면 "아버지"와 "어머니"는 "사랑"과 가깝고 "인생"과 "개", "고양이"는 멀리 있다는 것을 알 수 있다.

 

Word2Vec을 이용하면 의미를 선형으로 계산할 수 있는데 예를 들어 "아빠 - 남자 + 여자" 라는 계산을 하면 "엄마"가 나온다.

 

Gensim의 Word2Vec으로 "토지"를 읽어오기

다음은 konlpy의 Okt 형태소 분석기로 형태소를 나누고, Word2Vec으로 읽어 들이는 예제이다.

 

<word2vec.py>

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

#utf-16 인코딩으로 파일을 열고 글자를 출력하기 -- (1)
fp = codecs.open("BEXX0014.txt", "r", encoding="utf-16")
soup = BeautifulSoup(fp, "html.parser")
text = soup.select_one('body').text

#텍스트를 한 줄 씩 처리하기 -- (2)
okt=Okt()
results=[]
lines=text.split("\n")
for line in lines:
    #형태소 분석하기 -- (3)
    #단어의 기본형 사용
    malist = okt.pos(line, norm=True, stem=True)
    r = []
    for word in malist:
        if not word[1] in ["Josa", "Eomi", "Punctuation"]:
            r.append(word[0])
    rl = (" ".join(r)).strip()
    results.append(rl)
    print(rl)

#파일로 출력하기 -- (4)
gubun_file = 'toji.gubun'
with open(gubun_file, 'w', encoding='utf-8') as fp:
    fp.write("\n".join(results))

#Word2Vec 모델 만들기 -- (5)
data = word2vec.LineSentence(gubun_file)
model = word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)
model.save("toji.model")
print("ok")

프로그램을 실행하면 학습에 사용할 텍스트가 출력된다. 

코드를 살펴보자

1: 텍스트 파일을 읽어 들인다.

2: 파일을 한 줄 한 줄 읽어 들이게 한다.

3: 형태소 분석을 하는데 어미, 조사, 구분점은 분석 대상에서 제외한다.

4: toji.gubun이라는 이름의 파일로 저장한다.

5: Word2Vec으로 파일을 읽어들이고, 모델을 생성해서 toji.model이라는 이름으로 저장한다. LineSentence() 함수로 텍스트를 읽어 들이고, Word2Vec()메서드로 매개변수를 전달해서 실행하면 모델이 만들어지고 생서한 모델은 save()메서드로 파일로 저장한다.

 

 

strip함수

주어진 문자열에서 양쪽 끝에 있는 공백과 \n기호를 삭제시켜 준다.

 

" ".join(리스트)

join함수는 리스트의 문자열들을 합치는 역할을 한다.

 

 

 

밑은 "땅"과 "집"이라는 단어로 테스트해본 것이다. 

"토지"라는 책에서는 "땅"과 가까운 단어로 "천도", "따위", "지지리" 등이 나왔다.

이처럼 유사한 단어를 확인할 때는 most_similar()메소드를 사용한다. 이 메서드는 positive와 negative라는 매개변수를 붙여 호출할 수 있지만 학습한 데이터가 굉장히 적어서 원하는 결과가 나오기 힘들 수도 있다.


 


< 출처 및 참고 자료 >

파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문

Comments