RapidFuzz ist eine schnelle String-Matching-Bibliothek für Python und C++, die die String-Ähnlichkeitsberechnungen von FuzzyWuzzy verwendet. Es gibt jedoch einige Aspekte, die RapidFuzz von FuzzyWuzzy unterscheiden:
Es ist MIT-lizenziert und kann daher unabhängig von der Lizenz verwendet werden, die Sie für Ihr Projekt wählen möchten. Bei der Verwendung von FuzzyWuzzy sind Sie jedoch gezwungen, die GPL-Lizenz zu übernehmen
Es stellt viele string_metrics wie hamming oder jaro_winkler bereit, die nicht in FuzzyWuzzy enthalten sind
Es ist größtenteils in C++ geschrieben und enthält darüber hinaus viele algorithmische Verbesserungen, um den String-Abgleich noch schneller zu machen und dennoch die gleichen Ergebnisse zu liefern. Detaillierte Benchmarks finden Sie in der Dokumentation
Behebt mehrere Fehler in der partial_ratio
-Implementierung
Es kann größtenteils als Drop-in-Ersatz für fuzzywuzzy
verwendet werden. Allerdings werden hier einige API-Unterschiede beschrieben
Python 3.9 oder höher
Unter Windows ist die Redistributable Visual C++ 2019 erforderlich
Es gibt mehrere Möglichkeiten, RapidFuzz zu installieren. Die empfohlenen Methoden sind entweder die Verwendung von pip
(dem Python-Paketmanager) oder conda
(einem plattformübergreifenden Open-Source-Paketmanager).
RapidFuzz kann mit pip
folgendermaßen installiert werden:
pip install rapidfuzz
Es gibt vorgefertigte Binärdateien (Räder) von RapidFuzz für MacOS (10.9 und höher), Linux x86_64 und Windows. Räder für armv6l (Raspberry Pi Zero) und armv7l (Raspberry Pi) sind auf Piwheels erhältlich.
✖️ Fehler „ImportError: DLL-Laden fehlgeschlagen“
Wenn dieser Fehler unter Windows auftritt, liegt der Grund höchstwahrscheinlich darin, dass die Redistributable Visual C++ 2019 nicht installiert ist, die zum Auffinden von C++-Bibliotheken erforderlich ist (die C++ 2019-Version umfasst die Versionen 2015, 2017 und 2019).
RapidFuzz kann mit conda
installiert werden:
conda install -c conda-forge rapidfuzz
RapidFuzz kann direkt aus der Quelldistribution installiert werden, indem das Repository geklont wird. Dies erfordert einen C++17-fähigen Compiler.
git clone --recursive https://github.com/rapidfuzz/rapidfuzz.gitcd rapidfuzz pip install .
Nachfolgend sind einige einfache Funktionen aufgeführt. Eine vollständige Dokumentation aller Funktionen finden Sie hier.
Beachten Sie, dass Zeichenfolgen ab RapidFuzz 3.0.0 standardmäßig nicht vorverarbeitet werden (Entfernen aller nicht alphanumerischen Zeichen, Entfernen von Leerzeichen, Konvertieren aller Zeichen in Kleinbuchstaben). Das bedeutet, dass beim Vergleich zweier Zeichenfolgen, die dieselben Zeichen, aber unterschiedliche Groß- und Kleinschreibung enthalten („dies ist ein Wort“, „DIES IST EIN WORT“), deren Ähnlichkeitsbewertungswert unterschiedlich sein kann. Wenn Sie solche Zeichenfolgen vergleichen, können Sie daher einen Unterschied in der Bewertung feststellen Wert im Vergleich zu früheren Versionen. Einige Beispiele für String-Matching mit Vorverarbeitung finden Sie hier.
Punktezähler in RapidFuzz sind in den Modulen fuzz
und distance
zu finden.
> from rapidfuzz import fuzz> fuzz.ratio("das ist ein Test", "das ist ein Test!")96.55172413793103
> from rapidfuzz import fuzz> fuzz.partial_ratio("das ist ein Test", "das ist ein Test!")100.0
> from rapidfuzz import fuzz> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")100.0
> from rapidfuzz import fuzz> fuzz.token_sort_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")84.21052631578947> fuzz.token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")100.0# Gibt 100,0 zurück wenn eine Zeichenfolge eine Teilmenge der anderen ist, unabhängig vom zusätzlichen Inhalt in die längere Zeichenfolge> fuzz.token_set_ratio("fuzzy war ein Bär, aber kein Hund", "fuzzy war ein Bär")100.0# Die Punktzahl wird nur reduziert, wenn in den beiden Zeichenfolgen explizite Unstimmigkeiten bestehen.> fuzz.token_set_ratio("fuzzy war ein Bär, aber kein Hund“, „Fuzzy war ein Bär, aber keine Katze“)92.3076923076923
> from rapidfuzz import fuzz> fuzz.WRatio("this is a test", "this is a new test!!!")85.5> from rapidfuzz import fuzz, utils> # Entfernen nicht alphanumerischer Zeichen("!") aus dem string> fuzz.WRatio("das ist ein Test", "das ist ein neuer Test!!!", Prozessor=utils.default_process) # hier "das ist ein neuer Test!!!" wird in „das ist ein neuer Test“ umgewandelt95.0> fuzz.WRatio(“das ist ein Test“, „das ist ein neuer Test“)95.0> # String in Kleinbuchstaben umwandeln> fuzz.WRatio(“das ist ein Wort“ , „DIES IST EIN WORT“)21.42857142857143> fuzz.WRatio(“dies ist ein Wort“, „DIES IST EIN WORT“, Prozessor=utils.default_process) # hier wird „THIS IS A WORD“ in „This is a word“ 100.0 umgewandelt
> from rapidfuzz import fuzz> fuzz.QRatio("this is a test", "this is a new test!!!")80.0> from rapidfuzz import fuzz, utils> # Entfernen nicht alphanumerischer Zeichen("!") aus dem string> fuzz.QRatio("das ist ein Test", "das ist ein neuer Test!!!", Prozessor=utils.default_process)87.5> fuzz.QRatio("das ist ein Test", "das ist ein neuer Test")87.5> # String in Kleinbuchstaben umwandeln> fuzz.QRatio("das ist ein Wort", "THIS IS A WORD")21.42857142857143> fuzz.QRatio("this is a word", "THIS IST EIN WORT", Prozessor=utils.default_process)100.0
Das Prozessmodul ermöglicht den Vergleich von Zeichenfolgen mit Zeichenfolgenlisten. Dies ist im Allgemeinen leistungsfähiger als die Verwendung der Scorer direkt aus Python. Hier einige Beispiele zur Verwendung von Prozessoren in RapidFuzz:
> aus dem Rapidfuzz-Importprozess, fuzz>choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]>process.extract("new york jets",choices,scorer=fuzz. WRatio, limit=2)[('New York Jets', 76.92307692307692, 1), ('New York Giants', ( „New York Jets“, Entscheidungen, Scorer=fuzz.WRatio, Limit=2, Processor=utils.default_process)[('New York Jets', 100.0, 1), ('New York Giants', 78.57142857142857, 2)]> Process.extractOne("Cowboys", Entscheidungen, Scorer=fuzz.WRatio, Prozessor=utils.default_process)('Dallas Cowboys', 90,0, 3)
Die vollständige Dokumentation der Prozessoren finden Sie hier
Der folgende Benchmark bietet einen schnellen Leistungsvergleich zwischen RapidFuzz und FuzzyWuzzy. Detailliertere Benchmarks für die String-Metriken finden Sie in der Dokumentation. Für diesen einfachen Vergleich habe ich eine Liste mit 10.000 Strings der Länge 10 erstellt, die mit einer Stichprobe von 100 Elementen aus dieser Liste verglichen wird:
Wörter = ["".join(random.choice(string.ascii_letters + string.digits) for _ in range(10))for _ in range(10_000) ]samples = Wörter[:: len(Wörter) // 100]
Der erste Benchmark vergleicht die Leistung der Scorer in FuzzyWuzzy und RapidFuzz, wenn sie direkt aus Python auf folgende Weise verwendet werden:
für Beispiel in Beispielen:für Wort in Worten:Scorer(Beispiel, Wort)
Die folgende Grafik zeigt, wie viele Elemente pro Sekunde mit jedem der Scorer verarbeitet werden. Es gibt große Leistungsunterschiede zwischen den verschiedenen Torschützen. Allerdings ist jeder der Punktezähler in RapidFuzz schneller
Der zweite Benchmark vergleicht die Leistung bei Verwendung der Scorer in Kombination mit cdist auf folgende Weise:
cdist(Samples, Wörter, Scorer=Scorer)
Die folgende Grafik zeigt, wie viele Elemente pro Sekunde mit jedem der Scorer verarbeitet werden. In RapidFuzz ist die Verwendung von Scorern durch Prozessoren wie cdist
viel schneller als die direkte Verwendung. Deshalb sollten sie wann immer möglich genutzt werden.
Wenn Sie RapidFuzz für Ihre Arbeit verwenden und Lust haben, einen Teil Ihres eigenen Nutzens zurückzugeben, um das Projekt zu unterstützen, denken Sie darüber nach, uns Geld über GitHub-Sponsoren oder PayPal zu senden, damit wir uns freie Zeit für die Wartung dieser großartigen Bibliothek verschaffen können. um Fehler in der Software zu beheben, Codebeiträge zu überprüfen und zu integrieren, ihre Funktionen und Dokumentation zu verbessern oder einfach ab und zu tief durchzuatmen und eine Tasse Tee zu trinken. Vielen Dank für Ihre Unterstützung.
Unterstützen Sie das Projekt über GitHub-Sponsoren oder über PayPal:
RapidFuzz ist unter der MIT-Lizenz lizenziert, da ich der Meinung bin, dass jeder es nutzen können sollte, ohne gezwungen zu sein, die GPL-Lizenz zu übernehmen. Aus diesem Grund basiert die Bibliothek auf einer älteren Version von Fuzzywuzzy, die ebenfalls vom MIT lizenziert wurde. Diese alte Version von Fuzzywuzzy finden Sie hier.