ささみろぐ

チラシの裏

天海春香さんと会話したい 19

文をtf-idfで重み付けしたベクトルで表して、コサイン類似度で類似度を出す方法を試してみる。

まずコーパス内の全ての2-gramを抽出し、重複を削除すると40355個になる。40355次元のベクトルで一文書を表現することになる。

tf-idfで文書内それぞれの2-gramに対し重みをつけていって、ベクトルとして書き出してみた。 f:id:sasamijp:20151124172531p:plain めっちゃ疎なベクトルができた。

ほんとは3次元じゃなくて40355次元なんだけど、今こんな感じでベクトルがたくさんある。 f:id:sasamijp:20151124193127p:plain

入力された文(話しかけられた文)もベクトルにすると、こんな具合に空間内に入ってくる。 f:id:sasamijp:20151124193316p:plain

ベクトルだから、それぞれに入力文とのなす角θがある。このとき、cosθの値を文章の類似度と捉えることができる。 f:id:sasamijp:20151124193550p:plain

この仕組みでとりあえず組んでみた。

gist.github.com コーパスはこんな形式で保存されている。

gist.github.com コーパスの"|||"で句切られている文字列の左側だけをnattoで分かち書きして2-gramに変換しベクトルにする。

gist.github.com こんな感じのベクトルができる。あまりにも疎なので「どこが0じゃない値か」みたいな形式にしておく。

gist.github.com できたベクトルを読み取って入力文ベクトルと比較してテストケースの結果を出力する。

gist.github.com テストケースに対する返答の結果。なんかあんまり良くない... ちょっと荒削りすぎた

そもそもSSのセリフだとtf-idfで重み付けするのがあまりよくない気がしてきた 品詞とかその辺の情報で重み付けしたい感じがある

LSIなどを使って密なベクトルに変換するのも試したいが、疎なベクトルのままやる方法を色々試そうと思う