Bagaimana cara mendapatkan probabilitas string yang mirip dengan string lain dengan Python?
Saya ingin mendapatkan nilai desimal seperti 0,9 (artinya 90%) dll. Lebih disukai dengan Python dan pustaka standar.
misalnya
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
python
probability
similarity
metric
tenstar
sumber
sumber
Jawaban:
Ada built in.
Menggunakannya:
sumber
SequenceMatcher
vspython-Levenshtein
modul. stackoverflow.com/questions/6690739/…get_close_matches
, meskipun saya menemukansorted(... key=lambda x: difflib.SequenceMatcher(None, x, search).ratio(), ...)
lebih dapat diandalkan, dengansorted(... .get_matching_blocks())[-1] > min_match
pemeriksaan kustomget_closest_matches
). Ini adalah fungsi kenyamanan yang mungkin apa yang Anda cari, AKA membaca dokumen! Dalam aplikasi khusus saya, saya melakukan beberapa pengecekan / pelaporan kesalahan dasar kepada pengguna yang memberikan input buruk, dan jawaban ini memungkinkan saya untuk melaporkan kepada mereka kemungkinan kecocokan dan apa "kesamaan" itu. Namun, jika Anda tidak perlu menampilkan kemiripannya, silakan cekget_closest_matches
Saya pikir mungkin Anda sedang mencari algoritma yang menggambarkan jarak antara string. Inilah beberapa yang mungkin Anda rujuk:
sumber
Solusi # 1: Python builtin
gunakan SequenceMatcher dari difflib
pro : perpustakaan python asli, tidak perlu paket tambahan.
contoh :kontra : terlalu terbatas, ada banyak algoritma bagus lainnya untuk kesamaan string di luar sana.
Solusi # 2: perpustakaan ubur-ubur
ini adalah perpustakaan yang sangat bagus dengan jangkauan yang baik dan beberapa masalah. itu mendukung:
- Jarak Levenshtein - Jarak
Damerau-Levenshtein
- Jarak
Jaro - Jarak Jaro-Winkler
- Perbandingan Pendekatan Penilaian Pertandingan
- Jarak Hamming
pro : mudah digunakan, keseluruhan algoritma yang didukung, diuji.
kontra : bukan perpustakaan asli.
contoh :
sumber
Fuzzy Wuzzy
adalah paket yang mengimplementasikan jarak Levenshtein dalam python, dengan beberapa fungsi pembantu untuk membantu dalam situasi tertentu di mana Anda mungkin ingin dua string berbeda dianggap identik. Sebagai contoh:sumber
Anda dapat membuat fungsi seperti:
sumber
if self.similar(search_string, item.text()) > 0.80:
berfungsi untuk saat ini. Terima kasih,Jarak paket termasuk jarak Levenshtein:
sumber
Builtin
SequenceMatcher
sangat lambat pada input besar, begini caranya bisa dilakukan dengan diff-match-patch :sumber
Catatan,
difflib.SequenceMatcher
hanya menemukan urutan pencocokan berdekatan terpanjang, ini sering kali bukan yang diinginkan, misalnya:Menemukan kesamaan antara dua string terkait erat dengan konsep penyelarasan urutan berpasangan dalam bioinformatika. Ada banyak perpustakaan khusus untuk ini termasuk biopython . Contoh ini mengimplementasikan algoritma Needleman Wunsch :
Menggunakan biopython atau paket bioinformatika lainnya lebih fleksibel daripada bagian mana pun dari pustaka standar python karena banyak skema penilaian dan algoritma yang berbeda tersedia. Anda juga bisa mendapatkan urutan yang cocok untuk memvisualisasikan apa yang terjadi:
sumber
Anda dapat menemukan sebagian besar metode kesamaan teks dan bagaimana mereka dihitung di bawah tautan ini: https://github.com/luozhouyang/python-string-similarity#python-string-similarity Berikut beberapa contoh;
Dinormalisasi, metrik, kesamaan dan jarak
(Normalisasi) kesamaan dan jarak
Jarak metrik
sumber