Tanimoto係数で同じ内容のニュースのタイトルを抽出する実験→失敗

はてなブックマークを見ていると、ソース元は違えど似たようなニュースがブックマークされていることが多い。これを出来るだけ簡単な方法で重複がないようにできればいいなと思っていた。

もし、Tanimoto係数のような糞簡単なアルゴリズムでその重複が取り除ければ、多少精度が悪かったとしても便利かなと思って実験してみた。結論から言えば、全然使い物にならなかったんですが。

ちなみに、Tanimoto係数とは、二つの集合の類似度を測るもの。0 ~ 1.0の間を取り、1.0は集合が完全に一致した場合である。今回は文字列を配列にして、Tanimoto係数が高いものが似たような文字列と仮定して実験を行った。

def tanimoto(array_a, array_b)
  and_set = array_a & array_b
  and_set.size.to_f / (array_a.size + array_b.size - and_set.size).to_f
end

REGEXP = /[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+|[a-zA-Z0-9]+/
tanimoto(string_a.scan(REGEXP), string_b.scan(REGEXP))

コードはこんな感じ。試しに2chまとめブログのタイトルを入れてみて、係数が大きい物を適当に抜粋してみた。

"みんな無茶しやがって…人生を楽しんでいる男たちの写真17枚:らばQ"
"プールの上で浮遊してるかのように無茶なポーズをとった写真17枚:らばQ"
["無茶", "写真", "17", "枚", "らば", "Q"]
0.260869565217391


"【ニュース】 築地市場で大火事 画像まとめ - NAVER まとめ"
"【和風総本家】柴犬・豆助の画像【テレ東】 - NAVER まとめ"
["画像", "まとめ", "NAVER"]
0.214285714285714

"暇人\(^o^)/速報 : ウイグル自治区行ってきた。(画像有) - ライブドアブログ"
"暇人\(^o^)/速報 : 【閲覧注意】深海怖すぎワロエナイ… - ライブドアブログ"
["暇人", "o", "速報", "ライブドアブログ"]
0.363636363636364

何度も出てくる単語にひっぱられて現実的な利用はかなり難しいことが分かった。次回は、TF-IDFを使ってみようと思う。