word2vecで遊んでみる
機械学習関連の記事を読みあさっていたところ、オライリーからword2vecによる自然言語処理という書籍が出ていることを知った。ちょっと面白そうだなーと思って、とりあえずword2vecを触ってみることにした。環境はMBA(OS X Yosemite)。
まずは公式サイトからsvn checkoutしてくる。
$ svn checkout http://word2vec.googlecode.com/svn/trunk/で、make。
$ cd ./trunk/
$ ls
LICENSE demo-word.sh
README.txt distance.c
compute-accuracy.c makefile
demo-analogy.sh questions-phrases.txt
demo-classes.sh questions-words.txt
demo-phrase-accuracy.sh word-analogy.c
demo-phrases.sh word2phrase.c
demo-train-big-model-v1.sh word2vec.c
demo-word-accuracy.sh
$ makeエラーが出た。OS Xだとmallocが/usr/include直下に無いらしい。なので直下にリンク張っておく。
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
^
1 error generated.
make: *** [distance] Error 1
$ ls -alF /usr/include/malloc/malloc.h再チャレンジ。今度はうまくいって、実行ファイルが出来上がった。
-rw-r--r-- 1 root wheel 13706 9 10 2014 /usr/include/malloc/malloc.h
$ sudo ln -s /usr/include/malloc/malloc.h /usr/include/malloc.h
$ makeテストスクリプトを動かしてみる...んだけど、OS Xだとwgetが入ってないので、以下のように修正。
$ ls
LICENSE demo-classes.sh demo-word.sh questions-words.txt word2vec
README.txt demo-phrase-accuracy.sh distance word-analogy word2vec.c
compute-accuracy demo-phrases.sh distance.c word-analogy.c
compute-accuracy.c demo-train-big-model-v1.sh makefile word2phrase
demo-analogy.sh demo-word-accuracy.sh questions-phrases.txt word2phrase.c
$ vi demo-word.shテストスクリプトを実行。
make
if [ ! -e text8 ]; then
### コメント 化
# wget http://mattmahoney.net/dc/text8.zip -O text8.gz
# gzip -d text8.gz -f
### 追加
curl -O http://mattmahoney.net/dc/text8.zip
unzip text8.zip
###
fi
time ./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
./distance vectors.bin
$ ./demo-word.shとりあえずjapanってやってみた。あーなんとなく関連ぽい言葉が出てくる。chinaが高いポイントなのが面白い。
Starting training using file text8
Vocab size: 71291
Words in train file: 16718843
Alpha: 0.000005 Progress: 100.10% Words/thread/sec: 77.29k
real 14m58.897s
user 54m5.354s
sys 0m18.830s
Enter word or sentence (EXIT to break): japanじゃ、僕の名前であるsasakiをやってみると...日本人の苗字が出てきた。
Word: japan Position in vocabulary: 582
Word Cosine distance
------------------------------------------------------------------------
nagoya 0.636266
china 0.630357
japanese 0.626650
chiba 0.619252
shimizu 0.591518
osaka 0.585299
Enter word or sentence (EXIT to break):sasakiじゃ、appleは...というと、フルーツでは無くメーカーのほうが出てきた。
Word: sasaki Position in vocabulary: 39817
Word Cosine distance
------------------------------------------------------------------------
inoue 0.601103
isshu 0.597284
suzuki 0.590220
matsumoto 0.587990
saigo 0.571434
Enter word or sentence (EXIT to break): apple今回使ったサンプルデータであるtext8.zipは、1行の長い文章で構成されたデータになっている。何かの論文でも繋げたものだろうか?日本語の文章を解析する場合にはmecabで分かち書きにして結合してあげる必要があるみたい。
Word: apple Position in vocabulary: 1221
Word Cosine distance
------------------------------------------------------------------------
macintosh 0.685635
imac 0.604292
iigs 0.594525
appleworks 0.588855
quickdraw 0.571981
wozniak 0.570726
入門 自然言語処理