可変長文字列の類似度ランキングアルゴリズムの改善 質問する

可変長文字列の類似度ランキングアルゴリズムの改善 質問する

通常提案されるもの (レーベンシュタイン距離、Soundex など) よりも可変長文字列に対して優れた結果をもたらす文字列類似性アルゴリズムを探しています。

例えば、

文字列A: "Robert"の場合、

次に文字列B:「エイミー・ロバートソン」

より良いマッチとなるだろう

文字列 C: 「リチャード」

また、このアルゴリズムは言語に依存しない(英語以外の言語でも機能する)ことが望ましいです。

ベストアンサー1

Catalysoft の Simon White 氏は、隣接する文字のペアを比較する非常に巧妙なアルゴリズムについての記事を書きました。これは私の目的に非常によく適合します。

http://www.catalysoft.com/articles/StrikeAMatch.html

Simon はアルゴリズムの Java バージョンを持っており、以下に PL/Ruby バージョンを書きました (Mark Wong-VanHaren による関連フォーラム エントリのコメントで行われたプレーン Ruby バージョンから取得)。これにより、PostgreSQL クエリで使用できるようになります。

CREATE FUNCTION string_similarity(str1 varchar, str2 varchar)
RETURNS float8 AS '

str1.downcase! 
pairs1 = (0..str1.length-2).collect {|i| str1[i,2]}.reject {
  |pair| pair.include? " "}
str2.downcase! 
pairs2 = (0..str2.length-2).collect {|i| str2[i,2]}.reject {
  |pair| pair.include? " "}
union = pairs1.size + pairs2.size 
intersection = 0 
pairs1.each do |p1| 
  0.upto(pairs2.size-1) do |i| 
    if p1 == pairs2[i] 
      intersection += 1 
      pairs2.slice!(i) 
      break 
    end 
  end 
end 
(2.0 * intersection) / union

' LANGUAGE 'plruby';

素晴らしい効果です!

おすすめ記事