word2vec
とは、その名の通り、単語(word)をベクトル(vector)に変換するツールです。単語をベクトルに変換することで、単なる文字列を演算処理しやすくすることができます。
今回は、その word2vec をインストールして簡単に触ってみます。例として、お馴染みの Wikipedia を学習させながら理解を深めていきましょう。
インストール
公式には、 svn checkout http://word2vec.googlecode.com/svn/trunk/
と書いてあるのですが、
svn checkout http://word2vec.googlecode.com/svn/trunk/
svn: E170013: Unable to connect to a repository at URL 'http://word2vec.googlecode.com/svn/trunk'
svn: E160013: '/svn/trunk' path not found
となって、チェックアウトできません。
$ git clone https://github.com/svn2github/word2vec.git
$ cd word2vec/
$ make
とするだけですね。簡単です。
Mac の人は、うまくビルドが通らないので、 https://github.com/dav/word2vec こちらを使ったほうが良いかもしれません。
動作確認
$ ./demo-word.sh
make: Nothing to be done for 'all'.
Starting training using file text8
Vocab size: 71291
Words in train file: 16718843
Alpha: 0.000005 Progress: 100.10% Words/thread/sec: 107.09k
real 3m20.725s
user 39m2.260s
sys 0m4.660s
Enter word or sentence (EXIT to break):
計算が終わったようです。 word2vec は pthread
を非同期処理の仕組みとして使っていて、 user
CPU時間が39分とあることから、マルチスレッドで行列計算が行われていることが分かります。
シングルスレッドだとおそらく10分以上掛かるのでしょう。
試しに、 bike
という単語のコサイン類似度(コサイン距離)の高い単語を取り出してみましょう。
Enter word or sentence (EXIT to break): bike
Word: bike Position in vocabulary: 8698
Word Cosine distance
------------------------------------------------------------------------
cycling 0.673645
bicycle 0.660240
bicyclists 0.640419
bikes 0.617073
pedestrians 0.584905
bicycles 0.582522
cyclists 0.576066
motorcycle 0.574947
handlebars 0.572666
bicycling 0.546784
(省略)
いい感じです。次に、 swimming
ではどうでしょうか。
Enter word or sentence (EXIT to break): swimming
Word: swimming Position in vocabulary: 7199
Word Cosine distance
------------------------------------------------------------------------
pools 0.571995
pool 0.562248
swims 0.506778
diving 0.502436
rowing 0.496319
outdoor 0.490369
camping 0.481241
surfing 0.476006
jumping 0.469030
canoeing 0.465451
(省略)
なるほど。では、 programming
ではどうでしょうか。
(省略)
Enter word or sentence (EXIT to break): programming
Word: programming Position in vocabulary: 876
Word Cosine distance
------------------------------------------------------------------------
smalltalk 0.623748
prototyping 0.616721
rexx 0.615583
scripting 0.614783
lisp 0.577409
tcl 0.569883
fortran 0.564210
matlab 0.549655
awk 0.545809
vba 0.536878
(省略)
MeCab
word2vec は、ルールとして、単語動詞をスペースで繋ぐ必要があります。文章を形態素解析した上で形態素同士をスペースで繋いでいく操作を「分かち書き」といいます。形態素というと難しそうな響きがしますが、簡単にいうと、単語や句読点などの文章を構成する要素で最小単位のことを形態素を呼びます。
今回は、日本の Wikipedia を学習していくので、分かち書きしてあげないといけないですね。特に、インストールしやすくて扱いやすい MeCab
を採用してみました。
インストール
Cent OS 7 だと、インストールはとても簡単。
# rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
# yum install -y mecab mecab-ipadic mecab-jumandic mecab-devel
Mac Homebrew でも
$ brew install mecab mecab-ipadic mecab-jumandic
とすれば、インストールできます。
辞書による差
インストール後、
$ mecab
で MeCab を実行することはできるのですが、辞書によってどのように分かち書きが異なってくるか、体験してみましょう。
$ mecab -O wakati -d /usr/lib64/mecab/dic/jumandic/
毒きのこさんは株式会社Libra Studioの代表取締役です。
毒 きのこ さん は 株式 会社 Libra Studio の 代表 取締 役 です 。
$ mecab -O wakati -d /usr/lib64/mecab/dic/ipadic/
毒きのこさんは株式会社Libra Studioの代表取締役です。
毒 きのこ さん は 株式会社 Libra Studio の 代表 取締役 です 。
辞書は、環境によって場所が違うかもしれません。ご注意ください。
Wikipediaをダウンロード
では、やっと、Wikipedia の解析に入っていくことができます。
Wikipedia のデータをダウンロードしてきます。Wikipedia:データベースダウンロードから、リンクをたどって最新のダンプのURLをコピーしましょう。だいたいは、下のコマンドでいけると思います。
# yum install -y wget
$ wget https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
2GB程度ありうちの環境だと2時間位かかったので気長に待ちましょう。
長い間操作なしに接続し続けると、リモートホストから接続を解除されて処理が完了しない場合があるので、
$ nohup wget https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 &
とすると、別プロセスで、 wget
コマンドを実行してくれて、 SSH で接続しているホストから接続を切断されても、ダウンロードし続けることができます。
$ tail -f nohup.out
とすると、ダウンロードがどこまで進んだかわかります。
rvmなどで Ruby をインストールして使えるようにした後、 wp2txt
をインストールします。
$ gem install wp2txt
して、沢山、.txt
が吐き出されるので、ディレクトリを作りながら、その中にテキストを取り出していきます。
$ mkdir jawiki-latest-pages-articles
$ cd jawiki-latest-pages-articles
$ wp2txt --input-file ../jawiki-latest-pages-articles.xml.bz2
とすると、どこまで Wikipedia のテキストが取り出されたか解ります。これは、うちの環境だと1時間弱で終わったのですが、O’reillyのword2vec本によると環境によっては、10時間も掛かるらしいです。同じように、 nohup
と &
で挟んでおくと安心かもしれません。
では、全てのテキストをくっつけて、分かち書きをしましょう。
$ cd ..
$ cat jawiki-latest-pages-articles/*.txt | mecab -O wakati > jawiki-latest-pages-articles-wakati-ipadic.txt
してしまいましょう。もしかすると、実行中 input-buffer overflow. The line is split. use -b #SIZE option.
のように警告が出るかもしれません。このときは、わりと大きめのバッファサイズ -b 32768
などを mecab
のオプションに指定して、再度実行してみてください。この結果は、20分から30分で出ると思います。
結果
$ head jawiki-latest-pages-articles/jawiki-latest-pages-articles-001.txt
[[アンパサンド]]
アンパサンド (ampersand, &) とは「…と…」を意味する記号である。英語の "and" に相当するラテン語の "et" の合字で、"etc." (et cetera = and so forth)を "&c." と記述することがあるのはそのため。Trebuchet MSフォントでは、10pxと表示され "et" の合字であることが容易にわかる。
==歴史==
その使用は1世紀に遡ることができ (1)、5世紀中葉 (2,3) から現代 (4-6) に至るまでの変遷がわかる。
Z に続くラテン文字アルファベットの27字目とされた時期もある。
が
$ head jawiki-latest-pages-articles-wakati-ipadic.txt
[[ アンパサンド ]]
アンパサンド ( ampersand , &) と は 「 … と … 」 を 意味 する 記号 で ある 。 英語 の " and " に 相当 する ラテン語 の " et " の 合 字 で 、 " etc ." ( et cetera = and so forth ) を "& c ." と 記述 する こと が ある の は その ため 。 Trebuchet MS フォント で は 、 10 px と 表示 さ れ " et " の 合 字 で ある こと が 容易 に わかる 。
== 歴史 ==
その 使用 は 1 世紀 に 遡る こと が でき ( 1 )、 5 世紀 中葉 ( 2 , 3 ) から 現代 ( 4 - 6 ) に 至る まで の 変遷 が わかる 。
Z に 続く ラテン 文字 アルファベット の 27 字 目 と さ れ た 時期 も ある 。
になりました。ちゃんと分かち書きできていることがわかりますね。実際は、記号や不要な文字列はゴミなので取り除いたほうがよいかと思いますが、今回は、このまま学習していこうと思います。
Wikipediaを学習する
では、 Wikipedia を学習していきましょう。 time
コマンドで、時間も計りながらやるとよいかと思います。
$ time {path to}/word2vec -train jawiki-latest-pages-articles-wakati-ipadic.txt -output jawiki-latest-pages-articles-wakati-ipadic.bin -size 200 -window 5 -sample 1e-3 -negative 5 -hs 0 -binary 1
Starting training using file jawiki-latest-pages-articles-wakati-ipadic.txt
Vocab size: 1168144
Words in train file: 1308884152
Alpha: 0.000005 Progress: 100.00% Words/thread/sec: 283.21k
real 35m11.672s
user 386m28.992s
sys 0m54.846s
35分掛かりました。しかし、これまたO’reillyのword2vec本によると環境によっては、35時間掛かったという情報もありましたので、いい CPU を使うことが学習において重要かと思います。
結果
Wikipedia を学習させた結果は、どのようになったでしょうか。
「分かち書き」という単語では、
$ {path to}/word2vec/bin/distance jawiki-latest-pages-articles-wakati-ipadic.bin
Enter word or sentence (EXIT to break): 分かち書き
Word: 分かち書き Position in vocabulary: 121168
Word Cosine distance
------------------------------------------------------------------------
押韻 0.634536
拗音 0.616829
対句 0.616740
音読 0.616384
数詞 0.609197
表音 0.588711
羅列 0.585752
句点 0.584374
訓読 0.584373
万葉仮名 0.583745
(省略)
文法用語が出てきました。なんとなくそれっぽいですね。
続いて、「Python」では、
Enter word or sentence (EXIT to break): Python
Word: Python Position in vocabulary: 26083
Word Cosine distance
------------------------------------------------------------------------
Perl 0.855341
JavaScript 0.849918
Java 0.795397
Haskell 0.787891
OpenBSD 0.757715
GNU 0.753310
Qt 0.753234
コンパイラ 0.752445
Ruby 0.750467
FreeBSD 0.745545
(省略)
スクリプト言語に強い関連性がありますね。
最後に、「iPhone」これはどうでしょう。
Enter word or sentence (EXIT to break): iPhone
Word: iPhone Position in vocabulary: 13359
Word Cosine distance
------------------------------------------------------------------------
iOS 0.784094
iPad 0.783864
Android 0.767029
iPod 0.708616
スマートフォン 0.690686
Mac 0.681462
iphone 0.678937
Windows 0.673256
Nexus 0.672509
OS 0.663090
(省略)
いい感じですね。 iOS, iPad などが、引っかかりました。
まとめ
ざっと、 word2vec のインストール。 MeCab のインストールから、 Wikipedia の学習まで見ることができました。
実は word2vec のすごさはこれだけではないのと、形態素解析の辞書になにも工夫がないため、やはり学習の精度には疑問が残るとことがありますが、今後の課題とさせていただきます。
この記事を読んだあとに
- 書いた人のツイッター – Follow me!
- 『売上を3年連続20%成長させた18の秘訣』
- 運営しているアクションゲーム