RapidFuzz adalah pustaka pencocokan string cepat untuk Python dan C++, yang menggunakan penghitungan kesamaan string dari FuzzyWuzzy. Namun ada beberapa aspek yang membedakan RapidFuzz dari FuzzyWuzzy:
Ini berlisensi MIT sehingga dapat digunakan Lisensi apa pun yang Anda ingin pilih untuk proyek Anda, sementara Anda terpaksa mengadopsi lisensi GPL saat menggunakan FuzzyWuzzy
Ini menyediakan banyak string_metrics seperti hamming atau jaro_winkler, yang tidak termasuk dalam FuzzyWuzzy
Sebagian besar ditulis dalam C++ dan yang terpenting, dilengkapi dengan banyak peningkatan Algoritma untuk membuat pencocokan string menjadi lebih cepat, namun tetap memberikan hasil yang sama. Untuk tolok ukur terperinci, periksa dokumentasi
Memperbaiki beberapa bug dalam implementasi partial_ratio
Hal ini sebagian besar dapat digunakan sebagai pengganti fuzzywuzzy
. Namun ada beberapa perbedaan API yang dijelaskan di sini
Python 3.9 atau lebih baru
Di Windows, Visual C++ 2019 yang dapat didistribusikan ulang diperlukan
Ada beberapa cara untuk menginstal RapidFuzz, metode yang disarankan adalah menggunakan pip
(manajer paket Python) atau conda
(manajer paket sumber terbuka, lintas platform)
RapidFuzz dapat diinstal dengan pip
dengan cara berikut:
pip instal rapidfuzz
Ada binari (roda) RapidFuzz yang sudah dibuat sebelumnya untuk MacOS (10.9 dan lebih baru), Linux x86_64 dan Windows. Roda untuk armv6l (Raspberry Pi Zero) dan armv7l (Raspberry Pi) tersedia di piwheels.
✖️ kegagalan "ImportError: pemuatan DLL gagal"
Jika Anda mengalami kesalahan ini di Windows, kemungkinan besar alasannya adalah Visual C++ 2019 redistributable tidak diinstal, yang diperlukan untuk menemukan Perpustakaan C++ (Versi C++ 2019 mencakup versi 2015, 2017, dan 2019).
RapidFuzz dapat diinstal dengan conda
:
conda install -c conda-forge rapidfuzz
RapidFuzz dapat diinstal langsung dari distribusi sumber dengan mengkloning repositori. Ini membutuhkan kompiler berkemampuan C++17.
git clone --rekursif https://github.com/rapidfuzz/rapidfuzz.gitcd rapidfuzz pemasangan pip.
Beberapa fungsi sederhana ditunjukkan di bawah ini. Dokumentasi lengkap semua fungsi dapat ditemukan di sini.
Perhatikan bahwa dari RapidFuzz 3.0.0, string tidak diproses sebelumnya (menghapus semua karakter non alfanumerik, memangkas spasi, mengubah semua karakter menjadi huruf kecil) secara default. Artinya ketika membandingkan dua string yang memiliki karakter yang sama tetapi kasusnya berbeda ("ini adalah sebuah kata", "INI ADALAH KATA") nilai skor kesamaannya mungkin berbeda, jadi ketika membandingkan string tersebut Anda mungkin melihat perbedaan skor nilai dibandingkan dengan versi sebelumnya. Beberapa contoh pencocokan string dengan preprocessing dapat ditemukan di sini.
Pencetak gol di RapidFuzz dapat ditemukan di modul fuzz
dan distance
.
> dari rapidfuzz import fuzz> fuzz.ratio("ini adalah ujian", "ini adalah ujian!")96.55172413793103
> dari rapidfuzz import fuzz> fuzz.partial_ratio("ini adalah ujian", "ini adalah ujian!")100.0
> dari rapidfuzz import fuzz> fuzz.ratio("fuzzy wuzzy adalah beruang", "wuzzy fuzzy adalah beruang")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy adalah beruang", "wuzzy fuzzy adalah beruang")100.0
> dari rapidfuzz import fuzz> fuzz.token_sort_ratio("fuzzy adalah beruang", "fuzzy fuzzy adalah beruang")84.21052631578947> fuzz.token_set_ratio("fuzzy adalah beruang", "fuzzy fuzzy adalah beruang")100.0# Pengembalian 100.0 jika satu string adalah subset dari string lainnya, terlepas dari konten tambahan di string yang lebih panjang> fuzz.token_set_ratio("fuzzy adalah seekor beruang tetapi bukan seekor anjing", "fuzzy adalah seekor beruang")100.0# Skor dikurangi hanya ketika ada ketidaksepakatan yang jelas dalam dua string> fuzz.token_set_ratio("fuzzy adalah seekor beruang tetapi bukan seekor anjing", "fuzzy itu beruang tapi bukan kucing")92.3076923076923
> dari rapidfuzz import fuzz> fuzz.WRatio("ini adalah ujian", "ini adalah ujian baru!!!")85.5> dari rapidfuzz import fuzz, utils> # Menghapus karakter non alfanumerik("!") dari string> fuzz.WRatio("ini adalah ujian", "ini adalah ujian baru!!!", processor=utils.default_process) # di sini "ini adalah ujian baru!!!" diubah menjadi "ini adalah tes baru"95.0> fuzz.WRatio("ini adalah tes", "ini adalah tes baru")95.0> # Mengubah string menjadi huruf kecil> fuzz.WRatio("ini adalah sebuah kata" , "INI ADALAH KATA")21.42857142857143> fuzz.WRatio("ini adalah sebuah kata", "INI ADALAH sebuah KATA", processor=utils.default_process) # di sini "INI ADALAH KATA" diubah menjadi "ini adalah sebuah kata"100.0
> dari rapidfuzz import fuzz> fuzz.QRatio("ini adalah ujian", "ini adalah ujian baru!!!")80.0> dari rapidfuzz import fuzz, utils> # Menghapus karakter non alfanumerik("!") dari string> fuzz.QRatio("ini adalah ujian", "ini adalah ujian baru!!!", processor=utils.default_process)87.5> fuzz.QRatio("ini adalah ujian", "ini adalah tes baru")87.5> # Mengubah string menjadi huruf kecil> fuzz.QRatio("ini adalah sebuah kata", "INI ADALAH KATA")21.42857142857143> fuzz.QRatio("ini adalah sebuah kata", "INI ADALAH KATA", prosesor=utils.default_process)100.0
Modul proses membuatnya membandingkan string dengan daftar string. Ini umumnya lebih berperforma dibandingkan menggunakan pencetak gol langsung dari Python. Berikut beberapa contoh penggunaan prosesor di RapidFuzz:
> dari proses impor rapidfuzz, fuzz> pilihan = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]> process.extract("new york jets", pilihan, scorer=fuzz. WRatio, batas=2)[('New York Jets', 76.92307692307692, 1), ('New York Giants', 64.28571428571428, 2)]> process.extractOne("cowboys", pilihan, scorer=fuzz.WRatio)('Dallas Cowboys', 83.07692307692308, 3)> # Dengan preprocessing> dari proses impor rapidfuzz, fuzz, utils> process.extract( "new york jets", pilihan, pencetak gol=fuzz.WRatio, batas=2, prosesor=utils.default_process)[('New York Jets', 100.0, 1), ('New York Giants', 78.57142857142857, 2)]> process.extractOne("cowboys", pilihan, pencetak gol=fuzz.WRatio, prosesor=utils.default_process)('Dallas Koboi, 90.0, 3)
Dokumentasi lengkap tentang prosesor dapat ditemukan di sini
Tolok ukur berikut memberikan perbandingan kinerja cepat antara RapidFuzz dan FuzzyWuzzy. Tolok ukur yang lebih detail untuk metrik string dapat ditemukan di dokumentasi. Untuk perbandingan sederhana ini saya membuat daftar 10.000 string dengan panjang 10, yang dibandingkan dengan sampel 100 elemen dari daftar ini:
kata-kata = ["".join(random.choice(string.ascii_letters + string.digits) untuk _ dalam rentang(10))untuk _ dalam rentang(10_000) ]sampel = kata[:: len(kata) // 100]
Benchmark pertama membandingkan performa pencetak skor di FuzzyWuzzy dan RapidFuzz ketika digunakan langsung dari Python dengan cara berikut:
untuk sampel dalam sampel:untuk kata dalam kata-kata:pencetak gol(sampel, kata)
Grafik berikut menunjukkan berapa banyak elemen yang diproses per detik dengan masing-masing pencetak skor. Ada perbedaan kinerja yang besar antara pencetak gol yang berbeda. Namun masing-masing pencetak gol lebih cepat di RapidFuzz
Tolok ukur kedua membandingkan kinerja ketika pencetak skor digunakan bersama dengan cdist dengan cara berikut:
cdist(sampel, kata, pencetak gol=pencetak gol)
Grafik berikut menunjukkan berapa banyak elemen yang diproses per detik dengan masing-masing pencetak skor. Di RapidFuzz penggunaan pencetak gol melalui prosesor seperti cdist
jauh lebih cepat daripada menggunakannya secara langsung. Itu sebabnya mereka harus digunakan bila memungkinkan.
Jika Anda menggunakan RapidFuzz untuk pekerjaan Anda dan ingin memberikan sedikit keuntungan Anda sendiri untuk mendukung proyek tersebut, pertimbangkan untuk mengirimkan uang kepada kami melalui GitHub Sponsor atau PayPal yang dapat kami gunakan untuk memberi kami waktu luang untuk pemeliharaan perpustakaan hebat ini, untuk memperbaiki bug dalam perangkat lunak, meninjau dan mengintegrasikan kontribusi kode, untuk meningkatkan fitur dan dokumentasinya, atau sekadar menarik napas dalam-dalam dan minum teh sesekali. Terima kasih atas dukungan Anda.
Dukung proyek melalui Sponsor GitHub atau melalui PayPal:
RapidFuzz dilisensikan di bawah lisensi MIT karena saya yakin setiap orang dapat menggunakannya tanpa dipaksa untuk mengadopsi lisensi GPL. Itu sebabnya perpustakaan ini didasarkan pada fuzzywuzzy versi lama yang juga berlisensi MIT. Fuzzywuzzy versi lama ini dapat ditemukan di sini.