#!/usr/bin/env python
# coding: utf-8
#
# # **Project4 | word2vec**
#
# ## **1 데이터 전처리**
# In[ ]:
# 살인의 추억 텍스트 불러오기
filename = './data/movie_memories_of_murder_2003.txt'
with open(filename, 'r', encoding='utf-8') as f:
texts = f.read()
texts[:500]
# In[ ]:
from txtutil import txtnoun
skips = {'두만':'박두만', '태윤':'서태윤', '용구':'조용구', '귀옥':'권귀옥',
'희봉':'구희봉', '동철':'신동철', '광호':'백광호', '병순':'조병순',
'해일':'박해일', '광호의':'백광호', '백광호의':'백광호'}
texts = txtnoun(filename, skip=skips, tags=['Noun'])
texts[:500]
# In[ ]:
# 명사 Token 작업된 자료를 ssResport.txt 로 저장
script_file = './data/mom_script.txt'
with open(script_file, 'w', encoding='utf-8') as file:
file.write(texts)
print("전처리 완료된 대본파일 저장 : {}".format(script_file))
# In[ ]:
# ! cat ./data/ssResport.txt | head -n 10
#
# ## **2 Word 2 vec 객체 만들기**
# gensim
# In[ ]:
# ! pip3 install gensim
# In[ ]:
get_ipython().run_cell_magic('time', '', 'from gensim.models import word2vec\ndata = word2vec.LineSentence(script_file)\nmodel = word2vec.Word2Vec(data, size=30, window=2, min_count=10, hs=1,\n workers=4, iter=100, sg=1)\n\nmodel_file = "./data/mom_script.model"\nmodel.save(model_file)\nprint("Word 2 Vec 모델 파일 {} 저장완료".format(model_file))\n')
#
# ## **3 저장된 모델 불러오기 및 확인**
# gensim
# In[ ]:
get_ipython().run_line_magic('reset', '')
# In[ ]:
get_ipython().run_line_magic('who', '')
# In[ ]:
model_file = "./data/mom_script.model"
from gensim.models import word2vec
model = word2vec.Word2Vec.load(model_file)
len(model.wv.vocab.keys())
# In[ ]:
list(model.wv.index2word)
#
# ## **4 Word2Vec 모델 내용 확인**
# 모델을 활용하여 유력한 범인을 찾아보자!!
#
#
# In[ ]:
# 범인과 관련된 내용 중 사람이름이 안나옴...
model.wv.most_similar('범인', topn=10)
# In[ ]:
# 현장과 가장 가깝게 등장한 인물이 1명 등장
model.wv.most_similar('현장', topn=30)
# In[ ]:
# 현장 과 백광호 와 밀접한 증거들 중에 방해가 되는 내용을 찾는다
model.wv.most_similar(['현장','백광호'], topn=20)
# In[ ]:
# 현장 과 백광호 와 밀접한 증거들 중에 '참깨밭' 이 계속 방해가 됨
# 참깨밭에 백광호가 밀접하게 연결되어 있어서 이를 제외한 분석이 필요
model.wv.most_similar(['현장','백광호'], negative=['참깨밭'], topn=20)
#
# ## **5 Visulaization**
# gensim
# In[ ]:
list(model.wv.vocab.keys())[:10]
# In[ ]:
# model.wv.vocab : { word: object of numeric vector }
vocab = list(model.wv.vocab)
X = model[vocab]
X.shape
# In[ ]:
get_ipython().run_cell_magic('time', '', 'from sklearn.manifold import TSNE\ntsne = TSNE(n_components = 2)\nX_tsne = tsne.fit_transform(X)\n')
# In[ ]:
import pandas as pd
df = pd.DataFrame(X_tsne,
index = vocab,
columns = ['x', 'y'])
df.head()
# In[ ]:
get_ipython().run_line_magic('matplotlib', 'inline')
from matplotlib import rc
rc('font', family=['NanumGothic','Malgun Gothic'])
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(1, 1, 1)
ax.scatter(df['x'], df['y'])
for word, pos in df.iterrows():
ax.annotate(word, pos, fontsize=15)
plt.grid(True)
#
# ## **6 결과의 해석 및 활용**
# 1. 유사관계, 반대관계로 **출력된 모든 Token들이 가치가 있지는 않다**
# 1. **min_count, Vector 갯수** 2가지 조건만 사용하여 모델을 생성한다
# 1. Word2Vec 도 **문서를 분석하는 도구**에 불과 (절대적 **가치를 창출하는 기법** 으로 오해 X)
# 1. 해당 분야의 **잘 정리된 Document로 학습한 Word2Vec 모델** 에서 **유의미 한 token 들의 관계** 를 Template으로 잘 정리
# 1. 분석대상 문서를 **유사한 조건으로 word2vec 모델** 을 만들고, **앞에서 정리된 Template와** 비교하여 결과
# 다듬기
# 1. 시나리오의 분석 경우
# 1. 결과물 중 인물의 Token 만 활용하여 분석
# 1. 결과물 중 증거물의 Token 만 활용하여 분석
# 1. 결과물 중 장소의 Token 만 활용하여 분석
# In[ ]:
# model 에 등장하는 인물들
charator = ["박두만", "서태윤", "조용구", "권귀옥", "구희봉", "신동철", "백광호",
"조병순", "박해일", "박보희", "이향숙", "독고현순", "박명자", "안미선",
"반장", "소현", "범인", "형사", '괴남자', '순경','피해자', '권기옥','용의자']
# In[ ]:
# model 에 등장하는 장소명 들
area = ['현장', '사무실', '취조실', '변소', '참깨밭', '빗줄기', '어둠속', '언덕집']
# In[ ]:
# model 에 등장하는 Item 들
items = ['브래지어', '팬티', '우산', '운동화', '스타킹', '목소리', '불빛', '음악', '후레쉬',
'카메라', '라디오', '방송', '유전자', '가방', '코피', '휴지', '신문', '총구']