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öscht dfnt
. 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.