Es gibt einen guten Aufsatz von Peter Norvig, wie man eine Rechtschreibkorrektur implementiert. Grundsätzlich handelt es sich um einen Brute-Force-Ansatz, bei dem Kandidaten-Strings mit einem bestimmten Bearbeitungsabstand ausprobiert werden. ( Hier sind einige Tipps, wie Sie die Leistung der Rechtschreibkorrektur mithilfe eines Bloom-Filters und eines schnelleren Hashing von Kandidaten verbessern können .)
Die Anforderungen an eine Rechtschreibprüfung sind schwächer. Sie müssen nur herausfinden, dass ein Wort nicht im Wörterbuch enthalten ist. Mit einem Bloom-Filter können Sie eine Rechtschreibprüfung erstellen, die weniger Speicher benötigt. Eine alte Version wird in Programming Pearls von Jon Bentley mit 64 KB für ein englisches Wörterbuch beschrieben.
Ein BK-Baum ist ein alternativer Ansatz. Ein schöner Artikel ist hier .
Die Levenshstein-Entfernung ist nicht genau die richtige Bearbeitungsentfernung für eine Rechtschreibprüfung. Es kennt nur das Einfügen, Löschen und Ersetzen. Die Transposition fehlt und erzeugt 2 für eine Transposition von 1 Zeichen (1 Löschen und 1 Einfügen). Der Abstand Damerau - Levenshtein ist der richtige Bearbeitungsabstand.
Ein Ansatz zum Generieren von Vorschlägen, die ich erfolgreich verwendet habe, aber nirgendwo beschrieben habe, besteht darin, Vorschläge (beim Erstellen des Wörterbuchs) mithilfe von "schlechten" Hash-Funktionen vorab zu berechnen.
Die Idee ist, die Arten von Rechtschreibfehlern zu untersuchen und Hash-Funktionen zu entwerfen, die demselben Bucket eine falsche Rechtschreibung zuweisen wie die richtige Rechtschreibung.
Zum Beispiel ist ein häufiger Fehler , den falschen Vokal zu bedienen, wie definate statt bestimmten . Sie entwerfen also eine Hash-Funktion, die alle Vokale als denselben Buchstaben behandelt. Eine einfache Möglichkeit, dies zu tun, besteht darin, zuerst das eingegebene Wort zu "normalisieren" und dann das normalisierte Ergebnis durch eine reguläre Hash-Funktion zu führen. In diesem Beispiel werden durch die Normalisierungsfunktion möglicherweise alle Vokale
definite
gelöschtdfnt
. Das "normalisierte" Wort wird dann mit einer typischen Hash-Funktion gehasht.Fügen Sie mit dieser speziellen Hash-Funktion alle Wörter aus Ihrem Wörterbuch in einen Hilfsindex (Hash-Tabelle) ein. Die Buckets in dieser Tabelle haben längere Kollisionslisten, da die Hash-Funktion "schlecht" ist, aber diese Kollisionslisten sind im Wesentlichen vorberechnete Vorschläge.
Wenn Sie nun ein falsch geschriebenes Wort finden, suchen Sie in den Kollisionslisten nach dem Bucket, dem die Rechtschreibfehler in den Hilfsindizes zugeordnet sind. Ta da: Sie haben eine Vorschlagsliste! Alles was Sie tun müssen, ist die Wörter darauf zu ordnen.
In der Praxis benötigen Sie einige Hilfsindizes mit anderen Hash-Funktionen, um andere Arten von Fehlern zu behandeln, z. B. transponierte Buchstaben, Einzel- / Doppelbuchstaben und sogar einen vereinfachten Soundex-ähnlichen, um phonetische Rechtschreibfehler zu erkennen. In der Praxis fand ich, dass vereinfachte Aussprachen einen langen Weg gehen und einige derjenigen, die triviale Tippfehler finden sollen, im Wesentlichen überholt haben.
Jetzt suchen Sie in jedem der Hilfsindizes nach Rechtschreibfehlern und verketten die Kollisionslisten, bevor Sie ein Ranking erstellen.
Denken Sie daran, dass die Kollisionslisten nur Wörter enthalten, die im Wörterbuch enthalten sind. Mit Ansätzen, die versuchen, alternative Schreibweisen zu generieren (wie im Artikel von Peter Norvig), können Sie (Zehntausende) Kandidaten erhalten, die Sie zuerst anhand des Wörterbuchs filtern müssen. Mit dem vorberechneten Ansatz erhalten Sie vielleicht ein paar hundert Kandidaten, und Sie wissen, dass sie alle richtig geschrieben sind, sodass Sie direkt zum Ranking springen können.
Update : Ich habe seitdem eine ähnliche Algorithmusbeschreibung gefunden, die FAROO Distributed Search . Dies ist immer noch eine Suche mit begrenzter Bearbeitungsentfernung, aber sie ist sehr schnell, da der Vorberechnungsschritt wie meine Idee "schlechte Hash-Funktionen" funktioniert. FAROO verwendet nur ein begrenztes Konzept einer schlechten Hash-Funktion.
quelle
Algorithmus
Optimierung
Die detailliertere Erklärung und den Quellcode finden Sie im Github-Projekt .
quelle
Sie müssen nicht für jedes Wort im Wörterbuch den genauen Bearbeitungsabstand kennen. Sie können den Algorithmus nach Erreichen eines Grenzwerts stoppen und das Wort ausschließen. Dies spart Ihnen viel Rechenzeit.
quelle
Die Rechtschreibprüfung ist wie im Unix-Rechtschreibprogramm sehr einfach zu implementieren. Der Quellcode ist öffentlich verfügbar. Die Korrektur kann beteiligt sein. Eine Technik besteht darin, Änderungen vorzunehmen und erneut zu überprüfen, ob dieses neue Wort im Wörterbuch enthalten ist. Solche neuen Änderungen können gruppiert und dem Benutzer angezeigt werden.
Das Unix-System verwendet ein von Mc IllRoy geschriebenes Programm. Eine alternative Möglichkeit ist die Verwendung eines Trie, der bei großen Dateien hilfreich sein kann.
Der Unix-Ansatz benötigt sehr wenig Platz für ein großes Wörterbuch, da er einen Scatter-Hash-Algorithmus verwendet.
quelle