word2vec利用のおぼえ書き

理論的なことはほとんどわかってない. だけど,単語n-gramをembeddingsと呼ばれるベクトル表現にしてくれることだけはわかっている. そのうち,しっかり勉強しますから...そのうち...

とりあえず,「toolとして使う.」を第一目標にしてみた.

word2vecについて

Google projectの公式ページ

python interfaceのページ

python interfaceの使い方

word2vec本体について

Google projectの公式ページで入手可能.

大体はここに書いてある説明のとおりにやっていけば良いのだが,pre-trainedのモデルファイルの利用がちょっと気になる.

pre-trainedの利用方法

kensuke-mi@pine12:~/opt/word2vec$ ./distance pre_treained/freebase-vectors-skipgram1000.bin

の場合,うまくいかない.out of vocaburaryエラーが出てしまう.どうしてだろう.

./distance freebase-vectors-skipgram1000-en.bin

の場合ならうまくいく

trainingに与えた文字列が違うのかな?ちょっとよくわかりませんわ.

pythonから利用するword2vec

gensimを利用したword2vecの利用

あまりgensimにいいイメージが無いので(自分のせい),正直いうとあまりつかいたくない. なので,紹介だけにとどめておく. 簡単なgensimからの利用方法

python interfaceからの利用方法

ここページが説明になっている

python interfaceのページをcloneすると,このディレクトリだけで完結するように作られている.(つまり,word2vecのパス設定とかいらない)

まずは,text8を落としてくる.
それから,モデルの構築をする.
使い方は至って簡単.

predictの方法

モデルがすでに構築されているならば,

import word2vec;
#predictするには
model=word2vec.load('data/text8.bin');
print model.cosine('socks')

とすると,

kensuke-mi@pine12:/work/kensuke-mi/word2vec$ python my_interface.py
{'socks': [('hats', 0.50409551706073819), ('sleeves', 0.49562676289846308), ('ccir', 0.49155883901522407), ('yy', 0.4855351120744591), ('scuse', 0.48148693039362678), ('ultramarine', 0.47923510425773591), ('ladders', 0.47687451638375983), ('shorts', 0.47560881503183755), ('sandals', 0.47500486825589316), ('gadget', 0.47341055943315097)]}

と結果が返される.戻り値は map {unicode : list [tuple (類似語,コサイン類似度) ] }
同時に複数のクエリを問い合わせることもできる様子.また第二引数にn=を与えると,返ってくる 結果をランキングして,n-bestにしてくれる.

>>> import word2vec
>>> model=word2vec.load('data/text8.bin');
>>> model.cosine(['black', 'shoe'], n=5)
{'black': [('white', 0.56834967471984832), ('finntroll', 0.46123369239422485), ('blue', 0.44615309448559237), ('pink', 0.4438545339121216), ('supermassive', 0.43944756607094654)], 'shoe': [('wig', 0.5741005702666796), ('lid', 0.55796864089100751), ('wrists', 0.54425265821306557), ('skirt', 0.54353961378778048), ('backside', 0.54320665339280927)]}
ベクトル同士の演算も可能

king - man + woman = queenの演算をしているところ.queenは陽に出ていないが,人間ならこの演算結果になるはず.
posとnegに与えたindex同士が演算をしてくれる.

>>> model.analogy(pos=['king', 'woman'], neg=['man'], n=35)
[('yorkist', 0.21529334213025994), ('jeroboam', 0.21486612207469408), ('sigismund', 0.20867263883974871), ('anshan', 0.20840656602763358), ('crowned', 0.20301714668798762), ('phocas', 0.20180414899554666), ('valdemar', 0.20057170323460011), ('montferrat', 0.1984374456883945), ('viii', 0.19699149761122769), ('frederick', 0.19584851740048648), ('hohenstaufen', 0.19576205112278927), ('honorius', 0.1952198959785727), ('ottokar', 0.19486544714713896), ('yohannes', 0.19482820698188466), ('elizabeth', 0.19461306830203362), ('josiah', 0.19431595479546726), ('letsie', 0.19383362079476915), ('isabella', 0.1936508914890635), ('artaxerxes', 0.19329982289098524), ('antiochus', 0.19305236838501658), ('vii', 0.19275875819712343), ('prince', 0.19243103791765451), ('darius', 0.19237946939940609), ('afonso', 0.19143543487145931), ('consort', 0.19137071746615503), ('queen', 0.19136534948869657), ('aragon', 0.19101972550858248), ('illegitimate', 0.19035532496687013), ('haakon', 0.18959125204851596), ('boleslaus', 0.18758554827090496), ('castile', 0.18731152033826037), ('wladislaus', 0.18697186406494296), ('regent', 0.18599804410262233), ('sancho', 0.1858333304029807), ('epiphanes', 0.18535909870666425)]