Levenshtein-Distanz: wie man besser behandeln Wörter swapping Positionen?
Hatte, habe ich einige Erfolge vergleichen von strings unter Verwendung des PHP - die levenshtein - Funktion.
Jedoch, für zwei Zeichenfolgen, die Teilstrings enthalten, die Positionen getauscht haben, zählt der Algorithmus diejenigen, die als ganz neue Teilstrings.
Beispiel:
levenshtein("The quick brown fox", "brown quick The fox"); //10 differences
werden behandelt, als hätte er weniger in gemeinsamen als:
levenshtein("The quick brown fox", "The quiet swine flu"); //9 differences
Ich würde lieber ein Algorithmus, der sah, dass der ersten beiden wurden mehr ähnlich.
Wie könnte ich mich über die kommenden up mit einem Vergleich-Funktion, die identifizieren können Teilstrings, die gewechselt haben, die position als getrennte zu-Bearbeitungen?
Einen möglichen Ansatz habe ich schon gedacht ist, um alle Wörter in der Zeichenfolge in alphabetischer Reihenfolge, bevor der Vergleich. Dass die ursprüngliche Reihenfolge der Wörter völlig aus dem Vergleich. Ein Nachteil jedoch ist, dass eine änderung nur den ersten Buchstaben eines Wortes können eine viel grössere Störung als eine änderung eines einzigen Buchstaben führen sollte.
Was ich versuche zu erreichen, ist ein Vergleich der beiden Tatsachen über Menschen, die frei sind text-strings, und zu entscheiden, wie wahrscheinlich es ist, diese Fakten zu zeigen die gleiche Tatsache. Die Fakten könnte die Schule jemand besucht, der name von Ihrem Arbeitgeber oder Verleger zum Beispiel. Zwei Datensätze haben die gleiche Schule unterschiedlich geschrieben, Wörter in einer anderen Reihenfolge, zusätzliche Wörter usw., also das matching ist ein wenig unscharf, wenn wir eine gute Vermutung, dass Sie auf die gleiche Schule. So weit es funktioniert sehr gut für die Rechtschreibfehler (ich bin mit einem phoenetic Algorithmus ähnlich metaphone auf der Oberseite von diesem), aber sehr schlecht, wenn Sie wechseln Sie die Reihenfolge der Wörter um, die offenbar gemeinsam in einer Schule: "xxx college" vs "college of xxx".
- Was ist das Ziel, das Sie erreichen wollen? Levenshtein hat eine theoretisch einfache Methode, zu sagen, kleine Unterschiede und bestimmt zu erkennen, zum Beispiel Tippfehler. Wenn Ihr Ziel anders ist, müssen Sie zuerst finden Sie heraus, eine theoretische Möglichkeit zu sagen, die "Differenz" in Ihrer Bedeutung zwischen den beiden string, dann ist die Umsetzung nur noch eine Frage der Verarbeitung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
N-Gramm
Verwenden N-Gramm, die Unterstützung , die aus mehreren Zeichen Umstellungen, die über den ganzen text.
Die Allgemeine Idee ist, dass Sie aufgeteilt werden die beiden Saiten in Frage, in allen möglichen 2-3 Zeichen, Teilstrings (n-Gramm) und behandeln Sie die Anzahl der gemeinsamen n-Gramme zwischen den beiden Zeichenfolgen als Ihre ähnlichkeit Metrik. Dies kann dann normalisiert durch Division der gemeinsame Zahl durch die Gesamtzahl der n-Gramme in der längeren Zeichenfolge. Dies ist trivial zu berechnen, aber ziemlich mächtig.
Für die Beispiel-Sätze:
A-und B-teilen 18 2-Gramm
A-und C-teilen nur 8 2-Gramm
aus 20 insgesamt möglich.
Dies wurde diskutiert in mehr detail in der Gravano et al. Papier.
tf-idf-und Cosinus-ähnlichkeit
Einer nicht so trivialen alternative, aber fest verankert in der Informationstheorie wäre die Verwendung von term term Frequenz–inverse Dokument-Frequenz (tf-idf) Wiegen die Münzen, konstruieren Satz Vektoren und verwenden Sie dann Kosinus-ähnlichkeit, wie die ähnlichkeit Metrik.
Den Algorithmus ist:
Levenshtein-änderungen und Metaphone -
Bezug auf andere Antworten. Damerau–Levenshtein modificication unterstützt nur die Umsetzung der zwei benachbarte Zeichen. Metaphone wurde entworfen, um zu entsprechen Wörter, die gleich klingen und nicht
für die ähnlichkeit matching.
Einfach. Verwenden Sie einfach die Damerau-Levenshtein Abstand auf die Worte statt Buchstaben.
Explodieren zu Räumen, Sortieren Sie das array, implodieren, dann tun die Levenshtein.
Können Sie auch versuchen, diese. (nur eine zusätzliche Anregung)
Dies zeigt, dass die 1. und 2. ähnlicher sind, als einer und drei und zwei und drei.
Ich habe Implementierung der levenshtein-in einer Rechtschreibprüfung.
Was Sie für Fragen zählt Transpositionen als 1 Bearbeiten.
Dies ist einfach, wenn Sie nur wollen, um zu zählen Transpositionen aus einem Wort entfernt. Allerdings ist für die Umsetzung der Wörter 2 oder mehr entfernt, die neben der Algorithmus ist worst-case-Szenario
!(max(wordorder1.length(), wordorder2.length()))
. Hinzufügen eines nicht-linearen subalgorithm zu einer bereits quadratischen Algorithmus ist keine gute Idee.Dies ist, wie es funktionieren würde.
NUR für berühren Transpositionen. Wenn Sie möchten, dass alle Transpositionen, müsste man für jede position arbeiten Sie sich rückwärts von diesem Punkt vergleichen
Damit Sie sehen, warum Sie nicht auch in die standard-Methode.
Nehmen diese Antwort und nehmen Sie die folgende änderung:
Dies ist für die Wörterbuch-Suche in einem trie, sondern um die Anpassung an ein einzelnes Wort, es ist die gleiche Idee. Du machst das branch-and-bound, und an jedem Punkt, können Sie jede änderung, die Sie mögen, so lange wie Sie geben es Preis.
Beseitigen Sie doppelte Wörter zwischen den beiden strings, und verwenden Sie dann die Levenshtein -.
ich glaube, das ist ein gutes Beispiel für die Verwendung eines Vektor-Raum-Suchmaschine.
in dieser Technik, jedes Dokument, das im wesentlichen wird ein Vektor mit so vielen Dimensionen, wie es unterschiedliche Wörter im gesamten Korpus; ähnliche Dokumente dann besetzen die angrenzenden Gebiete in diesem Vektorraum. eine schöne Eigenschaft dieses Modells ist, dass Abfragen auch nur Unterlagen: um eine Anfrage zu beantworten, die Sie einfach berechnen Sie Ihre position im Vektor-Raum, und Ihre Ergebnisse sind die nächsten Dokumente, die Sie finden können. ich bin sicher, es gibt hol-und-go-Lösungen für PHP gibt.
zu fuzzify Ergebnisse von Vektorraum, könntest du überlegen, das zu tun Wortstamm /ähnliche natürlicher Sprache Verarbeitung Technik, und verwenden Sie die levenshtein-zu konstruieren sekundären Abfragen für ähnliche Wörter, die auftreten, in Ihrem Allgemeinen Wortschatz.
Wenn der erste string ist und der zweite ist B:
Beispiel:
Könnte man verbessern, Schritt 2, indem Sie es in mehreren Durchgängen, Suche nur exakte Treffer auf den ersten, dann finden enge matches für die Worte in Einem, dass nicht ein Begleiter im B* - doch, dann weniger enge Spiele, etc.