rubyで簡単に文章の類似度を判定する

$KCODE =’u’
class String
  def trigram str
    def cacl_tri str
      h = {}
      a = str.split(//)
      s = a.size
      a.each_index{|v|
        h[a.slice(v, 3).join] = 1 if v+3 <= s
      }
      h
    end
    h1 = cacl_tri(self)
    h2 = cacl_tri(str)
    h3 = h1.merge h2
    h1.size != 0 ? (h1.size + h2.size - h3.size).to_f / h1.size.to_f : 0
  end
end

# google newsの見出し
p "ポスト京都交渉、作業計画で合意".trigram("ポスト京都、作業計画を採択・国連部会閉幕、課題は先送り")


結果

0.461538461538462

0.2くらいを越えたら類似文章って言えそうだ。

元ネタ
http://blog.livedoor.jp/techblog/archives/64737211.html