Saya mencari algoritma kesamaan string yang menghasilkan hasil yang lebih baik pada string panjang variabel daripada yang biasanya disarankan (levenshtein distance, soundex, dll).
Sebagai contoh,
Diberikan string A: "Robert",
Kemudian string B: "Amy Robertson"
akan menjadi pertandingan yang lebih baik daripada
String C: "Richard"
Juga, lebih disukai, algoritma ini harus agnostik bahasa (juga berfungsi dalam bahasa selain bahasa Inggris).
string-matching
ranking
similarity
fuzzy-search
marzagao
sumber
sumber
Jawaban:
Simon White dari Catalysoft menulis artikel tentang algoritma yang sangat pintar yang membandingkan pasangan karakter yang berdekatan yang bekerja sangat baik untuk tujuan saya:
http://www.catalysoft.com/articles/StrikeAMatch.html
Simon memiliki algoritma versi Java dan di bawah ini saya menulis versi PL / Ruby-nya (diambil dari versi ruby biasa yang dilakukan di komentar entri forum terkait oleh Mark Wong-VanHaren) sehingga saya dapat menggunakannya dalam kueri PostgreSQL saya:
Bekerja seperti pesona!
sumber
string_similarity("vitamin B", "vitamin C") #=> 1
apakah ada cara mudah untuk mencegah perilaku semacam ini?Jawaban marzagao luar biasa. Saya mengonversinya menjadi C # jadi saya pikir saya akan mempostingnya di sini:
Tautan Pastebin
sumber
(2.0 * intersection) / union
- Saya mendapatkan Double.NaN saat membandingkan dua string kosong.Ini adalah versi lain dari jawaban marzagao , yang ini ditulis dengan Python:
sumber
Inilah implementasi PHP saya dari algoritma StrikeAMatch yang disarankan, oleh Simon White. keuntungannya (seperti yang tertulis di tautan) adalah:
Sebuah refleksi sejati dari kesamaan leksikal - string dengan perbedaan kecil harus diakui sebagai yang serupa. Secara khusus, tumpang tindih substrat yang signifikan harus menunjukkan tingkat kesamaan yang tinggi antara string.
Ketangguhan untuk perubahan urutan kata - dua string yang berisi kata-kata yang sama, tetapi dalam urutan yang berbeda, harus diakui sama. Di sisi lain, jika satu string hanyalah anagram acak dari karakter yang terkandung dalam yang lain, maka harus (biasanya) diakui sebagai berbeda.
Kemandirian Bahasa - algoritma harus bekerja tidak hanya dalam bahasa Inggris, tetapi dalam banyak bahasa yang berbeda.
sumber
Versi singkat dari jawaban John Rutledge :
sumber
intersection
variabelnya adalah baris limbah.Diskusi ini sangat membantu, terima kasih. Saya mengonversi algoritme menjadi VBA untuk digunakan dengan Excel dan menulis beberapa versi fungsi lembar kerja, satu untuk perbandingan sederhana sepasang string, yang lain untuk membandingkan satu string dengan rentang / array string. Versi strSimLookup mengembalikan kecocokan terbaik terakhir sebagai string, indeks array, atau metrik kesamaan.
Implementasi ini menghasilkan hasil yang sama dengan yang tercantum dalam contoh Amazon di situs web Simon White dengan beberapa pengecualian kecil pada pertandingan dengan skor rendah; tidak yakin di mana perbedaannya merayap, bisa menjadi fungsi Split VBA, tapi saya belum menyelidiki karena berfungsi dengan baik untuk tujuan saya.
sumber
Maaf, jawabannya tidak ditemukan oleh penulis. Ini adalah algoritma terkenal yang pertama kali hadir oleh Digital Equipment Corporation dan sering disebut sebagai shingling.
http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-TN-1997-015.pdf
sumber
Saya menerjemahkan algoritma Simon White ke PL / pgSQL. Ini kontribusi saya.
sumber
String Similarity Metrics berisi ikhtisar dari berbagai metrik yang digunakan dalam perbandingan string ( Wikipedia juga memiliki ikhtisar). Banyak dari metrik ini diimplementasikan dalam simmetrik perpustakaan .
Contoh metrik lain, yang tidak termasuk dalam ikhtisar yang diberikan adalah misalnya jarak kompresi (mencoba memperkirakan kompleksitas Kolmogorov ), yang dapat digunakan untuk teks yang sedikit lebih panjang daripada yang Anda sajikan.
Anda mungkin juga mempertimbangkan untuk melihat subjek yang jauh lebih luas dari Pemrosesan Bahasa Alami . Paket R ini dapat membantu Anda memulai dengan cepat (atau setidaknya memberikan beberapa ide).
Dan satu edit terakhir - cari pertanyaan lain tentang hal ini di SO, ada beberapa yang terkait.
sumber
Algoritma PHP versi yang lebih cepat:
Untuk data yang saya miliki (sekitar 2.300 perbandingan) saya memiliki waktu berjalan 0,58 dtk dengan larutan Igal Alkon versus 0,35 dtk dengan milik saya.
sumber
Versi dalam Scala yang indah:
sumber
Ini adalah versi R:
sumber
Posting jawaban marzagao di C99, terinspirasi oleh algoritma ini
Beberapa tes berdasarkan pada artikel asli :
sumber
Membangun versi C # Michael La Voie yang luar biasa, sesuai permintaan untuk menjadikannya metode ekstensi, inilah yang saya kemukakan. Manfaat utama melakukannya dengan cara ini adalah Anda dapat mengurutkan Daftar Generik berdasarkan kecocokan persen. Misalnya, pertimbangkan Anda memiliki bidang string bernama "Kota" di objek Anda. Seorang pengguna mencari "Chester" dan Anda ingin mengembalikan hasil dalam urutan pertandingan yang menurun. Misalnya, Anda ingin pertandingan harfiah Chester muncul sebelum Rochester. Untuk melakukan ini, tambahkan dua properti baru ke objek Anda:
Kemudian pada setiap objek, atur SearchText ke apa yang dicari pengguna. Maka Anda dapat mengurutkannya dengan mudah seperti:
Berikut sedikit modifikasi untuk menjadikannya metode ekstensi:
sumber
Implementasi JavaScript saya mengambil string atau array string, dan lantai opsional (lantai default adalah 0,5). Jika Anda memberikannya string, itu akan mengembalikan benar atau salah tergantung pada apakah skor kesamaan string lebih besar atau sama dengan lantai. Jika Anda memberinya array string, itu akan mengembalikan array string yang skor kemiripannya lebih besar atau sama dengan lantai, diurutkan berdasarkan skor.
Contoh:
Ini dia:
sumber
for(var j = 0; j < pairs1.length; j++){
seharusnyafor(var j = 0; j < pairs2.length; j++){
Algoritme koefisien Dice (jawaban Simon White / marzagao) diimplementasikan di Ruby dalam metode pair_distance_similar di permata amatch
https://github.com/flori/amatch
Permata ini juga berisi implementasi dari sejumlah pencocokan perkiraan dan algoritma perbandingan string: jarak edit Levenshtein, jarak edit Penjual, jarak Hamming, panjang urutan umum terpanjang, panjang substring umum terpanjang, metrik jarak pasangan, metrik jarak pasangan, metrik Jaro-Winkler .
sumber
Versi Haskell — silakan menyarankan pengeditan karena saya belum banyak melakukan Haskell.
sumber
Clojure:
sumber
Bagaimana dengan jarak Levenshtein, dibagi dengan panjang string pertama (atau sebagai alternatif, dibagi panjang min / maks / rata-rata kedua string)? Sejauh ini itu berhasil bagi saya.
sumber
Hai teman-teman saya mencoba ini di javascript, tapi saya baru mengenalnya, ada yang tahu cara cepat untuk melakukannya?
sumber
x
dany
, dan Anda tidak harus mengulang loop menggunakanfor..in..
loop (gunakanfor(..;..;..)
saja).Berikut adalah versi lain dari Kesamaan berdasarkan indeks Sørensen-Dice (jawaban marzagao), yang ini ditulis dalam C ++ 11:
sumber
Saya sedang mencari implementasi ruby murni dari algoritma yang ditunjukkan oleh jawaban @ marzagao. Sayangnya, tautan yang ditunjukkan oleh @marzagao rusak. Dalam jawaban @ s01ipsist, ia menunjukkan ruby gem amatch di mana implementasi tidak dalam ruby murni. Jadi saya mencari sedikit dan menemukan permata fuzzy_match yang memiliki implementasi ruby murni (meskipun menggunakan permata ini
amatch
) di sini . Saya harap ini akan membantu orang seperti saya.sumber