Başarılı bir şekilde kullandığım ancak hiçbir yerde açıklanmayan öneriler üretmeye yönelik bir yaklaşım, "kötü" hash işlevlerini kullanarak önerileri önceden hesaplamaktır (sözlüğü oluştururken).
Buradaki fikir, insanların yaptığı yazım hatası türlerine bakmak ve doğru yazımla aynı kovaya yanlış yazım atayacak hash fonksiyonları tasarlamaktır.
Örneğin, yaygın bir hatadır gibi yanlış bir sesli kullanmaktır definate yerine kesin . Böylece tüm ünlüleri aynı harf olarak değerlendiren bir hash işlevi tasarlarsınız. Bunu yapmanın kolay bir yolu, önce giriş sözcüğünü "normalleştirmek" ve ardından normalleştirilmiş sonucu normal bir hash işlevi aracılığıyla koymaktır. Bu örnekte, normalleştirme işlevi tüm sesli harfleri bırakabilir, yani definite
olur dfnt
. "Normalleştirilmiş" kelime daha sonra tipik bir hash fonksiyonu ile hash edilir.
Bu özel hash fonksiyonunu kullanarak tüm sözlük kelimelerinizi bir yardımcı dizine (karma tablo) ekleyin. Bu tablodaki paketler uzun çarpışma listelerine sahip olacaktır çünkü hash işlevi "kötüdür", ancak bu çarpışma listeleri esasen önceden hesaplanmış önerilerdir.
Şimdi, yanlış yazılmış bir kelime bulduğunuzda, yanlış yazımın yardımcı indekslerde eşlendiği kovanın çarpışma listelerine bakarsınız. Ta da: Bir öneri listeniz var! Tek yapmanız gereken, üzerindeki kelimeleri sıralamak.
Pratikte, çevrilmiş harfler, tek / çift harf ve hatta fonetik yazım hatalarını yakalamak için basit bir Soundex benzeri gibi diğer hata türlerini işlemek için diğer hash işlevlerine sahip birkaç yardımcı dizine ihtiyacınız olacak. Pratikte, basit telaffuzların uzun bir yol kat ettiğini ve aslında önemsiz yazım hatalarını bulmak için tasarlananların bazılarını geçersiz kıldığını buldum.
Artık yardımcı dizinlerdeki yanlış yazımlara bakarsınız ve sıralamadan önce çakışma listelerini birleştirirsiniz.
Çarpışma listelerinin yalnızca sözlükte bulunan sözcükleri içerdiğini unutmayın. Alternatif yazımlar üretmeye çalışan yaklaşımlarla (Peter Norvig makalesinde olduğu gibi), ilk önce sözlüğe göre filtrelemeniz gereken (on binlerce) adayı elde edebilirsiniz. Önceden hesaplanmış yaklaşımla, belki birkaç yüz aday elde edersiniz ve bunların hepsinin doğru yazıldığını bilirsiniz, böylece doğrudan sıralamaya geçebilirsiniz.
Güncelleme : O zamandan beri buna benzer bir algoritma açıklaması buldum, FAROO Dağıtılmış Arama . Bu hala düzenleme mesafesi sınırlı bir aramadır, ancak çok hızlıdır çünkü ön hesaplama adımı benim "kötü hash fonksiyonları" fikrim gibi çalışır. FAROO sadece sınırlı bir kötü hash işlevi kavramı kullanır.