Saya mencari pustaka JavaScript pencarian kabur untuk memfilter array. Saya sudah mencoba menggunakan fuzzyset.js dan fuse.js , tetapi hasilnya buruk (ada demo yang bisa Anda coba di halaman yang ditautkan).
Setelah melakukan beberapa membaca tentang jarak Levenshtein, menurut saya itu adalah perkiraan yang buruk tentang apa yang dicari pengguna saat mereka mengetik. Bagi mereka yang tidak tahu, sistem menghitung berapa banyak penyisipan , penghapusan , dan substitusi yang diperlukan untuk membuat dua string cocok.
Satu kekurangan yang jelas, yang diperbaiki dalam model Levenshtein-Demerau, adalah bahwa blub dan payudara dianggap sama-sama mirip dengan bulb (masing-masing membutuhkan dua substitusi). Jelas, bagaimanapun, bahwa bohlam lebih mirip dengan blub daripada payudara , dan model yang baru saya sebutkan mengakui bahwa dengan memungkinkan untuk transposisi .
Saya ingin menggunakan ini dalam konteks penyelesaian teks, jadi jika saya memiliki array ['international', 'splint', 'tinder']
, dan kueri saya int , menurut saya internasional harus memiliki peringkat lebih tinggi daripada bidai , meskipun yang pertama memiliki skor (lebih tinggi = lebih buruk) 10 versus 3 yang terakhir.
Jadi yang saya cari (dan akan dibuat jika tidak ada), adalah pustaka yang melakukan hal berikut:
- Memberi bobot pada manipulasi teks yang berbeda
- Memberi bobot pada setiap manipulasi secara berbeda tergantung di mana mereka muncul dalam sebuah kata (manipulasi awal lebih mahal daripada manipulasi yang terlambat)
- Menampilkan daftar hasil yang diurutkan berdasarkan relevansi
Adakah yang pernah menemukan hal seperti ini? Saya menyadari bahwa StackOverflow bukanlah tempat untuk meminta rekomendasi perangkat lunak, tetapi implisit (tidak lagi!) Di atas adalah: apakah saya memikirkannya dengan cara yang benar?
Edit
Saya menemukan makalah yang bagus (pdf) tentang masalah ini. Beberapa catatan dan kutipan:
Fungsi Affine edit-distance menetapkan biaya yang relatif lebih rendah ke urutan penyisipan atau penghapusan
fungsi jarak Monger-Elkan (Monge & Elkan 1996), yang merupakan varian affine dari fungsi jarak Smith-Waterman (Durban et al. 1998) dengan parameter biaya tertentu
Untuk jarak Smith-Waterman (wikipedia) , "Alih-alih melihat urutan total, algoritme Smith-Waterman membandingkan segmen dari semua kemungkinan panjang dan mengoptimalkan ukuran kesamaan." Ini adalah pendekatan n-gram.
Metrik yang sangat mirip, yang tidak didasarkan pada model edit-jarak, adalah metrik Jaro (Jaro 1995; 1989; Winkler 1999). Dalam literatur record-linkage, hasil yang baik telah diperoleh dengan menggunakan varian metode ini, yang didasarkan pada jumlah dan urutan karakter umum antara dua string.
Varian ini karena Winkler (1999) juga menggunakan panjang P dari prefiks umum terpanjang
(tampaknya ditujukan terutama untuk string pendek)
Untuk tujuan pelengkapan teks, pendekatan Monger-Elkan dan Jaro-Winkler tampaknya paling masuk akal. Penambahan Winkler ke metrik Jaro secara efektif membebani awal kata dengan lebih berat. Dan aspek afinitas dari Monger-Elkan berarti bahwa kebutuhan untuk melengkapi sebuah kata (yang hanya merupakan urutan penambahan) tidak akan terlalu menyukainya.
Kesimpulan:
peringkat TFIDF berkinerja terbaik di antara beberapa metrik jarak berbasis token, dan metrik jarak edit affine-gap yang diusulkan oleh Monge dan Elkan berkinerja terbaik di antara beberapa metrik jarak edit string. Metrik jarak yang sangat bagus adalah skema heuristik cepat, yang diusulkan oleh Jaro dan kemudian diperpanjang oleh Winkler. Ini bekerja hampir sebaik skema Monge-Elkan, tetapi urutan besarnya lebih cepat. Salah satu cara sederhana untuk menggabungkan metode TFIDF dan Jaro-Winkler adalah dengan mengganti token yang sama persis yang digunakan dalam TFIDF dengan perkiraan kecocokan token berdasarkan skema Jaro-Winkler. Kombinasi ini berkinerja sedikit lebih baik daripada rata-rata Jaro-Winkler atau TFIDF, dan terkadang berkinerja jauh lebih baik. Ini juga mendekati kinerja untuk kombinasi yang dipelajari dari beberapa metrik terbaik yang dipertimbangkan dalam makalah ini.