Saya memikirkan hal ini, dan telah mencoba menemukan solusi tentang cara fuzzy mencari database, jika misalnya seorang pengguna mengetik kesalahan ejaan. Adakah masalah mencolok dengan logika di balik ini? Apakah ini akan berhasil dan sudah pernah dilakukan sebelumnya?
Meja kami, kami ingin mencari:
**tblArticles**
Body - Soundex_Body - CharacterCoded_Body
Jadi kami menyimpan badan teks mentah untuk tampilan fisik. 2 kolom lainnya digunakan untuk pencarian yang dihitung dengan cara berikut:
Soundex
Tubuh dibagi menjadi kata-kata itu, dan diterjemahkan ke versi soundex itu. Yaitu, tubuh yang dihasilkan mungkin seperti:
H252 B54 C23 E33... etc
Jadi seseorang mungkin masuk 'dinosore', dan artikel di badan bertuliskan 'dinosaurus' keduanya dievaluasi ke B26. Kami kemudian menjalankan LIKE pada nilai soundex istilah pencarian.
Kode Karakter
Diberikan pemetaan karakter yang memetakan karakter ke bilangan prima, yaitu:
h = 2
e = 3
l = 5
o = 7
p = 11
c = 13
help = 2*3*5*11 = 330
hello = 2*3*5*5*7 = 1050
hell = 2*3*5*5 = 150
hlep = 2*5*3*11 = 330
cello = 13*3*5*5*7 = 6825
Jika pengguna bermaksud mengetik 'halo' tetapi mereka mengganti dua atau lebih karakter di sekitar misalnya 'hlelo', mereka akan mengevaluasi ke nomor yang sama. Membagi tubuh mentah menjadi kata-kata, meng-encode prime setiap kata dan menyimpannya dalam database memberi Anda bidang yang terlihat seperti:
330 6825 330 1050... etc
Kami kemudian dapat menyukai pencarian pada nilai ini untuk mencocokkan mistypes.
Manfaat
- Kesalahan ketik terlindungi
- Ejaan salah fonetik terlindungi
- Lebih ramah berbahasa Inggris non asli
- Akan bekerja dalam bahasa apa pun (tempat soundex bekerja)
Komentar dan pemikiran? Semacam pencarian berlapis-lapis. Anda tentu saja dapat mengembalikan nilai bobot untuk membuatnya lebih baik (yaitu kecocokan teks tubuh literal lebih bernilai), tetapi apakah ini solusi yang baik untuk kesalahan pengejaan dan penutur asli bahasa Inggris yang bukan asli yang melakukan pencarian?
Jawaban:
Ada sejumlah algoritma pencarian lainnya. Smith-Waterman adalah salah satu yang lebih baik untuk teks manusia, sedangkan BLAST (sejauh ini) adalah yang terbaik untuk mencari urutan DNA. Ketika Anda disajikan teks dengan berbagai kesalahan ejaan seperti
hlep
bukannyahelp
, maka Anda mencari jarak edit minimum .Untuk pustaka untuk mengimplementasikan sejumlah fungsi ini di CLR di SQL Server 2005 (dan yang lebih baru), lihat sumber menempa proyek SimMetrics . Posting blog tentang SimMetrics .
http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html
Soundex dikembangkan karena perbedaan utama antara variasi pidato daerah hampir secara eksklusif di vokal - itulah sebabnya ia mengeluarkan vokal. Itu tidak bagus dalam mengatasi surat-surat yang dipindahkan.
sumber
Apache Solr, mendukung sinonim dan koreksi ejaan - meskipun masih agak kasar.
Pencarian fuzzy dapat diimplementasikan menggunakan Ngrams,
Porter Stemmer: http://tartarus.org/~martin/PorterStemmer/
dan basis data bahasa seperti http://wordnet.princeton.edu/
... tetapi proyek seperti Xapian dan Solr menangani sebagian besar dari ini untuk Anda.
Jika Anda ingin membuat mesin pencarian kata / parsing istilah pencarian sendiri, saya sarankan untuk memasukkan token atau istilah yang Anda hasilkan ke dalam database yang sudah ada yang dirancang untuk melakukan pencarian bahasa.
sumber
Saya melakukan sesuatu seperti itu beberapa waktu lalu untuk alamat yang akan memeriksa berapa banyak perubahan yang diperlukan untuk mengubah satu string menjadi string lain, dan mengembalikan nilai numerik antara 0 dan 1 untuk seberapa dekat keduanya cocok.
Itu bekerja dengan baik karena akan mengembalikan nilai tinggi untuk item seperti N / Utara, St / Street, EastMain / MainEast, dll. Gagasannya berasal dari tautan CodeProject ini
sumber
Jika Anda mencocokkan nama, atau orang atau tempat, daftar sinonim dapat bekerja jauh lebih baik.
Soundex tidak akan cocok dengan "Dick == Richard" "Kit == Christopher" atau "Ms. == Ny."
sumber