Passen Sie Fuzzy-String in Python an

Salman Mehmood 10 Oktober 2023
  1. Verwenden Sie das thefuzz-Modul, um Fuzzy-Strings in Python abzugleichen
  2. Verwenden Sie das Modul process, um Fuzzy String Match auf effiziente Weise zu verwenden
Passen Sie Fuzzy-String in Python an

Heute werden wir lernen, wie man die thefuzz-Bibliothek verwendet, die es uns ermöglicht, Fuzzy-String-Matching in Python durchzuführen. Außerdem werden wir lernen, wie man das Modul process verwendet, das es uns ermöglicht, Strings mit Hilfe der Fuzzy-String-Logik effizient abzugleichen oder zu extrahieren.

Verwenden Sie das thefuzz-Modul, um Fuzzy-Strings in Python abzugleichen

Diese Bibliothek hat mit der älteren Version einen komischen Namen, weil sie einen bestimmten Namen hatte, der umbenannt wurde. Jetzt wird also ein anderes Repository verwaltet; Die aktuelle Version heißt jedoch thefuzz, also können Sie dies installieren, indem Sie dem folgenden Befehl folgen.

pip install thefuzz

Aber wenn Sie sich online Beispiele ansehen, werden Sie einige Beispiele mit dem alten Namen fuzzywuzzy finden. Es wird also nicht mehr gepflegt und ist veraltet, aber Sie finden vielleicht einige Beispiele mit diesem Namen.

Die thefuzz-Bibliothek basiert auf python-Levenshtei, also müssen Sie sie mit diesem Befehl installieren.

pip install python-Levenshtein

Und wenn Sie während der Installation Probleme haben, können Sie den folgenden Befehl verwenden, und wenn Sie erneut einen Fehler erhalten, können Sie bei Google nach einer entsprechenden Lösung suchen.

pip install python-Levenshtein-wheels

Im Wesentlichen unscharfe übereinstimmende Zeichenfolgen wie die Verwendung von Regex oder der Vergleich von Zeichenfolgen entlang zweier Zeichenfolgen. Bei der Fuzzy-Logik kann der Wahrheitswert Ihrer Bedingung eine beliebige reelle Zahl zwischen 0 und 1 sein.

Anstatt also zu sagen, dass irgendetwas True oder False ist, geben Sie ihm einfach einen beliebigen Wert zwischen 0 und 1. Er wird berechnet, indem die Unähnlichkeit zwischen zwei Zeichenfolgen in Form eines als Abstand bezeichneten Werts unter Verwendung der Abstandsmetrik berechnet wird.

Unter Verwendung der angegebenen Zeichenfolge finden Sie den Abstand zwischen zwei Zeichenfolgen mithilfe eines Algorithmus. Nachdem Sie den Installationsprozess abgeschlossen haben, müssen Sie fuzz und process aus dem thefuzz-Modul importieren.

from thefuzz import fuzz, process

Bevor wir fuzz verwenden, prüfen wir manuell die Unähnlichkeit zwischen zwei Saiten.

ST1 = "Just a test"
ST2 = "just a test"
print(ST1 == ST2)
print(ST1 != ST2)

Es wird ein boolescher Wert zurückgegeben, aber auf unscharfe Weise erhalten Sie das Perzentil der Ähnlichkeit dieser Zeichenfolgen.

False
True

Der Fuzzy-String-Matching ermöglicht es uns, dies auf Fuzzy-Weise effizienter und schneller zu tun. Angenommen, wir haben ein Beispiel mit zwei Strings, und ein String ist nicht derselbe mit dem Großbuchstaben J (wie oben angegeben).

Wenn wir jetzt weitermachen und die Funktion ratio() aufrufen, die uns eine Metrik für die Ähnlichkeit liefert, dann liefert uns dies ein ziemlich hohes Verhältnis, nämlich 91 von 100.

from thefuzz import fuzz, process

print(fuzz.ratio(ST1, ST2))

Ausgang:

91

Wenn der String länger ist, zum Beispiel, wenn wir nicht nur ein Zeichen ändern, sondern einen ganz anderen String, dann sehen Sie, was er zurückgibt, schauen Sie nach.

ST1 = "This is a test string for test"
ST2 = "There aresome test string for testing"
print(fuzz.ratio(ST1, ST2))

Nun, es wird wahrscheinlich eine gewisse Ähnlichkeit geben, aber es wird ziemlich genau die 75 sein; Dies ist nur ein einfaches Verhältnis und nichts Kompliziertes.

75

Wir können auch so etwas wie das Teilverhältnis ausprobieren. Zum Beispiel haben wir zwei Saiten, deren Punktzahl wir bestimmen wollen.

ST1 = "There are test"
ST2 = "There are test string for testing"
print(fuzz.partial_ratio(ST1, ST2))

Mit partial_ratio() erhalten wir 100%, da diese beiden Strings denselben Teilstring haben (There are test).

In ST2 haben wir einige andere Wörter (Strings), aber das spielt keine Rolle, weil wir das Teilverhältnis oder den einzelnen Teil betrachten, aber ein einfaches Verhältnis funktioniert nicht ähnlich.

100

Nehmen wir an, wir haben Strings, die ähnlich sind, aber eine andere Reihenfolge haben; dann verwenden wir eine andere Metrik.

CASE_1 = "This generation rules the nation"
CASE_2 = "Rules the nation This generation"

Zwei Fälle haben den genauen Text zur gleichen Bedeutung dieses Ausdrucks, aber die Verwendung von ratio() wäre ziemlich unterschiedlich, und die Verwendung von partial_ratio() wäre anders.

Wenn wir mit token_sort_ratio() weitermachen, wäre dies 100%, weil es im Wesentlichen die exakten Wörter sind, aber in einer anderen Reihenfolge. Das also nimmt die Funktion token_sort_ratio() die einzelnen Token und sortiert sie, egal in welcher Reihenfolge sie kommen.

print(fuzz.ratio(CASE_1, CASE_2))
print(fuzz.partial_ratio(CASE_1, CASE_2))
print(fuzz.token_sort_ratio(CASE_1, CASE_2))

Ausgang:

47
64
100

Wenn wir nun ein Wort durch ein anderes Wort ersetzen, haben wir hier eine andere Zahl, aber im Wesentlichen ist dies das Verhältnis; die Reihenfolge der einzelnen Token ist ihm egal.

CASE_1 = "This generation rules the nation"
CASE_2 = "Rules the nation has This generation"

print(fuzz.ratio(CASE_1, CASE_2))
print(fuzz.partial_ratio(CASE_1, CASE_2))
print(fuzz.token_sort_ratio(CASE_1, CASE_2))

Ausgang:

44
64
94

Das token_sort_ratio() ist auch anders, weil es mehr Wörter enthält, aber wir haben auch etwas namens token_set_ratio(), und ein Set enthält jeden Token nur einmal.

Es spielt also keine Rolle, wie oft es vorkommt; Schauen wir uns einen Beispiel-String an.

CASE_1 = "This generation"
CASE_2 = "This This generation generation generation generation"

print(fuzz.ratio(CASE_1, CASE_2))
print(fuzz.partial_ratio(CASE_1, CASE_2))
print(fuzz.token_sort_ratio(CASE_1, CASE_2))
print(fuzz.token_set_ratio(CASE_1, CASE_2))

Wir können einige ziemlich niedrige Werte sehen, aber wir haben 100 % mit der Funktion token_set_ratio() erhalten, weil wir zwei Token haben, This und generation existieren in beiden Strings.

Verwenden Sie das Modul process, um Fuzzy String Match auf effiziente Weise zu verwenden

Es gibt nicht nur den fuzz, sondern auch den process, denn der process ist hilfreich und kann mit diesem Fuzzy-Matching aus einer Sammlung extrahiert werden.

Zum Beispiel haben wir einige Listenelemente zur Demonstration vorbereitet.

Diff_items = [
    "programing language",
    "Native language",
    "React language",
    "People stuff",
    "This generation",
    "Coding and stuff",
]

Einige von ihnen sind ziemlich ähnlich, wie Sie sehen konnten (Muttersprache oder Programmiersprache), und jetzt können wir fortfahren und die besten individuellen Übereinstimmungen auswählen.

Wir können das manuell tun, indem wir einfach die Punktzahl auswerten und dann die Top-Picks auswählen, aber wir können das auch mit dem Prozess tun. Dazu müssen wir die Funktion extract() aus dem Modul process aufrufen.

Es sind einige Parameter erforderlich, der erste ist die Zielzeichenfolge, der zweite ist die Sammlung, die Sie extrahieren werden, und der dritte ist die Grenze, die die Übereinstimmungen oder Extraktionen auf zwei begrenzt.

Wenn wir zum Beispiel so etwas wie Sprache extrahieren wollen, wurden in diesem Fall Muttersprache und Programmiersprache gewählt.

print(process.extract("language", Diff_items, limit=2))

Ausgang:

[('programing language', 90), ('Native language', 90)]

Das Problem ist, dass dies kein NLP (Natural Language Processing) ist; dahinter steckt keine Intelligenz; es betrachtet nur das einzelne Token. Also zum Beispiel, wenn wir als Ziel-String programming verwenden und diesen ausführen.

Die erste Übereinstimmung wird Programmiersprache sein, aber die zweite wird Muttersprache sein, die nicht codieren wird.

Auch wenn wir Codierung haben, weil Codierung von der Semantik her näher am Programmieren liegt, spielt es keine Rolle, weil wir hier keine KI verwenden.

Diff_items = [
    "programing language",
    "Native language",
    "React language",
    "People stuff",
    "Hello World",
    "Coding and stuff",
]

print(process.extract("programing", Diff_items, limit=2))

Ausgang:

[('programing language', 90), ('Native language', 36)]

Ein weiteres letztes Beispiel ist, wie dies nützlich sein kann; Wir haben eine riesige Bibliothek mit Büchern und möchten ein Buch finden, aber wir wissen nicht genau, wie es heißt oder wie wir es nennen können.

In diesem Fall können wir extract() verwenden, und innerhalb dieser Funktion übergeben wir fuzz.token_sort_ratio an das scorer-Argument.

LISt_OF_Books = [
    "The python everyone volume 1 - Beginner",
    "The python everyone volume 2 - Machine Learning",
    "The python everyone volume 3 - Data Science",
    "The python everyone volume 4 - Finance",
    "The python everyone volume 5 - Neural Network",
    "The python everyone volume 6 - Computer Vision",
    "Different Data Science book",
    "Java everyone beginner book",
    "python everyone Algorithms and Data Structure",
]


print(
    process.extract(
        "python Data Science", LISt_OF_Books, limit=3, scorer=fuzz.token_sort_ratio
    )
)

Wir passieren es gerade; Wir nennen es nicht, und jetzt erhalten wir hier das beste Ergebnis und als zweites Ergebnis ein weiteres Data Science-Buch.

Ausgang:

[('The python everyone volume 3 - Data Science', 63), ('Different Data Science book', 61), ('python everyone Algorithms and Data Structure', 47)]

Dies ist ziemlich genau und kann sehr hilfreich sein, wenn Sie ein Projekt haben, bei dem Sie es auf unscharfe Weise finden müssen. Wir können es auch verwenden, um Ihre Prozesse zu automatisieren.

Es gibt zusätzliche Ressourcen, in denen Sie weitere Hilfe bei der Verwendung von github und stackoverflow finden können.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn