Pendekatan untuk menghasilkan saran yang berhasil saya gunakan tetapi belum pernah saya lihat dijelaskan di mana pun adalah dengan menghitung saran sebelumnya (saat membuat kamus) dengan menggunakan fungsi hash yang "buruk".
Idenya adalah untuk melihat jenis kesalahan ejaan yang dilakukan orang, dan merancang fungsi hash yang akan menetapkan ejaan yang salah ke keranjang yang sama dengan ejaan yang benar.
Sebagai contoh, kesalahan umum adalah dengan menggunakan vokal yang salah, seperti definate bukan yang pasti . Jadi Anda mendesain fungsi hash yang memperlakukan semua vokal sebagai huruf yang sama. Cara mudah untuk melakukannya adalah dengan terlebih dahulu "menormalkan" kata masukan dan kemudian memasukkan hasil yang dinormalisasi melalui fungsi hash biasa. Dalam contoh ini, fungsi normalisasi mungkin menghilangkan semua vokal, jadi definite
jadilah dfnt
. Kata yang "dinormalisasi" kemudian di-hash dengan fungsi hash yang khas.
Masukkan semua kata kamus Anda ke dalam indeks tambahan (tabel hash) menggunakan fungsi hash khusus ini. Bucket dalam tabel ini akan memiliki daftar tabrakan yang panjang karena fungsi hashnya "buruk", tetapi daftar tabrakan tersebut pada dasarnya adalah saran yang telah dihitung sebelumnya.
Sekarang, saat Anda menemukan kata yang salah eja, Anda mencari daftar tabrakan untuk bucket yang dipetakan oleh kesalahan eja tersebut di indeks tambahan. Ta da: Anda memiliki daftar saran! Yang harus Anda lakukan adalah memberi peringkat pada kata-kata itu.
Dalam praktiknya, Anda memerlukan beberapa indeks tambahan dengan fungsi hash lainnya untuk menangani jenis kesalahan lain, seperti huruf yang dialihkan, huruf tunggal / ganda, dan bahkan yang sederhana seperti Soundex untuk menangkap kesalahan ejaan fonetik. Dalam praktiknya, saya menemukan pelafalan sederhana yang berjalan lama dan pada dasarnya sudah usang beberapa yang dirancang untuk menemukan kesalahan ketik yang sepele.
Jadi sekarang Anda mencari kesalahan ejaan di setiap indeks tambahan dan menggabungkan daftar tabrakan sebelum memberi peringkat.
Ingat collision list hanya berisi kata-kata yang ada di kamus. Dengan pendekatan yang mencoba menghasilkan ejaan alternatif (seperti dalam artikel Peter Norvig), Anda bisa mendapatkan (puluhan) ribu kandidat yang harus Anda filter terlebih dahulu dari kamus. Dengan pendekatan yang telah dihitung sebelumnya, Anda mungkin mendapatkan beberapa ratus kandidat, dan Anda tahu bahwa semuanya dieja dengan benar, sehingga Anda dapat langsung beralih ke peringkat.
Pembaruan : Saya telah menemukan satu deskripsi algoritma yang mirip dengan ini, Pencarian Terdistribusi FAROO . Ini masih pencarian terbatas jarak edit, tetapi sangat cepat karena langkah praperhitungan bekerja seperti ide "fungsi hash buruk" saya. FAROO hanya menggunakan konsep terbatas dari fungsi hash yang buruk.