RapidFuzz est une bibliothèque de correspondance de chaînes rapide pour Python et C++, qui utilise les calculs de similarité de chaînes de FuzzyWuzzy. Cependant, il y a quelques aspects qui distinguent RapidFuzz de FuzzyWuzzy :
Il est sous licence MIT et peut donc être utilisé quelle que soit la licence que vous souhaitez choisir pour votre projet, tandis que vous êtes obligé d'adopter la licence GPL lorsque vous utilisez FuzzyWuzzy.
Il fournit de nombreuses string_metrics comme hamming ou jaro_winkler, qui ne sont pas incluses dans FuzzyWuzzy.
Il est principalement écrit en C++ et comporte en outre de nombreuses améliorations algorithmiques pour rendre la correspondance de chaînes encore plus rapide, tout en fournissant les mêmes résultats. Pour des benchmarks détaillés, consultez la documentation
Corrige plusieurs bugs dans l'implémentation partial_ratio
Il peut être largement utilisé en remplacement de fuzzywuzzy
. Cependant, il existe quelques différences entre les API décrites ici
Python 3.9 ou version ultérieure
Sous Windows, le redistribuable Visual C++ 2019 est requis
Il existe plusieurs façons d'installer RapidFuzz, les méthodes recommandées sont d'utiliser soit pip
(le gestionnaire de packages Python), soit conda
(un gestionnaire de packages open source et multiplateforme).
RapidFuzz peut être installé avec pip
de la manière suivante :
pip installer rapidfuzz
Il existe des binaires (roues) prédéfinis de RapidFuzz pour MacOS (10.9 et versions ultérieures), Linux x86_64 et Windows. Des roues pour armv6l (Raspberry Pi Zero) et armv7l (Raspberry Pi) sont disponibles sur piwheels.
✖️ échec "ImportError : échec du chargement de la DLL"
Si vous rencontrez cette erreur sous Windows, la raison est très probablement que le redistribuable Visual C++ 2019 n'est pas installé, ce qui est nécessaire pour trouver les bibliothèques C++ (la version C++ 2019 inclut les versions 2015, 2017 et 2019).
RapidFuzz peut être installé avec conda
:
conda install -c conda-forge rapidfuzz
RapidFuzz peut être installé directement à partir de la distribution source en clonant le référentiel. Cela nécessite un compilateur compatible C++17.
git clone --récursif https://github.com/rapidfuzz/rapidfuzz.gitcd rapidfuzz pip installer.
Quelques fonctions simples sont présentées ci-dessous. Une documentation complète de toutes les fonctions peut être trouvée ici.
Notez qu'à partir de RapidFuzz 3.0.0, les chaînes ne sont pas prétraitées (suppression de tous les caractères non alphanumériques, suppression des espaces, conversion de tous les caractères en minuscules) par défaut. Ce qui signifie que lorsque l'on compare deux chaînes qui ont les mêmes caractères mais des casses différentes ("ceci est un mot", "CECI EST UN MOT"), leur valeur de score de similarité peut être différente, donc lorsque vous comparez de telles chaînes, vous pouvez voir une différence de score. valeur par rapport aux versions précédentes. Quelques exemples de correspondance de chaînes avec prétraitement peuvent être trouvés ici.
Les marqueurs de RapidFuzz peuvent être trouvés dans les modules fuzz
et distance
.
> depuis rapidfuzz import fuzz> fuzz.ratio("c'est un test", "c'est un test !")96.55172413793103
> depuis rapidfuzz import fuzz> fuzz.partial_ratio("c'est un test", "c'est un test !")100.0
> from rapidfuzz import fuzz> fuzz.ratio("fuzzy wuzzy était un ours", "wuzzy fuzzy était un ours")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy était un ours", "wuzzy fuzzy était un ours")100.0
> from rapidfuzz import fuzz> fuzz.token_sort_ratio("fuzzy était un ours", "fuzzy fuzzy était un ours")84.21052631578947> fuzz.token_set_ratio("fuzzy était un ours", "fuzzy fuzzy était un ours")100.0# Renvoie 100.0 si une chaîne est un sous-ensemble de l'autre, quel que soit le contenu supplémentaire de la chaîne la plus longue > fuzz.token_set_ratio("fuzzy était un ours mais pas un chien", "fuzzy était un ours")100.0# Le score n'est réduit que lorsqu'il y a un désaccord explicite entre les deux chaînes> fuzz.token_set_ratio("fuzzy était un ours mais pas un chien "chien", "fuzzy était un ours mais pas un chat")92.3076923076923
> from rapidfuzz import fuzz> fuzz.WRatio("this is a test", "this is a new test !!!")85.5> from rapidfuzz import fuzz, utils> # Suppression des caractères non alphanumériques ("!") du string> fuzz.WRatio("c'est un test", "c'est un nouveau test !!!", processeur=utils.default_process) # ici "c'est un nouveau test !!!" est converti en "ceci est un nouveau test"95.0> fuzz.WRatio("ceci est un test", "ceci est un nouveau test")95.0> # Conversion d'une chaîne en minuscules> fuzz.WRatio("ceci est un mot" , "CECI EST UN MOT")21.42857142857143> fuzz.WRatio("ceci est un mot", "CECI EST UN MOT", processeur=utils.default_process) # ici "CECI EST UN MOT" est converti en "ceci est un mot"100,0
> from rapidfuzz import fuzz> fuzz.QRatio("this is a test", "this est un nouveau test !!!")80.0> from rapidfuzz import fuzz, utils> # Suppression des caractères non alphanumériques ("!") du string> fuzz.QRatio("ceci est un test", "ceci est un nouveau test !!!", processeur=utils.default_process)87.5> fuzz.QRatio("ceci est un test", "ceci est un nouveau test")87.5> # Conversion d'une chaîne en minuscules> fuzz.QRatio("ceci est un mot", "CECI EST UN MOT")21.42857142857143> fuzz.QRatio("ceci est un mot", "CECI EST UN MOT ", processeur=utils.default_process)100.0
Le module process lui permet de comparer des chaînes à des listes de chaînes. C'est généralement plus performant que d'utiliser les scoreurs directement depuis Python. Voici quelques exemples d'utilisation des processeurs dans RapidFuzz :
> à partir du processus d'importation rapidfuzz, fuzz> choix = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]> process.extract("new york jets", choix, scorer=fuzz. WRatio, limite = 2)[('New York Jets', 76.92307692307692, 1), ('New York Giants', 64.28571428571428, 2)]> process.extractOne("cowboys", choix, scorer=fuzz.WRatio)('Dallas Cowboys', 83.07692307692308, 3)> # Avec prétraitement> du processus d'importation rapidfuzz, fuzz, utils> process.extract( "New York Jets", choix, scorer=fuzz.WRatio, limit=2, processeur=utils.default_process)[('New York Jets', 100.0, 1), ('New York Giants', 78.57142857142857, 2)]> process.extractOne("cowboys", choix, scorer=fuzz.WRatio, processeur=utils.default_process)('Dallas Cowboys', 90,0, 3)
La documentation complète des processeurs peut être trouvée ici
Le benchmark suivant donne une comparaison rapide des performances entre RapidFuzz et FuzzyWuzzy. Des références plus détaillées pour les métriques de chaîne peuvent être trouvées dans la documentation. Pour cette simple comparaison, j'ai généré une liste de 10 000 chaînes de longueur 10, comparée à un échantillon de 100 éléments de cette liste :
mots = ["".join(random.choice(string.ascii_letters + string.digits) pour _ dans la plage(10))pour _ dans la plage(10_000) ]échantillons = mots[:: len(mots) // 100]
Le premier benchmark compare les performances des scoreurs dans FuzzyWuzzy et RapidFuzz lorsqu'ils sont utilisés directement depuis Python de la manière suivante :
pour échantillon dans échantillons : pour mot dans mots : scoreur (échantillon, mot)
Le graphique suivant montre combien d'éléments sont traités par seconde avec chacun des marqueurs. Il existe de grandes différences de performances entre les différents buteurs. Cependant chacun des buteurs est plus rapide dans RapidFuzz
Le deuxième benchmark compare les performances lorsque les scoreurs sont utilisés en combinaison avec cdist de la manière suivante :
cdist(échantillons, mots, scorer=scorer)
Le graphique suivant montre combien d'éléments sont traités par seconde avec chacun des marqueurs. Dans RapidFuzz, l'utilisation des buteurs via des processeurs comme cdist
est beaucoup plus rapide que leur utilisation directe. C'est pourquoi ils doivent être utilisés autant que possible.
Si vous utilisez RapidFuzz pour votre travail et que vous avez envie de redonner un peu de vos propres bénéfices pour soutenir le projet, pensez à nous envoyer de l'argent via les sponsors GitHub ou PayPal que nous pouvons utiliser pour nous gagner du temps libre pour la maintenance de cette superbe bibliothèque, pour corriger des bugs dans le logiciel, réviser et intégrer des contributions de code, pour améliorer ses fonctionnalités et sa documentation, ou simplement prendre une profonde respiration et prendre une tasse de thé de temps en temps. Merci pour votre soutien.
Soutenez le projet via les sponsors GitHub ou via PayPal :
RapidFuzz est sous licence MIT car je pense que tout le monde devrait pouvoir l'utiliser sans être obligé d'adopter la licence GPL. C'est pourquoi la bibliothèque est basée sur une ancienne version de fuzzywuzzy qui était également sous licence MIT. Cette ancienne version de fuzzywuzzy peut être trouvée ici.