読者です 読者をやめる 読者になる 読者になる

鴨川にあこがれる日々

軽い技術っぽい記事かいてます

gloveとかword2vecの性能の測り方

追記

記事書いた後にこんな論文があったのでまとめています.

www.slideshare.net

はじめに

アクセスログをみているとgloveの記事nzw.hatenablog.jp

がずっとアクセス数が相対的に高いので流行ってるような感じがします.

分散表現(or Word Embeddings)の性能評価でよく見るのは,word similarityとanalogyによるものです.
英語であれば研究で使われるような正解データがあります.

日本語の場合,そういった正解データがないので,クラウドソーシングになげるかSPI*1の問題などを評価に使うようです.(誰か作ったらいい?)

"Improving Distributional Similarity with Lessons Learned from Word Embeddings"
Omer Levy, Yoav Goldberg, and Ido Dagan. TACL 2015.
の論文でword2vec,glove,PPMI+SVDの性能比較を行っています.


この実験で使われたであろうスクリプトリポジトリにまとまっているので,
評価がだいぶ楽になるはずです.
omerlevy / hyperwords — Bitbucket


間違っていたらご指摘よろしくおねがいします.

gloveのようなこのリポジトリ内にない手法で生成したベクトルの評価について簡単にまとめます.

本題

導入と学習

基本的には,READMEに書いてあることをなぞっています.

このリポジトリではPythonを使っており,2.7系を推奨しています.
3系は非推奨です.

パッケージとして以下の4つが最低限必要です.

  • numpy
  • scipy
  • sparsesvd
  • docopt


まずbitbucketからzipをダウンロードします.
次に*.shに実行権限を出してください.

chmod 755 *.sh
chmod 755 /scripts/*.sh

svdを試すには,以下のコマンドです.
不要な文字の削除もこの中で行うのでcorpusは生のテキストファイルでいいです.

./corpus2svd.sh corpus outdir

outdirの中にvectors.txtというファイルが生成されていれば,成功です.
中身はこんな感じ.

a -0.0997054574734 0.108193207093 0.156552368789 -0.0910304038694 0.100693697937 -0.10808004758 0.0509212965598 -0.0167150194356 -0.00699692057421 0.0142492211472 ...  -0.00885229338787


自前のモデルを使う場合は,この形式に合わせてベクトルを出力すれば,評価できます.
またgloveのvectors.txtとこの形式と同じなので,特別な手間は不要です.
というわけでgloveの代わりだと思って,これをそのまま使います.

SGNSやPPMI,SVDなどで行う場合は
example_test.sh
を参考にすると良いと思います.

評価

次は評価です.
さきほどのvectors.txtやgloveの学習結果のようにテキストにベクトルが書かれている場合は変換する必要があります.
ただし,このスクリプトの中で先頭の行を削除しているので,ダミーのヘッダーを入れないといけません.
(そうしないと単語が一つ削除されます)

$ python hyperwords/text2numpy.py outdir/vectors.txt

outdirの中に

  • vectors.txt.npy
  • vectors.txt.vocab

というファイルが生成されます.

でこのファイル名だと動かないので
vectors.txt.words.npyとvectors.txt.words.vocabに変換します.
(vectors.txtの部分は評価の引数で変更できますが,それより後ろは無理なのです...)

words similarityは以下のように実行します.
第1引数は分散表現を作った時の手法名(おそらく)をいれます.PPMIやSVDを使った場合はそれらを入れる必要があります.第1引数名によって内部で呼びだすクラスが異なるので注意してください.
第2引数名でベクトルの入ったファイル名を指定します.
第3引数名で正解データを指定します.5種類あります.
オプションもありますが,今回は省略しました.

$ python hyperwords/ws_eval.py glove outdir/vectors.txt testsets/ws/ws353.txt
glove hoge/hoge/vectors.txt 	0.503

スコアはスピアマンの順位相関係数です.


次はanalogiesによる評価です.
king - man + woman = ?のあれです.

引数はword similarityと同じです.
正解データはgoogleとMSRの2種類があります.

$ python hyperwords/analogy_eval.py glove outdir/vectors.txt testsets/analogy/msr.txt
glove hoge/vectors.txt 	0.318 	0.240

計算結果が2つあるのは,計算方法が2通りあるためです.
それぞれ3CosAdd,3CosMulといわれています.
論文によると後者の方が性能が良いとのことです.


以上です.

*1:就活でよくつかわれるあれ