Unterschied zwischen Jaro-Winkler und Levenshtein Entfernung? [geschlossen]


83

Ich habe einen Anwendungsfall, in dem ich Millionen von Datensätzen aus mehreren Dateien unscharf abgleichen muss. Ich habe zwei Algorithmen dafür identifiziert: Jaro-Winkler und Levenshtein bearbeiten die Entfernung.

Als ich anfing, beide zu erforschen, konnte ich nicht verstehen, was der genaue Unterschied zwischen den beiden ist. Es scheint, dass Levenshtein die Anzahl der Änderungen zwischen zwei Zeichenfolgen angibt, und Jaro-Winkler liefert eine normalisierte Punktzahl zwischen 0,0 und 1,0. Ich habe den Algorithmus nicht verstanden.

Da ich einen der beiden Algorithmen verwenden muss, muss ich wissen, was die grundlegenden Unterschiede zwischen diesen beiden Algorithmen sind.

Zweitens möchte ich den Leistungsunterschied zwischen diesen beiden Algorithmen kennenlernen.

Antworten:


174

Levenshtein zählt die Anzahl der Änderungen (Einfügungen, Löschungen oder Ersetzungen), die erforderlich sind, um eine Zeichenfolge in die andere zu konvertieren. Damerau-Levenshtein ist eine modifizierte Version, die Transpositionen auch als Einzelbearbeitungen betrachtet. Obwohl die Ausgabe die ganzzahlige Anzahl von Änderungen ist, kann dies normalisiert werden, um einen Ähnlichkeitswert durch die Formel zu erhalten

1 - (edit distance / length of the larger of the two strings)

Der Jaro-Algorithmus ist ein Maß für gemeinsame Zeichen und beträgt unter Berücksichtigung von Transpositionen nicht mehr als die Hälfte der Länge der längeren Zeichenfolge in der Entfernung. Winkler hat diesen Algorithmus modifiziert, um die Idee zu unterstützen, dass Unterschiede am Anfang der Zeichenfolge signifikanter sind als Unterschiede am Ende der Zeichenfolge. Jaro und Jaro-Winkler eignen sich zum Vergleich kleinerer Zeichenfolgen wie Wörter und Namen.

Die Entscheidung, welche verwendet werden soll, ist nicht nur eine Frage der Leistung. Es ist wichtig, eine Methode auszuwählen, die der Art der zu vergleichenden Zeichenfolgen entspricht. Im Allgemeinen können beide von Ihnen erwähnten Algorithmen jedoch teuer sein, da jede Zeichenfolge mit jeder anderen Zeichenfolge verglichen werden muss. Mit Millionen von Zeichenfolgen in Ihrem Datensatz ist dies 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 detaillierter Informationen zu diesen Algorithmen und anderen Fuzzy-String-Matching-Algorithmen im Internet. Dieser wird Ihnen einen Anfang geben:

Ein Vergleich der persönlichen Namensübereinstimmung: Techniken und praktische Probleme

Demnach ist die Geschwindigkeit der vier von mir erwähnten Jaro- und Levenshtein-Algorithmen von der schnellsten zur langsamsten:

  • Jaro
  • Jaro-Winkler
  • Levenshtein
  • Damerau-Levenshtein

Das langsamste dauert zwei- bis dreimal so lange wie das schnellste. Natürlich hängen diese Zeiten von der Länge der Zeichenfolgen und der Implementierungen ab, und es gibt Möglichkeiten, diese Algorithmen zu optimieren, die möglicherweise nicht verwendet wurden.


6
Die Antwort von Hatchet ist großartig, aber wenn es erwähnenswert ist, können Sie so etwas wie Elasticsearch verwenden, um sowohl Fuzzy-Abfragen (Levenshtein) als auch phonetische Abfragen durchzuführen, und würden Ihnen wahrscheinlich eine schnelle Bewertung ohne großen Aufwand ermöglichen.
ppearcy

2
Ich hatte eine ähnliche Idee dafür. Ich muss das Feld object.description vergleichen, das viele Wörter enthalten kann. Gibt es schon so etwas ... um ES für Levenshtein zu verwenden?
Wexoni
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.