141_TF-IDFやcos類似度などの基本的なアルゴリズムを使い、単語ベクトルの作成や文書群の類似度計算を行うことができる

解説

TF-IDFは、文書中の単語の出現頻度と希少性を掛け合わせ、
主に情報検索や文章要約などの分野で利用されます。

TF(Term Frequency:単語の出現頻度)とIDF(Inverse Document Frequency:逆文書頻度)の二つの指標にもとづいて計算されます。

TFは、対象の文章の中でどれだけその単語が重要かを表す指標のことです。
文書中に現れる単語数をN、その単語の出現回数をnとすると、
TF = n/N
で表すことができます。
端的に言うと、繰り返し出現している単語が大事ということです。

IDFは、その単語自体が文書の中でどれだけ特徴的な単語かを表す指標のことです。
例えば、「する」や「なる」などは多くの文章に含まれる単語なので重要度は低く、
「爆発」や「破壊」などは滅多に使うことのない言葉なので、重要度が高いということです。

全体でD個の文章を持ったデータベースがあるとして、
そのうち、対象の単語を含む文章がd個あったとき、IDFは以下の式で表されます。

IDF = -log(d/D)
ここで、d/Dは対象の単語が使われている文章の割合で、0〜1の範囲のものです。
全ての文章に含まれている単語(割合=1)のとき、重要度はないので、IDF=0になり、
一つも含まれていない単語(割合=0)とときは無限大になります。

http://qiita.com/nmbakfm/items/6bb91b89571dd68fcea6

例えば、Rubyで類似度をチェックするとなると、、、
ここのソースとか見れば速攻でわかる
http://www.hirotsuru.com/entry/2016/07/11/191207

・それぞれの記事からMeCabで単語だけ切り出して記事を単語リストに変換
・TF-IDFによる特徴語の抽出と特徴ベクトルの生成
・特徴ベクトル同士のCos類似度を求める。
これだけでOK

cos類似度とは、文書同士を比較する際に用いられる類似度計算の手法のことです。
コサイン類似度は、そのまま、ベクトル同士の成す角度の近さを表現するため、三角関数の普通のコサインの通り、1に近ければ類似しており、0に近ければ似ていないことになる。
だいたいは、tf-idfの値で計算を用いて計算される場合が多いと思います。

ベクトルv1, v2の内積は

v1・v2= |v1||v2|cosθ
で表されます。
二つのベクトルが同じ方向を向いていたときはcosθ=1, 反対方向を向いていたときはcosθ=-1になるので、
これを類似度の指標として使おうという考え方です。

文章の類似度は単語の出現頻度の列で表されます。

例えば、次の二つの文章があるとします。

「リンゴとみかん、みかんとバナナ」という文章A
「リンゴとバナナ、バナナとキウイ」という文章B
これらをそれぞれ文章に表すと

A: (リンゴ, みかん, バナナ, キウイ) = (1, 2, 1, 0)
B: (リンゴ, みかん, バナナ, キウイ) = (1, 0, 2, 1)
というベクトルになります。

この二つのベクトルの類似度を求めると

A・B = 11 + 20 + 12 + 01 = 3
|A| = sqrt(11 + 22 + 11 + 00) = sqrt(6)
|B| = sqrt(11 + 00 + 22 + 11) = sqrt(6)
となり、

cosθ = A・B/|A||B| = 3/sqrt(6)sqrt(6) = 3/6 = 0.5
となるので、類似度は0.5となります。

補足:
TF-IDF Cos類似度推定法なるものもある
ーCos類似度の計算方法に使うベクトルの成分をTF-IDFにしたものです。

ステップアップ

fasttxt

キーワード

相関係数 相関の強さ
0.0~±0.2 ほとんど)相関がない
  • XXX
  • XXX
  • XXX
  • XXX
  • XXX

ソースコード

XXX.py:XXXするプログラム

このプログラムを実行すると、与えられた配列の中央値を算出します。

データセット

【TF-IDF】