Wie von gauden
gepostet, ist SequenceMatcher
in difflib
ein einfacher Weg. Verwendung von ratio()
, gibt einen Wert zwischen 0
und 1
zurück, der der Ähnlichkeit zwischen den beiden Zeichenfolgen entspricht, aus den Dokumenten:
Wo T die Gesamtzahl der Elemente in beiden Sequenzen ist und M die Anzahl der Übereinstimmungen, dies ist 2.0*M / T. Beachten Sie, dass dies 1.0 ist, wenn die Sequenzen identisch sind, und 0.0, wenn sie nichts gemeinsam haben.
Beispiel:
>>> import difflib
>>> difflib.SequenceMatcher(None,'no information available','n0 inf0rmation available').ratio()
0.91666666666666663
Es gibt auch get_close_matches
, das für Sie nützlich sein könnte. Sie können einen Distanzschwellenwert angeben und es gibt alle Übereinstimmungen innerhalb dieser Distanz von einer Liste zurück:
>>> difflib.get_close_matches('unicorn', ['unicycle', 'uncorn', 'corny',
'house'], cutoff=0.8)
['uncorn']
>>> difflib.get_close_matches('unicorn', ['unicycle' 'uncorn', 'corny',
'house'], cutoff=0.5)
['uncorn', 'corny', 'unicycle']
Aktualisierung: um eine teilweise Teilfolgenübereinstimmung zu finden
Um nahe Übereinstimmungen mit einer dreiwörtigen Sequenz zu finden, würde ich den Text in Wörter aufteilen, sie dann in dreiwörtige Sequenzen gruppieren und dann difflib.get_close_matches
anwenden, wie folgt:
import difflib
text = "Hier ist der Text, den wir versuchen, übereinzustimmen, um die dreiwörtige Sequenz n0 inf0rmation available zu finden. Ich frage mich, ob wir es finden werden?"
wörter = text.split()
drei = [' '.join([i,j,k]) for i,j,k in zip(wörter, wörter[1:], wörter[2:])]
print difflib.get_close_matches('no information available', drei, cutoff=0.9)
#Ergebnis:
['n0 inf0rmation available']