505 Stimmen

Finden Sie die Ähnlichkeitsmetrik zwischen zwei Zeichenfolgen

Wie bekomme ich die Wahrscheinlichkeit, dass ein String in Python einem anderen String ähnlich ist?

Ich möchte einen Dezimalwert wie 0.9 (was 90% bedeutet usw.) erhalten. Bevorzugt mit Standard-Python und Bibliothek.

zum Beispiel.

ähnlich("Apfel", "Apel") # hätte eine hohe Wahrscheinlichkeit.

ähnlich("Apfel", "Mango") # hätte eine niedrigere Wahrscheinlichkeit.

892voto

Inbar Rose Punkte 39054

Es gibt eine eingebaute.

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

Die Verwendung:

>>> similar("Apple","Appel")
0.8
>>> similar("Apple","Mango")
0.0

124voto

Iman Mirzadeh Punkte 11410

Lösung #1: Python eingebaut

verwenden SequenceMatcher von difflib

Vorteile: eingebaute Python-Bibliothek, kein zusätzliches Paket erforderlich.
Nachteile: zu begrenzt, es gibt so viele andere gute Algorithmen für die Ähnlichkeit von Strings.

Beispiel :
>>> from difflib import SequenceMatcher
>>> s = SequenceMatcher(None, "abcd", "bcde")
>>> s.ratio()
0.75

Lösung #2: jellyfish Bibliothek

es ist eine sehr gute Bibliothek mit guter Abdeckung und wenigen Problemen. es unterstützt:

  • Levenshtein-Distanz
  • Damerau-Levenshtein-Distanz
  • Jaro-Distanz
  • Jaro-Winkler-Distanz
  • Vergleich durch den Match-Bewertungsansatz
  • Hamming-Distanz

Vorteile: einfach zu bedienen, Vielzahl unterstützter Algorithmen, getestet.
Nachteile: keine eingebaute Bibliothek.

Beispiel:

>>> import jellyfish
>>> jellyfish.levenshtein_distance(u'jellyfish', u'smellyfish')
2
>>> jellyfish.jaro_distance(u'jellyfish', u'smellyfish')
0.89629629629629637
>>> jellyfish.damerau_levenshtein_distance(u'jellyfish', u'jellyfihs')
1

82voto

hbprotoss Punkte 1385

Ich glaube, dass du vielleicht nach einem Algorithmus suchst, der den Abstand zwischen Zeichenfolgen beschreibt. Hier sind einige, auf die du dich beziehen kannst:

  1. Hamming-Distanz
  2. Levenshtein-Distanz
  3. Damerau–Levenshtein-Distanz
  4. Jaro–Winkler-Distanz

54voto

BLT Punkte 2432

TheFuzz ist ein Paket, das die Levenshtein-Distanz in Python implementiert, mit einigen Hilfsfunktionen, um in bestimmten Situationen zu helfen, wo Sie möglicherweise möchten, dass zwei verschiedene Zeichenfolgen als identisch betrachtet werden. Zum Beispiel:

>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
    91
>>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
    100

19voto

Saullo G. P. Castro Punkte 52899

Sie können eine Funktion wie folgt erstellen:

def ähnlich(w1, w2):
    w1 = w1 + ' ' * (len(w2) - len(w1))
    w2 = w2 + ' ' * (len(w1) - len(w2))
    return sum(1 if i == j else 0 for i, j in zip(w1, w2)) / float(len(w1))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X