Struktur data yang efisien untuk membangun pemeriksa ejaan cepat

41

Saya mencoba menulis pemeriksa ejaan yang harusnya berfungsi dengan kamus yang cukup besar. Saya benar-benar ingin cara yang efisien untuk mengindeks data kamus saya untuk digunakan menggunakan jarak Damerau-Levenshtein untuk menentukan kata mana yang paling dekat dengan kata yang salah eja.

Saya mencari struktur data yang akan memberi saya kompromi terbaik antara kompleksitas ruang dan kompleksitas runtime.

Berdasarkan apa yang saya temukan di internet, saya memiliki beberapa petunjuk tentang jenis struktur data yang akan digunakan:

Trie

trie-500px

Ini adalah pemikiran pertama saya dan terlihat cukup mudah diimplementasikan dan harus menyediakan pencarian cepat / penyisipan. Perkiraan pencarian menggunakan Damerau-Levenshtein juga harus mudah diterapkan di sini. Tapi itu tidak terlihat sangat efisien dalam hal kompleksitas ruang karena Anda kemungkinan besar memiliki banyak overhead dengan penyimpanan pointer.

Patricia Trie

trie-500px

Ini sepertinya menghabiskan lebih sedikit ruang daripada Trie biasa karena pada dasarnya Anda menghindari biaya penyimpanan pointer, tapi saya agak khawatir tentang fragmentasi data jika kamus sangat besar seperti yang saya miliki.

Pohon Sufiks

akhiran-500px

Saya tidak yakin tentang ini, sepertinya beberapa orang merasa berguna dalam penambangan teks, tetapi saya tidak begitu yakin apa yang akan diberikannya dalam hal kinerja untuk pemeriksa ejaan.

Pohon Pencarian Ternary

pertama

Ini terlihat cukup bagus dan dalam hal kompleksitas harus dekat (lebih baik?) Dengan Patricia Tries, tapi saya tidak yakin mengenai fragmentasi jika itu akan lebih baik lebih buruk daripada Patricia Tries.

Burst Tree

ledakan

Ini sepertinya jenis hibrid dan saya tidak yakin apa kelebihannya daripada Tries dan sejenisnya, tapi saya sudah membaca beberapa kali bahwa ini sangat efisien untuk penambangan teks.


Saya ingin mendapatkan umpan balik mengenai struktur data mana yang terbaik untuk digunakan dalam konteks ini dan apa yang membuatnya lebih baik daripada yang lain. Jika saya kehilangan beberapa struktur data yang bahkan lebih cocok untuk pemeriksa ejaan, saya juga sangat tertarik.

Charles Menguy
sumber
Bagaimana cara patricia trie menghindari biaya penyimpanan pointer? Apakah ini hanya en.wikipedia.org/wiki/Radix_tree ? Jika itu masalahnya, maka saya pikir itu masih menyimpan banyak petunjuk, tetapi Anda akan memiliki penghematan ruang yang besar karena awalan umum hanya disimpan sekali
Joe
n
1
@linker: Sudahkah Anda mencoba semua varian untuk kamus Anda? Mengingat kasus penggunaan tetap, itu mungkin cara tercepat untuk mengetahui datastructure mana yang menghabiskan banyak ruang.
Raphael
1
Ini hanya kamus dasar, hanya daftar kata-kata yang dieja dengan benar dengan benar.
Charles Menguy
1
Lihat juga pertanyaan terkait paling dekat ini .
Raphael

Jawaban:

4

Saya pernah mengalami masalah yang sama, tetapi mengambil pendekatan yang berbeda. Anda dapat membangun semacam fungsi "hash", yang untuk kata yang sama akan memberikan angka yang sama atau mendekati.

Masalahnya adalah, fungsi yang akan memberikan hasil "baik" untuk kata-kata dengan menyisipkan / menghapus, akan memberikan "buruk" untuk transisi, dan sebaliknya. Contoh: memetakan huruf ke angka, huruf yang mirip dengan angka yang berdekatan, dan hanya menjumlahkannya untuk setiap huruf dalam kata. Kemudian buat tabel hash dengan set untuk setiap kunci dan temukan persimpangan untuk kata.

Mungkin beberapa hasil dapat dicapai jika kita melihat "ruang" dari kata-kata. X untuk mengubah huruf, Y untuk menambah / menghapus, Z untuk transisi, atau sesuatu seperti itu.

Namun ini hanya ide abstrak, saya tidak punya cukup waktu untuk mengimplementasikannya.

MadRunner
sumber
Inilah yang dilakukan Soundex en.wikipedia.org/wiki/Soundex
rgrig
4

HAI(log(n))HAI

Jangan simpan string di pohon metrik. Cukup simpan indeks, dan simpan string di pohon Patricia.

Saya tidak yakin pohon mana yang harus Anda gunakan. Itu akan tergantung pada data Anda dan kebutuhan Anda (apakah Anda perlu memasukkan cepat?). Perbarui pertanyaan Anda jika Anda menemukan bahwa satu pohon lebih efisien daripada yang lain.

Anda juga dapat melihat alat khusus, seperti lucene.

oao
sumber