今からでもword2vecを触ってみよう

by ysawa

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 のすごさはこれだけではないのと、形態素解析の辞書になにも工夫がないため、やはり学習の精度には疑問が残るとことがありますが、今後の課題とさせていただきます。

この記事を読んだあとに

ysawa

エヌ次元株式会社代表取締役
東京工業大学工学部計算工学専攻卒業
符号理論の応用に関する研究
在学中よりフリーランスエンジニアとして活動
「持続可能な設計」を得意領域とする
会社設立後も設計からアプリ制作や
Webサイトのコーディングまでを幅広く担当
セキュリティスペシャリスト

 このブログについて

このブログは、プログラマやエンジニアのためになる情報を垂れ流しています。
ちょっと異端的なものも含まれているかもしれません。