INPUTしたらOUTPUT!

忘れっぽいんでメモっとく

word2vecを試してみた

以前、 自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる - あんちべ! を読んでいつか試してみたいと思ってたらO'reilly eBookが発売されたので買ってみた。

O'Reilly Japan - word2vecによる自然言語処理

以下メモ


試した環境

  • CentOS release 6.5 (Final)
  • GNU Make 3.81
  • gcc version 4.4.7


1. Subversionのインストール

word2vecのインストールはsvnでソースをチェックアウトしてコンパイルする必要があるのでSubversionをインストールする

$ sudo yum install subversion
$ svn checkout http://word2vec.googlecode.com/svn/trunk/


2. word2vecのインストール

自分の環境ではgccのバージョンが古くてmakeでエラーになった。


$ cd trunk
$ make
gcc word2vec.c -o word2vec -lm -pthread -Ofast -march=native -Wall -funroll-loops -Wno-unused-result
cc1: error: invalid option argument ‘-Ofast’
cc1: 警告: unrecognized command line option "-Wno-unused-result"
make: *** [word2vec] エラー 1


makefileに記載されている通り-Ofastを-O2に修正したら正常にコンパイルできた。

$ vi makefile
(3行目の-Ofastを-O2に修正する)
$ make
gcc word2vec.c -o word2vec -lm -pthread -O2 -march=native -Wall -funroll-loops -Wno-unused-result
gcc word2phrase.c -o word2phrase -lm -pthread -O2 -march=native -Wall -funroll-loops -Wno-unused-result
gcc distance.c -o distance -lm -pthread -O2 -march=native -Wall -funroll-loops -Wno-unused-result
gcc word-analogy.c -o word-analogy -lm -pthread -O2 -march=native -Wall -funroll-loops -Wno-unused-result
gcc compute-accuracy.c -o compute-accuracy -lm -pthread -O2 -march=native -Wall -funroll-loops -Wno-unused-result
chmod +x *.sh


3. デモの実行

デモを試してみる

$ ./demo-word.sh

(中略)

Starting training using file text8
Vocab size: 71290
Words in train file: 16718843
Alpha: 0.000121  Progress: 99.58%  Words/thread/sec: 18.30k  
real    15m19.959s
user    15m15.211s
sys 0m3.126sEnter word or sentence (EXIT to break): paris france berlin

Word: paris  Position in vocabulary: 1055

Word: france  Position in vocabulary: 303

Word: berlin  Position in vocabulary: 1360

                                              Word       Cosine distance
------------------------------------------------------------------------
                                           germany      0.641305
                                            munich      0.623994
                                             italy      0.604374
                                              bonn      0.576762
                                       switzerland      0.571837
                                           commune      0.551926
                                            vienna      0.540705
                                         tempelhof      0.537556
                                      hauptbahnhof      0.537206
                                           belgium      0.530941
                                            roissy      0.525079

(以下略)


paris + france - berlin = germany
という理解で良いのかな?


4. 金魚データで試してみる

金魚の品種の一覧 - WikipediaスクレイピングしてMeCab分かち書きしたデータで試してみる。

$ ./kingyo-word.sh
Starting training using file word.txt
Vocab size: 129
Words in train file: 2793

real    0m0.186s
user    0m0.110s
sys 0m0.067s
Word: リュウキン  Position in vocabulary: 67

                                              Word       Cosine distance
------------------------------------------------------------------------
                                            もと      0.3377240.2612710.249494
                                      デメキン      0.245132
                                            交配      0.237717
                                            琉金      0.2365790.2351890.232049
                                            呼ば      0.2246860.2233210.2221480.219538
                                            品種      0.217091
                                            ある      0.216454
                                            個体      0.2126440.212374
                                アズマニシキ      0.210649
                                            花房      0.2101460.2067290.2064130.206053
                                            ため      0.202992
(以下略


出目金 - 眼球 = 琉金とか和金 + 黒 + 白 = キャリコとかできたら面白いなーと思ったけどテキストデータが少なすぎるのか助詞が多すぎるのか期待したような結果にならなかった。。。orz
面白そうなネタがあったらまた試してみる。