Ada esai bagus dari Peter Norvig bagaimana menerapkan korektor ejaan. Ini pada dasarnya adalah pendekatan brute force yang mencoba string kandidat dengan jarak edit yang diberikan. ( Berikut adalah beberapa tip bagaimana Anda dapat meningkatkan kinerja pengoreksi ejaan menggunakan Filter Bloom dan pencirian kandidat yang lebih cepat .)
Persyaratan untuk pemeriksa ejaan lebih lemah. Anda hanya perlu mengetahui bahwa sebuah kata tidak ada dalam kamus. Anda dapat menggunakan Bloom Filter untuk membuat pemeriksa ejaan yang menghabiskan lebih sedikit memori. Versi kuno dijelaskan dalam Pemrograman Mutiara oleh Jon Bentley menggunakan 64kb untuk kamus bahasa Inggris.
Sebuah BK-Tree adalah pendekatan alternatif. Artikel yang bagus ada di sini .
Jarak Levenshstein bukanlah jarak edit yang tepat untuk pemeriksa ejaan. Ia hanya mengetahui penyisipan, penghapusan dan substitusi. Transposisi hilang dan menghasilkan 2 untuk transposisi 1 karakter (ini 1 penghapusan dan 1 penyisipan). Jarak Damerau – Levenshtein adalah jarak edit yang benar.
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
jadilahdfnt
. 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.
sumber
Algoritma
Optimasi
Anda dapat menemukan penjelasan dan kode sumber yang lebih detail di proyek github .
sumber
Anda tidak perlu mengetahui jarak edit yang tepat untuk setiap kata dalam kamus. Anda dapat menghentikan algoritme setelah mencapai nilai batas dan mengecualikan kata tersebut. Ini akan menghemat banyak waktu komputasi.
sumber
Pemeriksa ejaan sangat mudah diterapkan seperti pada program ejaan Unix. Kode sumber tersedia untuk umum. Koreksi dapat dilakukan, salah satu tekniknya adalah melakukan pengeditan dan sekali lagi memeriksa apakah kata baru ini ada dalam kamus. Hasil edit baru tersebut dapat dikelompokkan dan ditampilkan kepada pengguna.
Sistem Unix menggunakan program yang ditulis oleh Mc IllRoy. Cara alternatif adalah dengan menggunakan Trie yang dapat berguna dalam kasus file besar.
Pendekatan unix membutuhkan lebih sedikit ruang untuk kamus besar karena menggunakan algoritma hash pencar.
sumber