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