はじめに
Udacity DLND、今週は week8。word2vec がテーマ。
週をおうごとによくわからなくなっていくのは、自分だけだろうか。 だんだん、コピペと写経の講座になってしまっている。
リンクが張られてこれ読んでおいてねという感じ。自学自習が重視される。
というわけで、理解を深めるために、試行錯誤してみた。
week8 は、word2vec(skip-gram model) を tensorflow で実装するという内容。 word2vec は、2 層のニューラルネットワークに過ぎないので理解はたやすいのだけれども、 その前処理(SubSumpling)や 高速化のテクニック(Negative Sampling)が意味わからなかった。
この絵で説明する word2vec の解説ページがとてもわかりやすかった。感謝!
演習では、text8 という Wikipedia のデータセットを用いるのだけれども、相変わらず英語で、 日本人の自分にはピンとこない。というわけで、日本語のデータセットを自分で用意して試すことにした。
今回試したフル実装の Jupyter Notebook は以下です。
ツィートをデータセットに用いる
自分の twitter アカウントのツィートをデータセットにもちいることにした。
といっても、元ネタがあって、元ネタはこの記事。
この記事に 自分のツイートを取得する方法が詳しく書いてある。 twitter が csv データを提供してくれるのだ。 ダウンロードすると、tweets.csv というファイルが手に入る。
pandas で読み込んで前処理を加える。 studyplus とか fitbit のログを垂れ流していたので、それらは削除。
raw_data = pd.read_csv('tweets.csv')
text = raw_data['text']
# studyplus の垂れ流しツイートは削除
text = text[text.str.contains("#studyplus") == False]
# fitbit のライフログは削除
text = text[text.str.contains("おはようございます。今日は") == False]
オープンソースの形態素解析エンジンである MeCab をインストールして、 ツイートを単語ごとに分解して保存する。
ここでもさらに文章からゴミを落としていく。以下を参考にした。re.sub を使う。
import Mecab
import re
f_out = open("tweets_wakati.txt", "w" )
for line in text.iteritems():
line = re.sub('https?://[\w/:%#\$&\?\(\)~\.=\+\-…]+','', line[1])
line = re.sub('RT', "", line)
line = re.sub(r'[!-~]', "", line)#半角記号,数字,英字
line = re.sub(r'[︰-@]', "", line)#全角記号
line = re.sub('\n', " ", line)#改行文字
f_out.write(m.parse(line))
f_out.close()
これで tweet データセットがてにはいった。
Word2Vec を Tensorflow で実装
Word2Vec を tensorflow で実装!といっても課題をコピペしただけなので、省略!!
元の課題のコードを見てください。
可視化
こうなりました。自分を構成している概念が可視化されて面白い。
たとえば、落語という言葉に注目してみると、 周辺には寄席、談志、独演会など、落語関係の言葉がちゃんとあつまっている。