EnsekiTT Blog

EnsekiTTが書くブログです。

先月のWikipediaをWord2Vecに突っ込んで単語を加算減算して遊んでみた話

つまりなにしたの?

WikipediaXMLデータをこないだクリーニングしたのでMeCab分かち書きにしてWord2Vecを学習してみた。
f:id:ensekitt:20171016234601j:plain

前回

ensekitt.hatenablog.com
をやったので、このデータを使いたい。

Word2Vecに突っ込むまでの手順

1つのテキストファイルにまとめる

前回作成したWikipediaのデータはディレクトリとファイルに分かれていた
↓こんな感じ
f:id:ensekitt:20171015015752p:plain

cat wikipedia/*/* > wikipedia_ja.txt

残っているXMLタグを削除する

前回作成したデータには

<doc id="1856" url="https://ja.wikipedia.org/wiki?curid=1856" title="VHS">
VHS
〜〜〜中略〜〜〜
</doc>

こんなタグが残っているのでこれを削除する。
とりあえずタグっぽいものは全部消せばいいかと思ってsedで消してみた。

sed  '/^<[^>]*>$/d' wikipedia_ja.txt > wikipedia_ja_cleaned.txt

MeCab分かち書きをする

分かち書きは、スペース区切りで英語みたいな感じに単語間を分けた書き方。

mecab -b 100000 -Owakati wikipedia_ja_cleaned.txt -o wikipedia_ja_wakati.txt

オプションは以下の通り。

  • bはバッファサイズ変更してる(大きくしてる)
  • Owakati はわかち書きしてる

Word2Vecで学習する

まずはpipでgensimをインストールする

pip install gensim

from gensim.models import word2vec

data = word2vec.Text8Corpus("wikipedia_ja_wakati.txt")
model = word2vec.Word2Vec(data, size=200)

こんな感じで実行するとさっき作った分かち書きのデータを使ってモデルを作成してくれる。
(ここは結構時間がかかった。とはいえ会社に行ってる間に終わってたし時間をはかりそこねましたごめんなさい。)

遊んで見る

エンジニアから技術を取ると何になるんだろう?オタクかな?とか思ってやってみた結果がこちら。
さっきのmodelを使って以下のようなコードで実行できる。

out = model.most_similar(positive=["エンジニア"], negative=["技術"])
for x in out:
    print(x[0], x[1])

その結果がこちら。
f:id:ensekitt:20171016232615p:plain
バンドマン!!!!(なんで
ただ、今年の夏頃にEnTechのSlackで、
「近年のエンジニアって夢の大きさはバンドマンだけど、ヒモになれないぶん稼げるの便利だよな」
みたいなバンドマンの皆様には大変失礼な話をしてたことを思い出した。

次、早大から酒を取り上げて資本を渡したら慶應になってくれっ
f:id:ensekitt:20171016233026p:plain
なった!!!
*1

みたいな遊びをしてたら日付が変わりそうになったので今日はここまで。
Wikipediaの題名を辞書登録しておけばよかったって思ったのと、
これもやっぱりJUMAN++で分かち書きしたデータでやってみたいなって思ってる。

*1:これらの結果は面白い結果になるように単語を選びました。資本→金とかすると全然うまくいかない。いろいろ試してみてね。