類似度
ちょっと故あって、2つのベクトル間の類似度や相関係数にあたるmeasureで、値が0から1までの間をとるようなものを探しています。
相関係数だと、−1から+1までの範囲をとるので、目的に適いません。
(相関係数も無理やり0から1の値に変換することはできそうですが、なるべく自然な方法で計算したいのです)
ちょっと調べていたら、(目的のものとは違うのですが)2つの文章間の類似度を測るコサイン類似度なるものを見つけました。
(※今回のエントリーは、参考webページのブログの内容を私が記憶に留めるために、別の例で書き直しただけのものですので、詳しくは下記URLをご参照ください。)
文章A「僕のイヌは賢い」
文章B「僕の料理は美味しい」
という文章があったとき、これらの文章はどのくらい似ているでしょうか?
これを単語に分けます。
「僕/の/イヌ/は/賢い」
「僕/の/料理/は/美味しい」
ついで、重複を考慮して、現れている単語の数を数えます。
「僕/の/イヌ/料理/は/賢い/美味しい」の7つの単語があります。
これらの単語が上記の2つの文章に含まれているかどうかを判定します。
含まれていれば1、含まれていなければ0を付与します。
文章A(1, 1, 1, 0, 1, 1, 0)
文章B(1, 1, 0, 1, 1, 0, 1)
ここで共通して登場している単語を1とすると、
共通項(1, 1, 0, 0, 1, 0, 0)
が得られます。これらの共通要素の和は3(=1+1+0+0+1+0+0)です。
(※これは文章Aのベクトル(1, 1, 1, 0, 1, 1, 0)と文章Bのベクトル(1, 1, 0, 1, 1, 0, 1)の内積と同じ値です。)
文章Aのノルムを(1, 1, 1, 0, 1, 1, 0)から√<(1, 1, 1, 0, 1, 1, 0), (1, 1, 1, 0, 1, 1, 0)>により計算します。(<・,・>は内積の演算を表す)これにより、文章Aにおける単語の登場(生起)を表す大きさは√5と計算されます。
文章Bに含まれる単語の生起回数を表す大きさも同様に√5になります。
下記の相関係数に類似の式で、この2つの文章の類似度を計算します。
3/(√5×√5)
これにより、上記2つの文章の類似度は0.6と計算されます。
(私の理解・計算が間違っていなければ!)
私の課題にそのまま使うことはできなそうなので工夫が必要なのですが、ご興味のある方は参考にしてくださいませ。
参考webページ:
メモ帳の日記「相関係数・COS類似度」(2011年1月23日)
URL: http://d.hatena.ne.jp/asaday/20110123/1295767228