駆け出しエンジニアの作業ノート

駆け出しエンジニアが作業ノート風にまとめるページ(関係無い事もしばしば)

Word2Vecによるモデル構築実験

機械学習の第一歩として、Word2Vecによるモデル構築実験を行うことにしました。

 

既にWikipediaを使ったモデル構築例があるので、違う物を使うことにしました。対象はずばり、このブログの本文。

 

もちろん、膨大なデータ量が無いと正確性が出ないのは百も承知なので、1ヶ月ごとの定点観測でどのくらい変わるかを行いたいと思います。

 

まず、はてなブログから本文を取得し、テキストファイルに保存するまでのコード

 

from bs4 import BeautifulSoup
import urllib.request
import re

def blog_scraping():
url = "http://psyduck-take-it-easy.hatenablog.com/entry/2018/02/11/124647"
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "html.parser")
div = soup.find("div", class_="entry-content").get_text()
div = re.sub('\n', '', div)
print(div)
f = open("test_model.txt", "a", encoding="utf-8")
f.write(div)
f.write("\n")
f.close()

if __name__ == '__main__':
blog_scraping()

 

次に、取得したテキストを形態素解析し、Word2Vecでモデル構築するコード

import MeCab
from gensim.models import word2vec
import re
import io
import pandas

def model_develop():
bindata = open("test_model.txt", "r").read()
text = re.sub("\n", "", bindata)
text = text.split("。")
tokeData = []
for i in range(len(text)):
try:
sentence = text[i]
m = MeCab.Tagger("-Ochasen")
sentence = m.parse(sentence)
sentence = io.StringIO(sentence)
sentence = pandas.read_csv(sentence, sep='\t', header=None)
sentence = sentence.loc[(sentence[3].str.find("名詞") >= 0)]
texts = list(sentence.iloc[:, 0])
tokeData.append(texts)
except:
print("[]")
print(tokeData)
model = word2vec.Word2Vec(tokeData, size=100, min_count=1, window=5, iter=3)
model.save("test_model.model")

if __name__ == '__main__':
model_develop()

ただし、ユーザー独自の辞書を使用する場合には

 

sentence = text[i]
m = MeCab.Tagger("-Ochasen -u /usr/local/lib/mecab/dic/ipadic/user.dic")
sentence = m.parse(sentence)

 

上記のようにユーザー辞書を定義する必要があります。

最後にモデルを呼び出すコード

 

from gensim.models import word2vec

model = word2vec.Word2Vec.load("test_model.model")
data = model.most_similar(positive=["こと"])
print(data)

 

最初の実行結果は以下の通り

 

[('感想', 0.22741879522800446), ('1', 0.19070367515087128), ('風', 0.18442809581756592), ('手', 0.11609397828578949), ('ノート', 0.11308078467845917), ('開設', 0.09799911081790924), ('機械学習', 0.07675206661224365), ('開発', 0.06593617796897888), ('年', 0.06529303640127182), ('主', 0.0587189644575119)]

 

という感じでした。なお、このコードを書くにあたり以下の記事を参考にしました。

own-search-and-study.xyz

 

ちなみに「こと」を入れた理由ですが、これは形態素ごとに数を数えて最初に結果が出たのがこれでした。

 

※以下のコードが動かなくなったので、修正しました。

 

psyduck-take-it-easy.hatenablog.com

 

 

数え上げに使用したコードは以下の通りです。

 

from bs4 import BeautifulSoup
import urllib.request
import MeCab
import re
import io
import pandas

def blog_scraping():
url = "http://psyduck-take-it-easy.hatenablog.com/entry/2018/02/11/124647"
html = urllib.request.urlopen(url)

soup = BeautifulSoup(html, "html.parser")
div = soup.find("div", class_="entry-content").get_text()
div = re.sub('\n', '', div)
print(div)
return div

def text_analysis():
text = blog_scraping()
m = MeCab.Tagger("-Ochasen -u /usr/local/lib/mecab/dic/ipadic/user.dic")
sentence = m.parse(text)
print(sentence)
sentence = io.StringIO(sentence)
sentence = pandas.read_csv(sentence, sep='\t', header=None)
sentence = sentence[0].value_counts()
print(sentence)

if __name__ == '__main__':
text_analysis()

 

とりあえず、色んなジャンルを書いてみるか