Dengan basis data besar dari kata-kata yang diizinkan (diurutkan menurut abjad) dan sebuah kata, cari kata dari basis data yang paling dekat dengan kata yang diberikan dalam hal jarak Levenshtein.
Pendekatan naif, tentu saja, hanya menghitung jarak levenshtein antara kata yang diberikan dan semua kata dalam kamus (kita bisa melakukan pencarian biner dalam database sebelum benar-benar menghitung jarak).
Saya ingin tahu apakah ada solusi yang lebih efisien untuk masalah ini. Mungkin beberapa heuristik yang memungkinkan kita mengurangi jumlah kata untuk dicari, atau optimisasi ke algoritma levenshtein distance.
Tautan ke makalah tentang sambutan subjek.
sumber
Levenshtein automatons: http://en.wikipedia.org/wiki/Levenshtein_automaton
Pohon BK: http://en.wikipedia.org/wiki/BK-tree
sumber
Jika Anda memiliki sejumlah kecil kesalahan edit yang akan Anda toleransi, maka Anda dapat mencoba menggunakan pohon sufiks bertitik . Penafian: Saya menulis makalah itu, tetapi ia memecahkan apa yang Anda inginkan: ia memiliki biaya ruang disk yang tinggi, tetapi pertanyaannya sangat cepat.
Secara umum, lebih baik untuk melihatnya sebaliknya: Anda memiliki indeks dari semua kata dalam kamus. Sekarang, untuk kata input w, jika ada di kamus, berhenti. Jika tidak, hasilkan semua variasi pada jarak 1 dan cari itu. Jika tidak ada, cari variasi pada jarak 2, dan seterusnya ...
Ada beberapa perbaikan pada ide dasar ini.
sumber
sumber
Saya menulis jawaban untuk pertanyaan yang sangat mirip di cs.stackexchange.com ( /cs//a/2096/1490 ) dan kemudian saya menemukan pertanyaan ini. Jawabannya ada untuk perkiraan pencarian tetangga dekat dalam jarak sunting (yaitu algoritma menghasilkan string yang kira-kira dekat dengan string permintaan sebagai tetangga terdekat dari string permintaan). Saya memposting di sini karena saya tidak menemukan referensi yang saya berikan di sana dalam jawaban yang diberikan di sini.
sumber
Saya pikir yang Anda inginkan adalah algoritma Wagner-Fischer: https://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm Wawasan utama adalah bahwa, karena kamus yang Anda lewati diurutkan, dua kata berurutan sangat mungkin untuk membagikan awalan yang panjang sehingga Anda tidak perlu memperbarui seluruh matriks untuk setiap perhitungan jarak.
sumber
Anda dapat menggunakan Apakah maksud Anda?
Dan kemudian temukan jarak Levenshtein antara jawaban yang dikembalikan oleh "Apakah maksud Anda" "dan masukkan string menggunakan Pemrograman Dinamis.
sumber
Did you mean?
fitur bangunan . Selain ituDid you mean?
mengembalikan kata yang sangat dekat dengan input yang diberikan dan melakukannya dengan cukup efisien. :)Salah satu caranya adalah melatih model pembelajaran mesin untuk memetakan kata-kata ke vektor dan memetakan jarak levenshtein ke jarak euclidean. Kemudian Anda bisa membuat KDTree dari vektor untuk kamus yang ingin Anda gunakan. Saya membuat notebook jupyter yang melakukan ini di sini: https://gist.github.com/MichaelSnowden/9b8b1e662c98c514d571f4d5c20c3a03
Sesuai komentar DW:
Ringkasan struktur model:
Data pelatihan saya hanya string acak, tetapi saya pikir hasilnya benar-benar dapat meningkat jika data pelatihan itu (salah ketik / kata benar) berpasangan. Saya akhirnya hanya menggunakan
/usr/share/dict/words
karena itu tersedia secara umum.sumber