Bir Veritabanı dayalı Yazım Alternatifler?

7 Cevap php

Ben bir sorgu için alternatif yazım önermek (bir MySQL veritabanı ile PHP kullanarak) etkili bir yol arıyorum.

Ben böyle Yahoo's Spelling Suggestion gibi hizmetleri kullanabilirsiniz biliyorum ama ben önerileri veritabanında şu anda ne dayalı olmak istiyorum.

Örneğin: kullanıcı "Şehir" alanı ile bir form doldurmak zorundadır ve herkes dedi şehir için aynı yazım kullanmak emin olmak istiyorum, bu yüzden (Ben insanların zaman "Pitsburgh" doldurma ile bitmiyor ne demek "Pittsburgh") 'dir.

Bu temelde ben yazım kullanıcı girilen ne gerçekten yakın girişler için veritabanında zaten ne aramak istiyorsanız, sadece bir örnek oldu ama ...

Herhangi bir algoritma, öğreticiler veya bunu başarmak için nasıl bir fikir?

7 Cevap

Ben kullanıcı türleri olarak bunu yapmak ve (Google Suggest ala) öneki ile öneririm. A trie Bunun için güzel olurdu. Bu yanlış yazılmış ilk harflerini düzeltmek için yardımcı olmaz, ancak bu oldukça nadirdir.

MySQL olsa oldukça yavaş, Levenshtein düzenleme mesafeyi bulmak için yerleşik bir işleve sahiptir. Yukarıda sunulan otomatik tamamlama işlevi kullanmak, ya da sadece her hafta kadar sonra da-aslında girişlerini düzenlemek istiyorum.

Yazım alternatifleri sık sık (örneğin içinde bir tr kullanıcı yazdığınız bir,,, sizin veritabanı) iki kelime arasındaki Levenshtein distance kullanılarak uygulanır

here is the pseudocode for the algorithm (from wikipedia):

int LevenshteinDistance(char s[1..m], char t[1..n])
   // d is a table with m+1 rows and n+1 columns
   declare int d[0..m, 0..n]

   for i from 0 to m
       d[i, 0] := i
   for j from 0 to n
       d[0, j] := j

   for i from 1 to m
       for j from 1 to n
       {
           if s[i] = t[j] then cost := 0
                          else cost := 1
           d[i, j] := minimum(
                                d[i-1, j] + 1,     // deletion
                                d[i, j-1] + 1,     // insertion
                                d[i-1, j-1] + cost   // substitution
                            )
       }

   return d[m, n]

ve burada dillerin her türlü için real uygulaması bulabilirsiniz: http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Levenshtein_distance

Bunu yapmak için Pspell http://uk.php.net/pspell paketini kullandım. Yazım denetimi, arama terimi atın. Onun ok Değilse, Pspell önerileri yapacaktır.

Hatta, arama olsa önerileri çalıştırmak sonuçları saymak, ve sonra söyleyebilirim: "foo" aramanız 0 sonuç döndü. Eğer "baz" (12 results) veya "bar" (3 sonuç) kastettiniz.

Eğer performans konusunda endişeleriniz varsa bir arama 0 sonuç döndüğünde, yalnızca bunu.

, Yahoo! UI Library Autocomplete Component bir göz atın lütfen. Ben bunun için aradığınız şey olduğunu düşünüyorum. "DataSources kullanma" bölümü, sizinki gibi sunucu tarafı tabanlı olanlar dahil veri kaynaklarının farklı tür, nasıl kullanılacağını açıklar.

Javascript Examples bu 13 farklı autocompleting alan kodu listeler bakabilirsiniz.

Benim sitelerden birinde benzer bir şey kullandım, ben aslında, metin kutusunun altında kurulmuş bir div tabaka var, bir kullanıcı türleri onlar yazdığınız her harfi güncellemeleri benim SQL sorgu komut dosyası için bir Ajax tabanlı HTTP isteğinin bu yangınlar. Div kullanıcı seçmek için üzerine tıklayın herhangi eşleşen DB girdileri ile güncellenir.

I SoundEx Levenshtein mesafeden daha iyi bir uyum olduğuna inanıyorum.

Soundex İngilizce olarak yapacak sesi dayalı bir kelime / cümle bir karma üreten bir işlevdir. Bu büyü değil insanlar kurallı yazım maç yardımcı olmak için harika.

Ben iki kişi adına biraz daha farklı türevleri ile bir veritabanında aynı şirket kayıtlı bulmak çok başarılı bir şekilde kullanmıştır.

Soundex MySql içine inşa edilmiştir. İşte use tek öğretici olduğunu.