Konsep pencarian fuzzy basis data

13

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?

Tom
sumber
Akan menarik untuk melihat bagaimana ini dibandingkan dengan Pencarian Trigram.
Rich
Saya ingin memiliki sesuatu seperti ini untuk wordpress ...
Kit Menke
Apakah menggunakan bilangan prima untuk fungsi hashing Anda membuatnya tidak mungkin untuk memiliki kata tabrakan yang tidak termasuk metode yang identik? Tampaknya mungkin untuk memiliki kata yang panjang dengan banyak huruf bernilai rendah untuk itu yang hash dengan nilai yang sama dengan kata pendek dengan beberapa huruf bernilai tinggi, tetapi saya tidak tahu banyak teori bilangan sehingga mungkin terbukti dengan satu atau lain cara ...
glenatron
1
@Glen Afaik mengalikan bilangan prima bersama selalu menghasilkan nomor unik. Anagram akan bertabrakan, tetapi idk berapa banyak masalah itu, pada dasarnya itu adalah titik untuk menemukan anagram dengan cepat.
Tom
@Glen: Lihat teorema faktorisasi unik untuk keunikan.
Steven Evers

Jawaban:

2

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 hlepbukannya help, 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.

Tangurena
sumber
2

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.

Ben DeMott
sumber
1

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

Rachel
sumber
Apakah kode yang Anda tulis untuk alamat cocok dengan sumber terbuka?
Thismatters
@Thismatters Saya tidak memiliki akses ke kode, tetapi tautan dalam jawaban saya harus memberikan logika untuk itu. Pada dasarnya Anda hanya ingin melihat berapa banyak perubahan yang diperlukan untuk membuat satu string menjadi yang lain, dan semakin sedikit perubahan maka semakin dekat mereka
Rachel
0

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."

Martin Beckett
sumber