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

sentence2vec 動かした

paragraph vector の実装が Qiita で紹介されていたので,ホイホイと動かしてみたという話

動くか動かないかというところを試しただけで,分析はまた今度

準備

sentence2vec


clone する

python

apt-get する
scipy と six と python-mecab と cython も

corpus

適当なのを作る
情報学研究データリポジトリ ニコニコデータセット
今回は nii のニコニコ動画コメント等データを適当に使った

前処理

ニコニコ動画コメント等データを形態素解析する
下記のスクリプトpython-mecab で表層を取り出した
フォーマットは1動画のコメントが1行に対応する


実行

corpus づくり
find 1920/*.dat | parallel -k 'cat {} | python hoge.py' > comment.txt

できたコーパスを text.txt, sent.txt という名前でコピーする

word2vec, sent2vec する

今回は次元数20で実行(計算が早く終わればいいな以外の意図は特にない)

python demo.py

実行すると text.txt.vec, sent.txt.vec という名前のモデルが作成される
中身は人が読める形式

  • text.txt.vec
20062 20
・ -0.366311 -0.244106 -0.112067 0.122302 -0.053559 0.161647 0.083299 -0.353562 -0.431138 -0.079664 -0.140329 -0.310677 0.037695 0.000320 -0.029487 0.441494 -0.366414 0.100139 -0.530504 -0.143536
w 0.262563 -0.238765 -0.038803 -0.256758 0.171049 0.173500 0.043050 0.013058 0.176450 -0.240599 0.114462 0.085227 0.098710 0.229836 -0.092270 0.098501 -0.080766 0.091476 0.231953 0.014193
の 0.052363 -0.387623 -0.134456 -0.092516 0.438207 0.526662 0.031667 0.087740 0.095118 -0.335733 0.260931 -0.332990 0.013396 -0.018831 -0.014129 0.015672 0.339761 -0.065756 0.155367 -0.009715
え 0.090246 0.088026 -0.185995 0.165061 -0.001712 0.417196 0.554568 -0.291899 -0.132426 0.530477 0.454003 0.278964 0.239197 0.282774 0.224525 0.235069 -0.004513 0.164533 0.481737 0.431216
  • sent.txt.vec
6058 20
sent_0 0.182024 0.090330 0.114799 0.234355 0.582596 -0.004654 0.110209 0.167706 -0.246123 0.433755 0.123800 0.377249 0.572828 0.272870 -0.660118 0.319322 0.125265 0.246991 -0.377670 0.365795
sent_1 0.187452 0.009171 -0.104531 0.082813 0.310420 -0.023038 0.040410 0.141558 0.010425 -0.082732 -0.141989 -0.041046 0.047360 0.164544 -0.133027 -0.078954 -0.013412 -0.209930 0.021173 -0.058519
sent_2 0.054423 0.473977 -1.046386 0.647040 -0.196664 -0.028364 -0.971648 -0.464324 -0.071181 -0.325542 0.057945 0.761559 0.156037 0.821473 -0.340377 0.251680 0.011175 -0.545717 0.611381 -0.040720
sent_3 0.524286 -0.350209 0.335791 -0.555210 -0.054185 0.237838 -0.050325 0.803153 0.018209 -0.139161 0.272506 0.234935 0.233839 -0.058021 -0.260528 -0.362279 0.021635 0.265550 -0.347841 0.057412

結果

適当に類似度とか求める

word2vec
In [1]: from word2vec import Word2Vec, Sent2Vec, LineSentence
In [2]: model1 = Word2Vec.load_word2vec_format("test.txt.vec", binary=False)
In [3]: a = model1.most_similar([u"w"])
In [4]: for x in a:
    print x[0] + "\t" + str(x[1])
   ....:     
wwww    0.764217913151
おめおめ        0.752804577351
ww      0.742512822151
¤       0.739003002644
www     0.726146757603
うめ    0.725368976593
デスノート      0.717002332211
!!!?    0.71115398407
わ      0.708843410015
wwwww   0.697422802448

ベクトルサイズを小さくしすぎたせいか,これくらいしかうまく行ったのが無い...

sent2vec
In [1]: from word2vec import Word2Vec, Sent2Vec, LineSentence
In [2]: model2 = Word2Vec.load_word2vec_format("sent.txt.vec", binary=False)
In [3]: a = model2.most_similar(["sent_106"])

In [4]: for x in a:
    print x[0] + "\t" + str(x[1])
   ....: 
sent_5856       0.843127667904
sent_3478       0.823697447777
sent_236        0.819774925709
sent_2739       0.808162093163
sent_5283       0.803729295731
sent_3676       0.803074240685
sent_4493       0.792018651962
sent_2682       0.77119666338
sent_4320       0.767410337925
sent_2812       0.760640382767

ちなみに,クエリのsent_106に対応する動画は 【Minecraft】鈴川あさひのマインクラフトPart2【マルチ】 ‐ ニコニコ動画:GINZA で,
類似度の高い方から

クエリがマインクラフトなので,類似度の高い動画のベクトルもマインクラフトいっぱいになると良いのだが,簡単にはいかなそう

感想

  • ほとんど,コーディングすることなく,まあ動いたので,エンジョイ勢としては助かる
  • ただ word2vec の拡張なので,適切なコーパスとパラメータが要求されそうな感じではある
  • 文や文書などある程度の長さを持った単位の分散表現を得たいという要求は,文書分類やIRなどの分野でありそうなので,サクっと使える実装があるのは素晴らしいですね