Messung der Identität von Strings (in Javascript)

8

Grundsätzlich kann diese Frage sprachunabhängig beantwortet werden, aber ich suche speziell nach einer Javascript-Implementierung.

Gibt es Bibliotheken, mit denen ich die "Identität" zweier Strings messen kann? Allgemeiner, gibt es irgendwelche Algorithmen, die dies tun, die ich (in Javascript) implementieren könnte?

Nehmen Sie als Beispiel die folgende Zeichenfolge

  

Abnormale Elastizität von Einkristall-Magnesiosiderit über den Spin   Übergang im Unteren Mantel der Erde

Und bedenke auch die folgende, leicht angepasste Zeichenfolge. Beachten Sie die fett gedruckten Teile, die anders sind

  

normal Elastizität der Sünde gle Cry stal Magne sio-SID Erzwingung über die S pin-Tra nition in Eart hs Unterer Mant le.

Die nativen Gleichheitsoperatoren von Javascript geben Ihnen nicht viel über die Beziehung zwischen diesen Zeichenfolgen. In diesem speziellen Fall könnten Sie die Zeichenfolgen mithilfe von Regex abgleichen, dies funktioniert jedoch im Allgemeinen nur, wenn Sie wissen, welche Unterschiede zu erwarten sind. Wenn die Eingabezeichenfolgen zufällig sind, bricht die Allgemeinheit dieses Ansatzes schnell zusammen.

Ansatz ... Ich kann mir vorstellen, einen Algorithmus zu schreiben, der die Eingabezeichenfolge in einer beliebigen Menge N der Teilzeichenfolgen aufteilt und dann die Zielzeichenfolge mit all diesen Zeichenfolgen abgleicht und die Zeichenfolgen verwendet Anzahl der Übereinstimmungen als Maß für die Identität. Aber das fühlt sich an wie ein unattraktiver Ansatz, und ich möchte nicht einmal darüber nachdenken, wie groß O von N abhängen wird.

Es scheint mir, dass es in einem solchen Algorithmus viele freie Parameter gibt. Ob beispielsweise die Groß- / Kleinschreibung von Zeichen zur Messung gleich / mehr / weniger zur Messung beitragen sollte als die Reihenfolge der Erhaltung von Zeichen, scheint eine willkürliche Entscheidung des Entwicklers zu sein, d. H .:

  

identicality("Abxy", "bAxy") gegen identicality("Abxy", "aBxy")

Definieren Sie die Anforderungen genauer ... Das erste Beispiel ist das Szenario, in dem ich es verwenden könnte. Ich lade eine Reihe von Strings (Titel von wissenschaftlichen Arbeiten), und ich überprüfe, ob ich sie in meiner Datenbank habe. Die Quelle kann jedoch Tippfehler, Unterschiede in den Konventionen, Fehler usw. enthalten, was die Übereinstimmung erschwert. Es gibt wahrscheinlich einen einfacheren Weg, um Titel in diesem speziellen Szenario zu finden: Da Sie erwarten können, was schief gehen könnte, können Sie so ein Regex-Biest aufschreiben.

    
Maurits Moeys 26.01.2017, 12:02
quelle

1 Antwort

3

Sie können Hirschberg-Algorithmus implementieren und delete/insert -Operationen unterscheiden (oder Levenshtein ändern) .

Für Hirschbers("Abxy", "bAxy") sind die Ergebnisse :

%Vor%

und für Hirschbers("Abxy", "aBxy") die Ergebnisse sind :

%Vor%

Sie können die JavaScript-Implementierung auf dieser Seite überprüfen.

'Optimal' String-Alignment Distance

%Vor%

Damerau-Levenshtein Entfernung

%Vor%
  

Optimal String Alignment hat eine bessere Leistung

  Optimaler String-Ausrichtungsabstand 0.20-0.30ms
  Damerau-Levenshtein Entfernung 0.40-0.50ms

    
Panos Kal. 12.10.2017, 09:48
quelle