rekneh: Rechtschreibfehler korrigieren durch Suggest, verschiedene Methoden: Jaro–Winkler distance vs. levenshtein

Hallo,

ich hatte schon mehrere Beiträge zum Thema "Rechtschreibfehler korrigieren" z.B. via Suggestvorschlag. Bisher scheinen zwei Methoden https://en.wikipedia.org/wiki/Jaro–Winkler_distance und https://de.wikipedia.org/wiki/Levenshtein-Distanz die besten Ergebnisse zu liefern.

Nach nach ettlichen Tests (mit meiner Legastenie) scheint es keinen eindeutigen Sieger zu geben. Sicher hat jeder von euch einen Favoriten oder best Practice Methoden entwickelt. Ich bin gespannt auf den Austausch.

Danke

rekneh

  1. Bisher scheinen zwei Methoden https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance und https://de.wikipedia.org/wiki/Levenshtein-Distanz die besten Ergebnisse zu liefern.

    Da kann ich Dir, mangels eigens Erfahrung, wohl kaum helfen.

    Was Dein kleines Problem betrifft: Du machst weniger Fehler als ich durch Vertippen und anschließendes "Fehler übersehen": Meine Hochachtung!

    Außer ein paar Orthografie-Trollen stört das hier übrigens keinen.

  2. ich hatte schon mehrere Beiträge zum Thema "Rechtschreibfehler korrigieren" z.B. via Suggestvorschlag. Bisher scheinen zwei Methoden https://en.wikipedia.org/wiki/Jaro–Winkler_distance und https://de.wikipedia.org/wiki/Levenshtein-Distanz die besten Ergebnisse zu liefern.

    Es erscheint mir ein irrwitziger Aufwand zu sein, Wortvorschläge alleine durch solche Unterschiedswerte finden zu wollen. Dazu müsstest du jedes geschriebene Wort mit jedem Wort eines Wörterbuchs vergleichen.

    Ich zerlege für einen ähnlichen Einsatz das zu prüfende Wort nach einer Normalisierung (in der Regel einfach Kleinschreibung) in Teile aus jeweils drei Buchstaben. Das Ausgangswort "Testwort" wird so zur Gruppe Tes, est, stw, two, wor, ort. Diese Gruppe suche ich in einer Tabelle, in der das Lexikon (also die Menge aller bekannten Wörter) auf gleiche Weise zerlegt wurde. Je mehr Übereinstimmungen ein Lexikon-Wort hat, desto eher passt es zum Ausgangswort.

    Die Lexikonstabelle hat zwei Spalten, das Wort und das Wortteil. Ein SQL-Befehl sieht vereinfacht so aus:

    select wort, count(*) as wert from lexikon where teil in ("Tes", "est", "stw", "two", "wor", "ort") having wert > 0 order by wert desc;

    (wert sollte statt lediglich größer Null eher größer der halben Anzahl der Wortteile sein, um die Anzahl der weit abliegenden Treffer zu minimieren. wort ist zudem nicht das Wort selbst, sondern ein Index, der in die eigentliche Worttabelle zeigt; für "Testwort" sechsmal "Testwort" als solches in eine Tabelle zu schreiben ist Platzverschwendung und erschwert obendrein das Gruppieren.)

    Die Suche nach Wortvorschlägen ist rasant und bedarf kaum noch Korrekturmaßnahmen. Wenn man unbedingt will, können zur Verfeinerung auf die Vorschläge noch irgendwelche Algorithmen, wie von dir erwähnt, angewendet werden.

    Varianten speichern statt der Drei-Buchstaben-Teile zusätzlich Zwei- oder Vier-Buchstaben-Teile. Es können Wortanfänge und -enden auch höher bewertet werden als Mittelteile.

  3. Es gibt ja bereits funktionierende Levenstein implementationen z.B. in Lucene und anderen Suchindexern. Wenn man die Rückwärts benutzen kann, kannst Du die einfach benutzen. Erfahrung hab ich leider auch keine, aber google hat mir dazu z.B. das hier geschmissen: https://stackoverflow.com/questions/26529445/autocorrect-using-apache-lucene

    evtl. hilft es ja weiter.

    VG Hans