Word2Vec 실습
( 참고 : “딥러닝을 이용한 자연어 처리 입문” (https://wikidocs.net/book/2155) )
이번 포스트에서는 word2vec에 관해 실습할 것이다.
1. Import libraries & data
import re
from lxml import etree
from nltk.tokenize import word_tokenize,sent_tokenize
targetXML = open('ted_en-20160408.xml','r',encoding='UTF8')
target_text = etree.parse(targetXML)
parse_text = '\n'.join(target_text.xpath('//content/text()'))
# <content> ~ </content> 사이 내용 가져오기
2. Data Preprocessing
(Audio), (Laughter) 등의 배경음 부분을 제거
content_text = re.sub(r'\([^)]*\)','',parse_text)
문장을 tokenize 해준다
sent_text = sent_tokenize(content_text)
7번 index를 가진 문장은 다음과 같다.
sent_text[7]
'Everybody used them.'
구두점을 제거하고, 대문자를 전부 소문자로 바꿔준다.
normalized_text = []
for string in sent_text:
tokens = re.sub(r'[^a-z0-9]+', ' ', string.lower())
normalized_text.append(tokens)
하나의 문장을 단어 단위로 나눈 뒤 그것을 result라는 리스트에 담아둔다.
그 결과, 총 273424개의 문장이 단어 단위로 나뉜 상태로 리스트에 담겨져있음을 확인할 수 있다.
result = [word_tokenize(sentence) for sentence in normalized_text]
print(' Number of samples : ', len(result))
Number of samples : 273424
첫 세 문장이 어떠한 형식으로 담겨있는지 확인해보자.
for line in result[:3]:
print(line)
['here', 'are', 'two', 'reasons', 'companies', 'fail', 'they', 'only', 'do', 'more', 'of', 'the', 'same', 'or', 'they', 'only', 'do', 'what', 's', 'new']
['to', 'me', 'the', 'real', 'real', 'solution', 'to', 'quality', 'growth', 'is', 'figuring', 'out', 'the', 'balance', 'between', 'two', 'activities', 'exploration', 'and', 'exploitation']
['both', 'are', 'necessary', 'but', 'it', 'can', 'be', 'too', 'much', 'of', 'a', 'good', 'thing']
이 단어들을 vector로 만들기 위한 준비는 이제 끝났다.
3. Word2Vec
우리는 gensim에서 제공하는 Word2Vec을 활용하여 위 단어들을 임베딩할 것이다.
Word2Vec이 input으로 받는 인자들은 다음과 같다.
- size = dimension of embedded vector
- window = size of context window
- min_count
- workers
- sg=0 : CBOW / sg=1 : Skip-Gram
우리는 각 단어들을 100차원으로 임베딩할 것이다.
context size는 5로 설정하고, CBOW 모델을 사용할 것이다.
from gensim.models import Word2Vec
model = Word2Vec(sentences=result,
size=100, window=5, min_count=5, workers=4, sg=0)
‘man’이라는 단어와 가장 유사한 단어가 무엇인지 확인해본 결과, ‘woman’이 0.849의 유사도로 가장 높음을 알 수 있다.
model_result = model.wv.most_similar('man')
model_result
[('woman', 0.8488868474960327),
('guy', 0.7953285574913025),
('lady', 0.7730017304420471),
('boy', 0.744835376739502),
('gentleman', 0.7383678555488586),
('girl', 0.7321925163269043),
('soldier', 0.7277054786682129),
('poet', 0.690149188041687),
('kid', 0.6736900806427002),
('rabbi', 0.6579049825668335)]
4. Save & Load Word2Vec Model
위에서 학습한 weight들을 저장했다가 원하는 떄에 다시 재학습할 필요 없이 불러들일 수 있다.
from gensim.models import KeyedVectors
model.wv.save_word2vec_format('w2v_english')
loaded_model = KeyedVectors.load_word2vec_format('w2v_english')
model_result2 = loaded_model.wv.most_similar('man')
model_result2
[('woman', 0.8488868474960327),
('guy', 0.7953285574913025),
('lady', 0.7730017304420471),
('boy', 0.744835376739502),
('gentleman', 0.7383678555488586),
('girl', 0.7321925163269043),
('soldier', 0.7277054786682129),
('poet', 0.690149188041687),
('kid', 0.6736900806427002),
('rabbi', 0.6579049825668335)]