Levenshtein zählt die Anzahl der Bearbeitungen (Einfügungen, Löschungen oder Ersetzungen), die zum Konvertieren einer Zeichenfolge in die andere erforderlich sind. Damerau-Levenshtein ist eine modifizierte Version, die Transpositionen auch als einzelne Bearbeitungen betrachtet. Obwohl die Ausgabe der ganzzahligen Anzahl von Änderungen ist, kann dieser normalisierten sein, einen Ähnlichkeitswert durch die Formel ergeben
1 - (edit distance/length of the larger of the two strings)
Der Jaro Algorithmus ein Maß für Zeichen gemeinsam ist, wobei nicht mehr als die Hälfte der Länge der längeren String in Distanz, unter Berücksichtigung von Transpositionen. Winkler modifizierte diesen Algorithmus, um die Idee zu unterstützen, dass Unterschiede nahe dem Anfang der Zeichenfolge signifikanter sind als Unterschiede nahe dem Ende der Zeichenfolge. Jaro und Jaro-Winkler sind geeignet, kleinere Strings wie Wörter und Namen zu vergleichen.
Die Entscheidung, welche zu verwenden ist, ist nicht nur eine Frage der Leistung. Es ist wichtig, eine Methode auszuwählen, die der Art der Zeichenfolgen entspricht, die Sie vergleichen. Im Allgemeinen können beide der genannten Algorithmen jedoch teuer sein, da jeder String mit jedem anderen String verglichen werden muss, und mit Millionen von Strings in Ihrem Datensatz, das ist eine enorme Anzahl von Vergleichen. Das ist viel teurer als das Berechnen einer phonetischen Codierung für jede Zeichenfolge und das einfache Gruppieren von Zeichenfolgen mit identischen Codierungen.
Es gibt eine Fülle von detaillierten Informationen zu diesen Algorithmen und anderen Fuzzy-String-Matching-Algorithmen im Internet. Dieser wird Ihnen einen Start:
A Comparison of Personal Name Matching: Techniques and Practical Issues
Nach diesem Papier wird die Geschwindigkeit der vier Jaro und Levenshtein Algorithmen ich erwähnt habe, sind vom schnellsten zum langsamsten:
- Jaro
- Jaro-Winkler
- Levenshtein
- Damerau-Levenshtein
mit der langsamsten Einnahme 2 bis 3 mal so lange wie die schnellste. Natürlich hängen diese Zeiten von den Längen der Strings und der Implementierungen ab, und es gibt Möglichkeiten, diese Algorithmen zu optimieren, die möglicherweise nicht verwendet wurden.
Die Antwort von Hatchet ist großartig, aber wenn es erwähnenswert ist, können Sie etwas wie Elasticsearch verwenden, um sowohl fuzzy (Levenshtein) -Abfragen als auch phonetische Abfragen durchzuführen und Ihnen wahrscheinlich eine schnelle Auswertung ohne viel Aufwand zu ermöglichen. – ppearcy
Ich hatte eine ähnliche Idee dafür. Ich habe Anforderung, object.description Feld zu vergleichen, das viele Wörter haben kann. Gibt es schon so etwas zu tun ... um ES für Levenshtein zu benutzen? –