pythonで遊んで2週間ぐらいの人間がword2vecで遊べるようになるまで【python】

pythonで遊んで2週間くらい経ったので、自然言語処理?とかそういうの?やってみようかなと思ってword2vecで遊んでみることにしました。

 

今回は、そこに至るまでの環境構築でどんだけ躓いたか記しておきます。

 

全体的に、雑にザックリ書いているのでロクなものだと思わないでください。

 

 

 

とりあえずツイッター上のツイートを集めて遊ぼ~と思ったので、ツイートを集めてみました。

 

コードはここから全部コピペです。

ailaby.com

ツイートをテキストファイルで保存する必要があるので、最後のmain文はちょっと弄って以下のようにしています。

 

if __name__ == '__main__':

# キーワードで取得
getter = TweetsGetter.bySearch(u'けもフレ')

# ユーザーを指定して取得 (screen_name
# getter = TweetsGetter.byUser('AbeShinzo')

f1 = open("kemofre_tweet.txt", "w", encoding="'utf_8-sig")

cnt = 0
for tweet in getter.collect(total=300000):
cnt += 1
print('------ %d' % cnt)
print('{} {} {}'.format(tweet['id'], tweet['created_at'], '@' + tweet['user']['screen_name']))
print(tweet['text'])
if "http" in tweet['text']:
print("This tweet incldes http")
elif "@" in tweet['text']:
print("This tweet incldes @")
elif "RT" in tweet['text']:
print("This tweet incldes RT")
else:
f1.write(tweet['text']+"\n")

f1.close()

 

流行りの言葉で遊ぼうと思ったので「けもフレ」を含んだツイートを3万件ほど取得しました。

 

あとでデータ整形するのが面倒なんで、「http」「@」「RT」を含んだツイートは予め除いておきました。除いたツイート数は2000件くらいだったので、まあ誤差でしょう(?)

 

 

 

次に、word2vecにデータを突っ込むにはMeCabとかいうやつで品詞分解しなきゃならんらしいので、MeCabを導入しました。

 

これがもうね、ホントめんどくさかったです。1つのサイトだけ見ても問題解決できなくて、最終的にWindows死ねってなりました。

 

まずここを参考にしました。

y-mattu.hatenablog.com

で、上手くいかなかったのでここを参考にしました。

qiita.com

それでも「error: Unable to find vcvarsall.bat」ってエラーが出るので、最初のブログに書いてあったここを参考にしました。

isiz.hateblo.jp

「なんかVS2015 Community入れろって書いてあるけどもう入ってるしなあ…」とか思いながら再インストールするも、エラーが治らない。

 

ここでウンウン唸りながら調べるとこのブログが出てきました。

thinkami.hatenablog.com

Visual Studio Community 2015でVisual C++ 2015用の共通ツールをインストールすれば、ビルド・インストールできます。

 

それならそうとちゃんと書いといてくれや!と思いながら、最初から手順をやり直し、ようやくMeCabが使えるようになりました。ヤッター。

 

 

 

で、MeCabを使って形態素分析してみたのですが、まず肝心な「けもフレ」をちゃんと品詞として認識してくれない。

 

これはMeCabの標準の辞書に「けもフレ」という単語が入ってないからです。まあ入ってたらびっくりですよね。

 

というわけで「MeCabで最新の単語に対応したければ、はてなキーワードcsvwikipediaのタイトルのcsvを変換して、ユーザー辞書に登録すればいいよ!」という知見を得て、このブログを参考にしました。

yukihir0.hatenablog.jp

例によってコードは全コピペです。インターネットの皆さんありがとう。

 

これではてなキーワードとかのcsvファイルを、MeCabの辞書に適したcsvに変換できる~~~!と思ったらまたダメでした。問題は文字コードのようです。

 

原因は、csvファイルをちょっと弄ったときにLibreOfficeで保存したせいでした。

 

だって「けものフレンズ」は、はてなキーワードに入ってるのに「けもフレ」は入ってないんですよ。弄って追加するしか無いじゃないですか。

 

めんどくせえ…と思いつつ、「SmoothCSV」なるもので編集することにしました。

smoothcsv.com

 

 

csvファイルが出来たので、MeCabで使えるようにdicファイルに変換します。

 

この辺を参考にして変換しました。「mecab-dict-index」って命令使えば良いんだなってことがわかり解決です。

Window PCでMeCabの辞書を追加する方法 - 楽楽研究室

MeCab: 単語の追加方法

 

dicファイルを適切な場所において、よ~しもう一回MeCabで分解だ~!と思ったら「けもフレ」を認識してくれない。

 

原因はユーザー辞書を指定するmecabrcにあるのはなんとなくわかったんですが、どうしたらいいかわからない。

 

なんとなく「;userdic = ”ユーザー辞書のディレクトリ” 」ってなっていたのを、最初の「;(セミコロン)」を外して「userdic = ”ユーザー辞書のディレクトリ” 」とすると、ちゃんと認識してくれた!

f:id:watagassy:20170305184031j:plain

コメントアウトになってたわけですね。わかんねーよ。

 

その後は。MeCabで出力された文章から句読点を取り除くだけの雑な整形をし、以下のブログを参考にモデル作成とword2vecの試験をやってみました。

m0t0k1ch1st0ry.com

今回は「けもフレ」というワードで収集したツイートがデータの元なので、「サーバル」という単語に類似度が近いものを調べてみました。

 

それが以下です。

f:id:watagassy:20170305184556j:plain

うん、「かばん」って単語が一番上に来てる時点でまあまあいい感じじゃないでしょうか。

 

もう少しツイート集めたら制度上がるかな?と思って6万件くらい集めて同じことやってみたのが以下です。

f:id:watagassy:20170305184858j:plain

そこまで変わりませんね。データの整形やword2vecに突っ込むときのデータの形式、そもそものコーパスの作り方なんかを良くしていくと、もっと関連したワードが出てくるかもしれません。

 

 

 

以上がword2vecで遊べるようになるまでの軌跡でした。

 

インターネッツの叡智を集めればほぼ全コピペでもpythonで結構遊べるぞ、という参考になれば幸いです。