Gibt es einen Edit-Distanz-Algorithmus, der "Chunk Transposition" berücksichtigt?

8

Ich setze "Brocken-Transposition" in Anführungszeichen, weil ich nicht weiß, ob oder wie der Fachbegriff sein sollte. Es wäre sehr hilfreich zu wissen, ob es einen technischen Begriff für den Prozess gibt.

Der Wikipedia-Artikel über die Bearbeitungsentfernung gibt einen guten Überblick über das Konzept.

Indem ich "Chunk Transposition" in Betracht ziehe, meine ich das

%Vor%

sollte mit

übereinstimmen %Vor%

genauer als es passt

%Vor%

i.e. Die Abstandsberechnung sollte erkennen, wenn Teilstrings des Textes einfach innerhalb des Textes verschoben wurden. Dies ist bei der üblichen Levenshtein-Abstandsformel nicht der Fall.

Die Strings werden höchstens einige hundert Zeichen lang sein - sie sind Autorennamen oder Listen von Autorennamen, die in verschiedenen Formaten vorliegen können. Ich mache keine DNA-Sequenzierung (obwohl ich vermute, dass Leute, die das tun, etwas über dieses Thema wissen werden).

    
Steven Huwig 18.05.2009, 14:44
quelle

6 Antworten

2

Sehen Sie sich die Jaccard-Abstandsmetrik (JDM) an. Es ist ein Oldie-aber-Goodie, der ziemlich gut bei Diskrepanzen auf Token-Niveau ist, wie Nachname zuerst, Vorname zuletzt. Bei zwei String-Comparanden ist die JDM-Berechnung einfach die Anzahl der eindeutigen Zeichen, die die zwei Strings gemeinsam haben, geteilt durch die Gesamtzahl der eindeutigen Zeichen zwischen ihnen (mit anderen Worten die Schnittmenge über die Vereinigung). Zum Beispiel ist der Zähler bei den zwei Argumenten "JEFFKTYZZER" und "TYZZERJEFF" 7 und der Nenner ist 8, was einen Wert von 0,875 ergibt. Meine Wahl der Zeichen als Token ist nicht die einzige verfügbare, BTW - N-Gramm werden oft auch verwendet.

    
Jeff Tyzzer 19.08.2009, 22:57
quelle
2

Im Falle Ihrer Bewerbung sollten Sie wahrscheinlich über die Anpassung einiger Algorithmen aus der Bioinformatik nachdenken.

Zum Beispiel könnten Sie zuerst Ihre Strings vereinheitlichen, indem Sie sicherstellen, dass alle Separatoren Leerzeichen oder etwas anderes sind, das Sie mögen, so dass Sie "Alan Turing" mit "Turing Alan" vergleichen würden. Und dann eine der Strings aufteilen und einen genauen String-Matching-Algorithmus (wie den Horspool -Algorithmus) mit den Stücken gegen die andere Zeichenfolge, Zählen der Anzahl der übereinstimmenden Teilstrings.

Wenn Sie Übereinstimmungen finden möchten, die nur ähnlich, aber nicht gleich sind, etwas in der Art einer lokalen Ausrichtung könnte besser geeignet sein, da es einen Score bietet, der die Ähnlichkeit beschreibt, aber der referenzierte Smith-Waterman-Algorithmus ist wahrscheinlich ein bisschen zu viel für Ihre Anwendung und nicht einmal der beste lokale Alignment-Algorithmus.

Abhängig von Ihrer Programmierumgebung besteht die Möglichkeit, dass eine Implementierung bereits verfügbar ist. Ich persönlich habe kürzlich mit SeqAn gearbeitet, das ist eine Bioinformatik-Bibliothek für C ++ und bietet definitiv die gewünschte Funktionalität.

Nun, das war eine ziemlich abstrakte Antwort, aber ich hoffe, dass es Sie in die richtige Richtung weist, aber leider bietet es Ihnen keine einfache Formel, um Ihr Problem zu lösen.

    
Paul 19.05.2009 16:21
quelle
1

Ich glaube, Sie suchen Jaro-Winkler-Entfernung , die genau für die Namensanpassung ist.

>     
bubaker 18.05.2009 15:26
quelle
1

Sie können den Kompressionsabstand dafür nützlich finden. Siehe eine Antwort, die ich für eine sehr ähnliche Frage gegeben habe .

Oder Sie könnten ein k-Tuple basiertes Zählsystem verwenden:

  1. Wähle einen kleinen Wert von k, z.B. k = 4.
  2. Extrahiere alle länge-k Teilstrings deiner Zeichenkette in eine Liste.
  3. Sortiere die Liste. (O (Knlog (n) Zeit.)
  4. Machen Sie dasselbe für die andere Zeichenfolge, mit der Sie vergleichen. Sie haben jetzt zwei sortierte Listen.
  5. Zählt die Anzahl der k-Tupel, die von den zwei Strings gemeinsam genutzt werden. Wenn die Strings die Länge n und m haben, kann dies in O (n + m) -Zeit mit einer Listenzusammenführung erfolgen, da die Listen in sortierter Reihenfolge angeordnet sind.
  6. Die Anzahl der gemeinsamen k-Tupel ist Ihr Ähnlichkeitswert.

Bei kleinen Alphabeten (z. B. DNA) würden Sie normalerweise einen Vektor beibehalten, der die Anzahl für jedes mögliche k-Tupel anstelle einer sortierten Liste speichert, obwohl das nicht praktisch ist, wenn das Alphabet überhaupt ein Zeichen ist - für k = 4, Sie würden ein 256 ^ 4-Array benötigen.

    
j_random_hacker 19.05.2009 15:57
quelle
1

Eine der einfachsten und effektivsten modernen Alternativen zum Bearbeiten von Entfernungen ist der Normalized Compression Distance (NCD). Die Grundidee ist leicht zu erklären. Wählen Sie einen populären Komprimierer, der in Ihrer Sprache implementiert ist, z. B. zlib . Geben Sie dann bei gegebener Zeichenfolge A und Zeichenfolge B die C (A) die komprimierte Größe von A und C (B) ist die komprimierte Größe von B . AB bedeutet " A verkettet mit B ", so dass C (AB) bedeutet "Die komprimierte Größe von " A verkettet mit B ". Als nächstes berechnen Sie den Bruch

( C (AB) - min ( C (A) , C (B) )) / max ( C (A) , C (B) )

Dieser Wert wird als NCD ( A , B ) bezeichnet und ähnelt Ähnlichkeit zur Bearbeitungsentfernung, unterstützt jedoch mehr Formen der Ähnlichkeit, je nachdem, welchen Datenkompressor Sie auswählen. Natürlich unterstützt zlib die Ähnlichkeiten, die Sie beschreiben. Wenn zwei Strings ähnlich sind, wird die komprimierte Größe der Verkettung nahe der Größe jedes einzelnen sein, so dass der Zähler nahe 0 und das Ergebnis nahe 0 liegt. Wenn zwei Strings sehr unterschiedlich sind, entspricht die komprimierte Größe ungefähr der Summe von Die komprimierten Größen hinzugefügt und so das Ergebnis wird in der Nähe von 1. Diese Formel ist viel einfacher zu implementieren als die Entfernung bearbeiten oder fast jede andere explizite Zeichenfolge Ähnlichkeit messen, wenn Sie bereits Zugriff auf eine Datenkomprimierungsprogramm wie zlib haben. Dies liegt daran, dass die meisten "harten" Arbeiten wie Heuristik und Optimierung bereits im Bereich der Datenkomprimierung durchgeführt wurden und diese Formel extrahiert einfach die Menge ähnlicher Muster, die sie unter Verwendung der generischen Informationstheorie gefunden hat, die sprachunabhängig ist. Darüber hinaus ist diese Technik viel schneller als die meisten expliziten Ähnlichkeitsmaße (z. B. Bearbeitungsentfernung) für den von Ihnen beschriebenen Größenbereich von einigen hundert Byte. Für weitere Informationen zu dieser und einer Beispielimplementierung suchen Sie einfach nach Normalized Compression Distance (NCD) oder sehen Sie sich das folgende Papier- und GitHub-Projekt an:

Ссылка "Clustering durch Komprimierung"

Ссылка Implementierung der C-Sprache

Es gibt viele andere Implementierungen und Arbeiten zu diesem Thema in den letzten zehn Jahren, die Sie auch in anderen Sprachen und mit Modifikationen verwenden können.

    
Rudi Cilibrasi 09.07.2015 06:58
quelle
0

Ich bin mir nicht sicher, ob das, was du wirklich willst, die Bearbeitungsdistanz ist - die einfach nach Zeichenketten funktioniert - oder die semantische Distanz - die passendste oder ähnliche Bedeutung wählend. Vielleicht möchten Sie sich die Themen in Information Retrieval ansehen, um Ideen zu finden, wie der am besten passende passende Ausdruck / Ausdruck ausgewählt werden kann ein bestimmter Begriff oder Ausdruck. In gewisser Weise vergleicht man also sehr kurze Dokumente und nicht Zeichenfolgen.

    
tvanfosson 18.05.2009 15:11
quelle