[機械学習] 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 1Macでは
<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をフォローして頂けると幸いです ^ ^。
最後までご覧頂きましてありがとうございました!