Vergleiche 2 Zeichen

7

Ich habe die folgenden 2 Zeichenfolgen:

%Vor%

Beide Zeichenfolgen sind gleich, enthalten jedoch unterschiedliche Werte.

Wie kann ich diese Zeichenfolge vergleichen, um eine "übereinstimmende Punktzahl" zu erhalten, wie in dem Fall, das erste Wort ist ähnlich, "Manchester" und die zweiten Wörter enthalten ähnliche Buchstaben, aber nicht an der richtigen Stelle.

Gibt es einen einfachen Algorithmus, der die "übereinstimmende Punktzahl" zurückgibt, nachdem ich 2 Zeichenfolgen geliefert habe?

    
Ido Lazar 08.05.2012, 09:20
quelle

6 Antworten

9

Sie können die Levenshtein-Distanz zwischen den beiden Strings berechnen und wenn sie kleiner ist als ein Wert (den Sie definieren müssen ) Sie können sie als ziemlich nah betrachten.

    
Darin Dimitrov 08.05.2012 09:25
quelle
6

Ich musste etwas in der Art machen und Levenshtein Entfernung benutzen.

Ich habe es für eine SQL Server UDF verwendet, die in Abfragen mit mehr als einer Million Zeilen (und Texten von bis zu 6 oder 7 Wörtern) verwendet wird.

Ich fand, dass der Algorithmus schneller läuft und der "Ähnlichkeitsindex" genauer ist, wenn Sie jedes Wort einzeln vergleichen. I.e. Sie teilen jede Eingabezeichenfolge in Worte und vergleichen jedes Wort einer Eingabezeichenfolge mit jedem Wort der anderen Eingabezeichenfolge.

Denken Sie daran, dass Levenshtein den Unterschied macht, und Sie müssen es in einen "Ähnlichkeitsindex" umwandeln. Ich benutzte etwas wie die Entfernung, geteilt durch die Länge des längsten Wortes (aber mit einigen Variationen)

Erste Regel: Reihenfolge und Anzahl der Wörter

Sie müssen auch Folgendes beachten:

  • , wenn in beiden Eingaben die gleiche Anzahl von Wörtern vorhanden sein muss oder
  • geändert werden kann
  • und wenn die Reihenfolge an beiden Eingängen identisch sein muss oder sich ändern kann.

Abhängig davon ändert sich der Algorithmus. Zum Beispiel ist die Anwendung der ersten Regel sehr schnell, wenn die Anzahl der Wörter unterschiedlich ist. Und die zweite Regel reduziert die Anzahl der Vergleiche, besonders wenn es viele Wörter in den verglichenen Texten gibt. Das wird später mit Beispielen erklärt.

Zweite Regel: Gewichtung der Ähnlichkeit jedes verglichenen Paares

Ich habe auch die längeren Wörter höher gewichtet als die kürzeren Wörter, um den globalen Ähnlichkeitsindex zu erhalten. Mein Algorithmus nimmt das längste der beiden Wörter im Vergleichspaar und gibt dem Paar mit den längeren Wörtern ein höheres Gewicht als dem Paar mit den kürzeren Wörtern, obwohl es nicht genau proportional zur Paarlänge ist.

Beispielvergleich: gleiche Reihenfolge

Bei diesem Beispiel, das eine andere Anzahl von Wörtern verwendet:

  • vergleichen "Manchester United" mit "Manchester Utd FC"

Wenn die gleiche Reihenfolge der Wörter in beiden Eingaben garantiert ist, sollten Sie diese Paare vergleichen:

%Vor%

(Manchester, Manchester) (Utd, Vereinigtes) (FC: nicht verglichen)

%Vor%

(Manchester, Manchester) (Utd: nicht verglichen) (United, FC)

%Vor%

(Manchester: nicht verglichen) (Manchester, Utd) (United, FC)

Offensichtlich wäre die höchste Punktzahl für die erste Gruppe von Paaren.

Implementierung

Um Wörter in der gleichen Reihenfolge zu vergleichen.

Die Zeichenfolge mit der höheren Anzahl von Wörtern ist ein fester Vektor, der in diesem Beispiel als A, B, C, D, E dargestellt wird. Wo v [0] ist das Wort A, v [1] das Wort B und so weiter.

Für die Zeichenfolge mit der niedrigeren Anzahl von Wörtern müssen wir alle möglichen Kombinationen von Indizes erstellen, die mit dem ersten Satz verglichen werden können. In diesem Fall wird die Zeichenfolge mit der niedrigeren Anzahl von Wörtern durch a, b, c dargestellt.

Sie können eine einfache Schleife verwenden, um alle Vektoren zu erstellen, die die zu vergleichenden Paare darstellen, wie zB

%Vor%

Die Zahlen in der Stichprobe sind Vektoren, die die Indizes der ersten Menge von Wörtern haben, die mit den Indizes in der ersten Menge verglichen werden müssen. dh v [0] = 0, bedeutet Vergleich Index 0 der kurzen Menge (a) mit Index 0 der langen Menge (A), v [1] = 2 bedeutet Vergleich von Index 1 der kurzen (b) Menge mit Index 2 der langen Reihe (C) und so weiter.

Um diese Vektoren zu berechnen, beginnen Sie einfach mit 0,1,2. Verschiebe den letzten Index, der verschoben werden kann, bis er nicht mehr verschoben werden kann, nach rechts:

Strat durch Verschieben des letzten:

%Vor%

Wenn der letzte nicht weiter bewegt werden kann, bewege den vorletzten und setze den letzten auf den nächsten möglichen Platz zurück (1 zu 2 und 4 zu 3):

%Vor%

Bewege den vorletzten wieder.

%Vor%

Verschiebe die vorherige:

%Vor%

Und so weiter. Siehe das Bild

Wenn Sie alle möglichen Kombinationen haben, können Sie die definierten Paare vergleichen.

Dritte Regel: minimale Ähnlichkeit zum Stoppen des Vergleichs

Stoppen Sie den Vergleich, wenn die minimale Ähnlichkeit erreicht ist: Je nachdem, was Sie tun möchten, ist es möglich, dass Sie einen Threshold setzen, der den Vergleich der Paare stoppt, wenn er erreicht ist.

Wenn Sie keine Thresold setzen können, können Sie immer aufhören, wenn Sie für jedes Wortpaar eine 100% ige Ähnlichkeit haben. Das spart viel Zeit.

Manchmal können Sie einfach entscheiden, den Vergleich zu beenden, wenn die Ähnlichkeit mindestens bei 75% liegt. Dies kann verwendet werden, wenn Sie dem Benutzer alle Zeichenfolgen anzeigen möchten, die denen ähneln, die vom Benutzer bereitgestellt werden.

Beispiel: Vergleich mit Änderung der Reihenfolge der Wörter

Wenn es Änderungen in der Reihenfolge geben kann, müssen Sie jedes Wort des ersten Satzes mit jedem Wort des zweiten Satzes vergleichen und die höchsten Bewertungen für die Kombinationen der Ergebnisse nehmen, die alle Wörter des kürzesten Paares enthalten geordnet auf allen möglichen Wegen, verglichen mit verschiedenen Wörtern des zweiten Paares. Dazu können Sie das obere oder untere Dreieck einer Matrix von (n X m) Elementen auffüllen und dann die benötigten Elemente aus der Matrix nehmen.

Vierte Regel: Normalisierung

Sie müssen das Wort vor dem Vergleich auch normalisieren:

  • Wenn Groß- und Kleinschreibung nicht berücksichtigt wird, konvertieren Sie alle Wörter in Groß- oder Kleinbuchstaben
  • Wenn nicht akzentsensitiv, entfernen Sie die Akzente in allen Wörtern
  • Wenn Sie wissen, dass es übliche Abkürzungen gibt, können Sie sie auch normalisieren, um die Abkürzung zu beschleunigen (d. h. vereinheitlicht zu utd, nicht utd zu united)

Caching für die Optimierung

Um die Prozedur zu optimieren, habe ich zwischengespeichert, was auch immer ich konnte, dh die Vergleichsvektoren für verschiedene Größen, wie die Vektoren 0,1,2-0,1,3, -0,1,4-0,2,3, in den Vergleichsbeispielen A, B, C, D, E bis a, b, c: Alle Vergleiche für die Längen 3,5 würden bei der ersten Verwendung berechnet und für alle eingehenden Vergleiche mit 3 Wörtern bis 5 Wörtern wiederverwendet.

Andere Algorithmen

Ich habe Hamming Abstand versucht und die Ergebnisse waren weniger genau.

Sie können viel komplexere Dinge tun, wie semantische Vergleiche, phonetische Vergleiche, beachten Sie, dass einige Buchstaben genau gleich sind (wie b und v , für mehrere Sprachen, wie Spanisch, wo es keine Unterscheidung gibt). Einige dieser Dinge sind sehr einfach zu implementieren und andere sind wirklich schwierig.

HINWEIS: Ich habe die Implementierung der Levenhstein-Distanz nicht berücksichtigt, weil Sie sie leicht auf verschiedenen Ebenen implementieren können

    
JotaBe 08.05.2012 11:14
quelle
5

Schauen Sie sich diesen Artikel an, der erklärt, wie es geht und gibt auch Beispielcode:)

Fuzzy Matching (Levenshtein Entfernung)

Aktualisierung:

Hier ist der Methodencode, der zwei Strings als Parameter akzeptiert und den "Levenshtein Distance" der beiden Strings berechnet

%Vor%     
ry8806 08.05.2012 09:26
quelle
1

Das Erkennen von Duplikaten ist manchmal etwas "komplizierter" als die Berechnung von Levenshtein dinstance. Betrachten Sie folgendes Beispiel:

%Vor%

Diese Duplikate können mit komplizierten Cluster-Algorithmen verglichen werden.

Für weitere Informationen möchten Sie vielleicht einige Forschungsarbeiten wie "Effektives inkrementelles Clustering für doppelte Erkennung in großen Datenbanken".

(Beispiel stammt von der Zeitung)

    
devdimi 08.05.2012 10:10
quelle
1

Was Sie suchen, ist ein Zeichenfolgenähnlichkeitsmaß. Es gibt mehrere Möglichkeiten, dies zu tun:

  1. Bearbeiten Sie die Abstände zwischen zwei Strings (wie in Antwort # 1)
  2. Konvertieren der Zeichenfolgen in Zeichensätze (im Allgemeinen auf Bigrammen oder Wörtern) und Berechnen des Bruce-Koeffizienten oder des Würfelkoeffizienten für die beiden Mengen.
  3. Projizieren der Strings in Termvektoren (entweder auf Wörter oder Bigramme) und Berechnen der Kosinus-Distanz zwischen den beiden Vektoren.

Im Allgemeinen finde ich die Option # 2 am einfachsten zu implementieren und wenn Ihre Strings Phrasen sind, dann können Sie sie einfach an Wortgrenzen in Token zerlegen. In allen oben genannten Fällen möchten Sie möglicherweise zuerst die Stoppwörter (allgemeine Wörter wie und, a, etc) vor dem Token löschen. Aktualisieren: Links

Würfelkoeffizient

Kosinusähnlichkeit

Naive Similarity-Engine in C # implementieren * Warnung: schamlose Selbstwerbung

    
Sachin 08.05.2012 09:51
quelle
0

Hier ist eine Alternative zur Verwendung des Levenshtein-Distanzalgorithmus. Dies vergleicht Zeichenfolgen basierend auf dem Koeffizienten der Würfel, der die Anzahl der gemeinsamen Buchstabenpaare in jeder Zeichenfolge vergleicht, um einen Wert zwischen 0 und 1 zu erzeugen, wobei 0 keine Ähnlichkeit und 1 vollständige Ähnlichkeit ist.

%Vor%

Rufen Sie die Methode wie folgt auf:

%Vor%

Ausgabe ist: 0.75862068965517238

    
Jack Fairfield 11.08.2017 19:04
quelle

Tags und Links