SORU
17 Mart 2009, Salı


Daha iyi bir benzerlik değişken uzunlukta dizeleri sıralama algoritması

Genellikle önerilen olanlar (levenshtein mesafe, soundex, vb) daha değişken uzunlukta dize daha iyi sonuçlar vermesini dize benzerlik algoritması arıyorum.

Örneğin,

Bir dize verildi: "Robert",

Daha sonra string B: "Amy Robertson"

daha iyi bir maç olurdu

String C: "Richard"

Aynı zamanda, tercihan, bu algoritma dil agnostik (ayrıca İngilizce dışındaki diller için çalışır) olmalıdır.

CEVAP
17 Mart 2009, Salı


Catalysoft Simon White çok iyi benim amaçlar için çalışır bitişik karakter çiftleri karşılaştıran çok akıllı bir algoritma hakkında bir makale yazdı:

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

Simon bir Java sürümü algoritma ve aşağıda yazdığım PL/Ruby versiyonu (düz ruby sürümü bitti ile ilgili forum giriş Yorum tarafından Mark Wong-VanHaren) böylece kullanabilirim benim PostgreSQL sorgu:

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';

Bir cazibe gibi çalışır!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EvilControllers

    EvilControll

    20 Ocak 2008
  • Joseph Herscher

    Joseph Hersc

    14 Mart 2007
  • sknbp

    sknbp

    16 Kasım 2006