Suchen Sie aus einer riesigen Datenbank mit zulässigen Wörtern (alphabetisch sortiert) und einem Wort das Wort aus der Datenbank, das dem angegebenen Wort in Bezug auf die Levenshtein-Entfernung am nächsten liegt.
Der naive Ansatz besteht natürlich darin, einfach den Abstand zwischen dem angegebenen Wort und allen Wörtern im Wörterbuch zu berechnen (wir können eine binäre Suche in der Datenbank durchführen, bevor wir die Abstände tatsächlich berechnen).
Ich frage mich, ob es eine effizientere Lösung für dieses Problem gibt. Vielleicht eine Heuristik, mit der wir die Anzahl der zu durchsuchenden Wörter reduzieren können, oder Optimierungen des Abstandsalgorithmus.
Links zu Beiträgen zum Thema sind willkommen.
quelle
Levenshtein-Automaten: http://en.wikipedia.org/wiki/Levenshtein_automaton
BK-Bäume: http://en.wikipedia.org/wiki/BK-tree
quelle
Wenn Sie eine kleine Anzahl von Fehlbearbeitungen tolerieren, können Sie versuchen, einen gepunkteten Suffixbaum zu verwenden . Haftungsausschluss: Ich habe dieses Papier geschrieben, aber es löst, was Sie wollen: Es hat hohe Speicherplatzkosten, aber die Abfragen sind sehr schnell.
Im Allgemeinen ist es besser, es anders herum zu betrachten: Sie haben einen Index aller Wörter im Wörterbuch. Stoppen Sie nun für ein eingegebenes Wort w, falls es sich im Wörterbuch befindet. Andernfalls generieren Sie alle Variationen im Abstand 1 und suchen Sie nach diesen. Wenn sie nicht da sind, suchen Sie nach Variationen in Abstand 2 und so weiter ...
An dieser Grundidee gibt es mehrere Verbesserungen.
quelle
quelle
Ich habe eine Antwort auf eine sehr ähnliche Frage unter cs.stackexchange.com ( /cs//a/2096/1490 ) geschrieben und dann diese Frage gefunden. Dort lautet die Antwort für eine ungefähre Suche nach einem nahen Nachbarn in der Bearbeitungsentfernung (dh der Algorithmus gibt eine Zeichenfolge aus, die ungefähr so nah an der Abfragezeichenfolge liegt wie der nächste Nachbar der Abfragezeichenfolge). Ich poste hier, da ich in den hier gegebenen Antworten keine der Referenzen finde, die ich dort angegeben habe.
quelle
Ich denke, was Sie wollen, ist der Wagner-Fischer-Algorithmus: https://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm Die wichtigste Erkenntnis ist, dass das Wörterbuch, das Sie durchlaufen, zwei aufeinanderfolgende Wörter enthält haben sehr wahrscheinlich ein langes Präfix, sodass Sie nicht die gesamte Matrix für jede Entfernungsberechnung aktualisieren müssen.
quelle
Sie können verwenden, Meinten Sie?
Suchen Sie dann den Levenshtein-Abstand zwischen der Antwort, die von "Meinten Sie" zurückgegeben wurde, und der Eingabezeichenfolge mithilfe der dynamischen Programmierung.
quelle
Did you mean?
Feature. Außerdem wirdDid you mean?
das Wort zurückgegeben, das der angegebenen Eingabe sehr nahe kommt und diese sehr effizient ausführt. :)Eine Möglichkeit besteht darin, ein maschinelles Lernmodell zu trainieren, um die Wörter auf Vektoren abzubilden und die Levenshtein-Distanz auf die euklidische Distanz abzubilden. Dann können Sie einen KDTree aus den Vektoren für das Wörterbuch erstellen, das Sie verwenden möchten. Ich habe hier ein Jupyter-Notizbuch erstellt: https://gist.github.com/MichaelSnowden/9b8b1e662c98c514d571f4d5c20c3a03
Wie laut DW's Kommentare:
Zusammenfassung der Modellstruktur:
Meine Trainingsdaten sind nur zufällige Zeichenfolgen, aber ich denke, die Ergebnisse könnten sich wirklich verbessern, wenn die Trainingsdaten (Tippfehler / korrektes Wort) Paare wären. Am Ende habe ich nur verwendet,
/usr/share/dict/words
weil es allgemein verfügbar ist.quelle