PHP - arama terimleri önermek nasıl, "Sen demek ki ...?"

7 Cevap php

When searching the db with terms that retrieve no results I want to allow "did you mean..." suggestion (like Google). So for example if someone looks for "jquyer" ", it would output "did you mean jquery?"

Tabii, öneri sonuçları (ben mysql kullanıyorum) db içindeki değerlere karşı uyumlu olmak zorunda.

Do you know a library that can do this? I've googled this but haven't found any great results. Or perhaps you have an idea how to construct this on my own?

7 Cevap

Hızlı ve kolay bir çözüm SOUNDEX veya SOUNDEX gibi fonksiyonları içerir.

Özetle SOUNDEX işlevi aslında aile adları için yaygın hatalardan ve alternatif yazımlar ile başa çıkmak için kullanılır, ve bu fonksiyon, (İngilizce dilinde) çok iyi birçok yaygın yazım hataları saklar oldu. Çünkü aile isimleri üzerine odak, orijinal soundex fonksiyonu (örneğin kodlama olmayan yinelenen, üçüncü ya da dördüncü ünsüz harften sonra durur) sınırlayıcı olabilir, ancak bu algoritma tüketmek kolaydır.

Fonksiyonunun bu tür faiz olanak sağlamasıdır bilgisayar, vaktinden, a single value which can be associated with the word. This is unlike string distance functions such as edit distance functions (such as Levenshtein, Hamming hatta {[ (4)]}) [(5)]} dizeleri {sağlar.

pre-computing ve sözlükteki tüm kelimeleri indexing SOUNDEX değeri ile, bir, çalışma zamanında, hızlı [run-time] hesaplanan SOUNDEX dayalı sözlük / veritabanı arayabilirsiniz Kullanıcı tarafından sağlanan arama terimlerinin değeri. Bu Soundex arama tamamlayıcısı olarak düz anahtar kelime arama, sistematik olarak yapılır, ya da anahtar kelime arama kayıtlarının tatmin edici bir dizi verim vermedi zaman sadece bu nedenle belki kullanıcı tarafından sağlanan anahtar kelime (ler) (vardır olduğunu ipucu sağlayarak, yapılabilir ) yanlış yazılmış.


Tamamen farklı bir yaklaşım, user queries which include several words, kullanıcı tarafından sağlanan anahtar kelime biri (veya birkaç) hariç sözlük / veritabanı karşı birden sorguları çalıştıran dayanmaktadır sadece uygulanabilir. Bu alternatif sorguları 'sonuç listeleri ayrı kelimelerin bir listesini sağlamak; Kelimelerin bu [azaltılmış] listesi bu çifti tabanlı uzaktan fonksiyonları listesi içinde, seçmek için uygulanabilir yeterince genellikle küçük, iddia yanlış yazılmış sözcüğü (ler) daha yakın kelimeler. (Sonuçlar listeler içinde) kelime sıklığı biraz benzerlik ölçümleri (eğmek için, ağırlık vermek için her iki sınır için kelimelerin sayısı (sadece x kat daha bulunan kelimeler için benzerlik değerlendirmek), hem de kullanılabilir, örneğin kendi benzerlik ölçümü biraz daha az) olsa bile, veritabanında "miktar" bulunan kelimeleri lehine.

Ne levenshtein fonksiyonu, ya da similar_text işlevi hakkında?

Aslında, Google'ın "mi kastettin" fonksiyonu kullanıcıların after bir yazım hatası yaptık yazdıklarınızla tarafından oluşturulan inanıyoruz. Verinin inanılmaz miktarda beri Ancak, bu onlar için tabii ki çok daha kolay.

Sen önerilen mgroves (veya Soundex), ama bir veritabanında mağaza sonuçları gibi Levenshtein mesafe kullanabilirsiniz. Ya da, ortak imla ve en popüler yanlış arama terimlerine göre ayrı komut dosyalarını çalıştırabilirsiniz.

Eğer arama yoluyla gelip ortak imla hataları izlemek (veya typo generator ile bazı kendiniz oluşturmak) ve yanlış yazım ve bir veritabanında eşleşen kelime saklamak gerekir. Eğer herhangi bir arama sonucu eşleşen bir şey yok o zaman, sen yanlış yazım tablo karşı kontrol edin ve önerilen kelime kullanabilirsiniz.

http://www.phpclasses.org/browse/package/4859.html

İşte asgari düzenleme mesafeyi istihdam uygulamak oldukça kolay bir off-the-raf sınıf, var. Yapmanız gereken tek şey bir belirteç kullanışlı birlikte çalışmak istediğiniz tüm kelimelerin listesini (tipi olmayan) olması. Benim önerim bu arama indeksi içinde sözcüklerin tam listesi emin ve sadece arama indeksi içinde yapmaktır. Bu iki şekilde olur:

  • Domain specificity helps avoid misleading probabilities from overtaking your implementation
    • Ex: "memoize" en off-the-raf, sözlükler için "Ezber" için büyü-düzeltilmiş olabilir, ama bu bir bilgisayar bilimi sayfası için gayet iyi bir arama terimi.
  • Proper nouns that are available within your search index are now accounted for.
    • Örn: Dell, ve birileri 'inspiran' için arama yaparsa, büyü-doğru işlev 'inspiron' anlamına bilecek kesinlikle şansı var. Muhtemelen daha az etki-özgü, yine, 'ilham verici' veya daha yaygın bir şey-Doğru yazım, ve olacaktır.

Kendi özel çözümü yazarken biraz zaman alacak ve kendi veri kümesi yeterince büyük değilse çalışması garanti edilmez, bu yüzden böyle Yahoo gibi bir arama devi bir API kullanarak tavsiye ediyorum. Yahoo's results Google's kadar iyi değil ama Google'ın ortak olması gerekiyordu olup olmadığından emin değilim.

Ben birkaç yıl önce yaptım, ben zaten arama motoru kullanılan kelimelerin bir özel inşa indeksi vardı. Ben (günlükleri göre) en yapılmış hataları ne tür insanların okudu ve hataydı nasıl ortak dayalı önerileri sıralanır.

If someone searched for jqeury, I would build a select-statement that went
SELECT Word,1 AS Relevance FROM keywords WHERE Word IN ('qjuery','juqery','jqeury' etc)
UNION SELECT Word, 2 AS Relevant FROM keywords WHERE Word LIKE 'j_query' OR Word LIKE 'jq_uery' etc
etc ORDER BY Relevance,Word

Çıkan sözler benim öneri ve gerçekten iyi çalıştı.