paragraph vector の実装が Qiita で紹介されていたので,ホイホイと動かしてみたという話
実行
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("test.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 で,
類似度の高い方から
- ニコニコ動画 ログインフォーム
- 【実況】パンツじゃないから恥ずかしくないロックマン5 part2 ‐ ニコニコ動画:GINZA
- 【Minecraft】ダイヤの階段で天を目指すPART7【実況】 ‐ ニコニコ動画:GINZA
- 4人で ポケモンスタジアム金銀 ミニゲーム対戦 実況 ‐ ニコニコ動画:GINZA
- 【minecraft】絶望スカイブロック part3【ゆっくり実況プレイ】 ‐ ニコニコ動画:GINZA
- F1 2012 キャリアモードを実況!part2-1(マレーシアGP 予選) ‐ ニコニコ動画:GINZA
- 【ゆっくり実況】ゆっくり狩猟生活するよ。 01【BigGameHunter 2010】 ‐ ニコニコ動画:GINZA
- ユーミーの実況プレイ(BF3 part7) ‐ ニコニコ動画:GINZA
- [実況の秋]ファイナルファンタジー8 Part28 ‐ ニコニコ動画:GINZA
- 【多趣味な主が】マヨヒガ実況 Part4【初実況】 ‐ ニコニコ動画:GINZA
感想
- ほとんど,コーディングすることなく,まあ動いたので,エンジョイ勢としては助かる
- ただ word2vec の拡張なので,適切なコーパスとパラメータが要求されそうな感じではある
- 文や文書などある程度の長さを持った単位の分散表現を得たいという要求は,文書分類やIRなどの分野でありそうなので,サクっと使える実装があるのは素晴らしいですね