[機械学習] Word2VecをMacで使ってみる
こんにちは、@yoheiMuneです。
最近は週3回のアウトプットを継続すべく、ブログを定期的に書いています。本日はいつもと少し嗜好を変えて、単語を200次元ほどのベクターで表現できるWord2VecをMacで使う方法をブログに書きたいと思います。

Word2Vecの情報は、以下のサイトをご覧ください。
Word2Vec本家ページ(英語)
また、「Word2Vecって何」は、以下3つの論文で語られています(現在読書中です・・)。
Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013.
Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. Distributed Representations of Words and Phrases and their
Tomas Mikolov, Wen-tau Yih, and Geoffrey Zweig. Linguistic Regularities in Continuous Space Word Representations. In Proceedings of NAACL HLT, 2013.
まずはSVNレポジトリよりソースコードをゲットしてきます。
このトレーニングが終わるとWord2Vecが使えるようになります。以下のコマンドで、距離の近い単語を見つけるプログラムを起動します。
Word2Vecは遊びに使うだけだと役立たないので、今実装中のNLPシステムにもなんらかの形で役立てたいなぁと思う今日この頃です。
本ブログでは、フロントエンド・Python・機械学習を中心に発信していきます。気になった方はぜひ、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!
最近は週3回のアウトプットを継続すべく、ブログを定期的に書いています。本日はいつもと少し嗜好を変えて、単語を200次元ほどのベクターで表現できるWord2VecをMacで使う方法をブログに書きたいと思います。

目次
Word2Vecとは
自然言語処理(NLP)界隈で、2013年にGoogleさんより出現した、単語をベクトルで表現するツールです。Word2Vec以前から単語をベクトルで表現する研究はされていましたが、今回は精度が良いようで注目を集めています。単語をベクトル空間で表現することで、単語間の距離で単語の近さを測れたり、演算ができるようになったりと色々と便利です。Word2Vecの情報は、以下のサイトをご覧ください。
Word2Vec本家ページ(英語)
また、「Word2Vecって何」は、以下3つの論文で語られています(現在読書中です・・)。
Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient Estimation of Word Representations in Vector Space. In Proceedings of Workshop at ICLR, 2013.
Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. Distributed Representations of Words and Phrases and their
Tomas Mikolov, Wen-tau Yih, and Geoffrey Zweig. Linguistic Regularities in Continuous Space Word Representations. In Proceedings of NAACL HLT, 2013.
Word2VecをMacにインストールする
Word2Vecをマックにインストールする場合には、いくつかエラーが発生するので、それを直しながら導入します。まずはSVNレポジトリよりソースコードをゲットしてきます。
$ svn checkout http://word2vec.googlecode.com/svn/trunk/ word2vec次にコンパイルしますが、以下のようなエラーが発生します。
$ cd word2vec
$ make
gcc word2vec.c -o word2vec -lm -pthread -O3 -march=native -Wall -funroll-loops -Wno-unused-result
gcc word2phrase.c -o word2phrase -lm -pthread -O3 -march=native -Wall -funroll-loops -Wno-unused-result
gcc distance.c -o distance -lm -pthread -O3 -march=native -Wall -funroll-loops -Wno-unused-result
distance.c:18:10: fatal error: 'malloc.h' file not found
#include <malloc.h>
^
1 error generated.
make: *** [distance] Error 1
Macでは<malloc.h>は必要ないので、以下コマンドでソースコードから除去します。# <malloc.h>があるファイルを一応チェック $ grep "<malloc.h>" *.c compute-accuracy.c:#include <malloc.h> distance.c:#include <malloc.h> word-analogy.c:#include <malloc.h> # そして、それらを削除 $ sed -ie 's/#include <malloc.h>//g' *.mその後に、もう一度コンパイルします。今度はワーニングはでますが無事に完了します。
$ make # 以下のコマンドが動けばOK $ word2vecこれで利用できる状態が整いました。次は試しに入力した単語の近しいものを見つけるサンプルを動かしてみたいと思います。
お試し1:入力した単語に近しい単語を見つける
上記でチェックアウトしたレポジトリにdemo-word.shというデモがあるのですが、wgetなどがありMacではそのまま動きません。おなじことをMacで動くコマンドで実現します。# トレーニングデータをダウンロード $ curl http://mattmahoney.net/dc/text8.zip > text8.zip $ unzip text8.zip # トレーニング $ word2vec -train text8 -output vectors.bin -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 1 -iter 15このトレーニングは数分〜数十分かかります。僕のMacbook Airだと20分ほどかかってました。
このトレーニングが終わるとWord2Vecが使えるようになります。以下のコマンドで、距離の近い単語を見つけるプログラムを起動します。
$ ./distance vectors.binあとは、入力待ち状態のところに調べてみたい単語を入力します。
$ ./distance vectors.bin
Enter word or sentence (EXIT to break): tokyo
Word Cosine distance
--------------------------------
osaka 0.696211
nagoya 0.673372
yokohama 0.651123
kobe 0.633323
sendai 0.593494
chiba 0.592637
kanto 0.590646
Enter word or sentence (EXIT to break): excellent
Word Cosine distance
--------------------------------
good 0.424523
impressive 0.422554
invaluable 0.410236
tips 0.401703
easy 0.383938
Enter word or sentence (EXIT to break): baseball
Word Cosine distance
--------------------------------
basketball 0.578409
satchel 0.573763
mlb 0.562194
rickey 0.560285
football 0.553713
softball 0.540441
hoyt 0.534524
hockey 0.519249
近さはコサイン距離で表現されています。こんな感じで単語の近さを測ることができます。お試し2:「(単語1)-(単語2)+(単語3)」を計算する
Word2Vecが楽しいところは、各単語がベクターで表現されているので、加算したり減算したりできるところです。Word2Vecの論文の一つでは、こんな計算が表現されていました。vector(‘king’) - vector('man’) + vector('woman’) is close to vector('queen’)ということで似たようなものをやってみたいと思います。
$ ./word-analogy vectors.bin
Enter three words (EXIT to break): king man woman
Word Distance
--------------------------------
queen 0.621236
betrothed 0.519939
infanta 0.493364
面白いですね。ベクターの加減算でこのような表現ができるのは素敵です。最後に
本日はMacにWord2Vecをインストールする方法をブログに書きました。インストール方法は他にもあるみたいですが、今回はこんな感じで。Word2Vecは遊びに使うだけだと役立たないので、今実装中のNLPシステムにもなんらかの形で役立てたいなぁと思う今日この頃です。
本ブログでは、フロントエンド・Python・機械学習を中心に発信していきます。気になった方はぜひ、本ブログのRSSやTwitterをフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!


