2009-02-23 11 views
32

Ich suche nach einem Algorithmus, der 2 Zeichenketten nimmt und mir einen "Ähnlichkeitsfaktor" zurückgibt.Finden, wie ähnlich zwei Zeichenketten sind

Grundsätzlich werde ich eine Eingabe haben, die falsch geschrieben sein kann, Buchstaben transponiert haben, usw., und ich muss die nächste Übereinstimmung in einer Liste der möglichen Werte finden, die ich habe.

Dies ist nicht für die Suche in einer Datenbank. Ich werde eine In-Memory-Liste von etwa 500 Strings haben, um alle zu vergleichen, alle unter 30 Zeichen, also kann es relativ langsam sein.

Ich weiß, dass es existiert, ich habe es vorher gesehen, aber ich kann mich nicht an seinen Namen erinnern.


Edit: Danke für das Aufzeigen von Levenshtein und Hamming. Nun, welche sollte ich implementieren? Sie messen grundsätzlich verschiedene Dinge, die beide für das verwendet werden können, was ich will, aber ich bin mir nicht sicher, welches besser geeignet ist.

Ich habe die Algorithmen gelesen, Hamming scheint offensichtlich schneller. Da keiner von beiden erkennen wird, dass zwei Charaktere transponiert werden (z. B. Jordan und Jodran), was meiner Meinung nach ein häufiger Fehler sein wird, der genauer sein wird für das, was ich will? Kann mir jemand etwas über die Kompromisse erzählen?

+0

beide Distanz Hamming und Levenshtein erkennen Umstellungen implementiert prüfen, die jeweils eine Gebühr von 2 zuweisen .Dies ist einer der wenigen typischen Fehler, die die Hamming-Distanz * sinnvoll aufnehmen wird - jede Ein-Zeichen-Eingabe oder -Deletion wird Ihnen sofort große Unterschiede geben. Benutze Levenshtein. –

Antwort

33

Ok, so dass die Standard-Algorithmen sind:

1) Hamming distance Nur gut für die Saiten von gleicher Länge, aber sehr effizient. Im Grunde zählt es einfach die Anzahl der verschiedenen Zeichen. Nicht nützlich für die unscharfe Suche von Text in natürlicher Sprache.

2) . Die Levenstein-Distanz misst die Entfernung in Bezug auf die Anzahl der "Operationen", die erforderlich sind, um eine Zeichenfolge in eine andere umzuwandeln. Diese Operationen umfassen Einfügen, Löschen und Ersetzen. Der Standardansatz zur Berechnung der Levenstein-Distanz ist die dynamische Programmierung.

3) Generalized Levenstein/(Damerau–Levenshtein distance) Dieser Abstand berücksichtigt auch Transpositionen von Zeichen in einem Wort und ist wahrscheinlich die Bearbeitungsentfernung, die am besten für die Fuzzy-Anpassung von manuell eingegebenem Text geeignet ist. Der Algorithmus zur Berechnung der Entfernung ist ein wenig komplizierter als die Levenstein-Distanz (das Erkennen von Transpositionen ist nicht einfach). Die häufigsten Implementierungen sind eine Modifikation des bitap Algorithmus (wie grep).

Im Allgemeinen würden Sie wahrscheinlich wollen eine Implementierung der dritten Option in einer Art Nearest-Neighbor-Suche basiert auf einem kd Baum Eigentlich

3
  • Levenstein Entfernung
  • Hamming-Distanz
  • soundex
  • Metaphone
+0

Hmmm ... ok ... welchen soll ich benutzen? Wenn ich mich richtig erinnere, ist Soundex nicht nützlich, weil es davon abhängig ist, dass der erste Buchstabe derselbe ist, plus die Zeit, in der ich ihn benutzt habe (anderes Projekt), ich war nicht sehr glücklich darüber. Was ist der Kompromiss zwischen Levenshtein und Hamming, zum Beispiel? –

+0

Hamming Abstand kann nur auf Saiten der gleichen Länge verwendet werden ... Levenshtein Abstand ist wie eine Verallgemeinerung von Hamming Abstand – tehvan

+0

Nun, Hamming Abstand ist mehr für theoretische Zwecke. Wenn Sie Tippfehler korrigieren oder ignorieren möchten - Levenstein. Wenn Sie schlechte Schreibweise korrigieren oder ignorieren wollen - metaphone. Beachten Sie jedoch, dass Levenstein in jeder Sprache funktioniert, Metaphon - nur Englisch. – vartec

3

die Damerau-Levenshtein distance ist ähnlich der Levenshtein-Distanz, sondern umfasst auch Zwei-Zeichen-Transposition. Die Wikipedia-Seite (verlinkt) enthält einen Pseudocode, der relativ einfach zu implementieren sein sollte.

Verwandte Themen