Simon Blanc de Catalysoft a écrit un article sur un très habile algorithme qui compare adjacentes paires de caractères qui fonctionne vraiment bien pour mes besoins:
http://www.catalysoft.com/articles/StrikeAMatch.html
Simon a une version Java de l'algorithme et ci-dessous, j'ai écrit un PL/Ruby version (prises à partir de la plaine de version de ruby fait dans le forum connexes entrée de commentaire par Mark Wong-VanHaren), de sorte que je peux l'utiliser dans mes requêtes 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';
Fonctionne comme un charme!