機械学習の第一歩として、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)]
という感じでした。なお、このコードを書くにあたり以下の記事を参考にしました。
ちなみに「こと」を入れた理由ですが、これは形態素ごとに数を数えて最初に結果が出たのがこれでした。
※以下のコードが動かなくなったので、修正しました。
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()
とりあえず、色んなジャンルを書いてみるか