[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
2016/03/11更新

[機械学習] Word2VecをMacで使ってみる

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
最近は週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・機械学習を中心に発信していきます。気になった方はぜひ、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。