HORST – deutsche Rechtschreib- und Grammatikkorrektur
HORST ist ein Encoder-Decoder-Transformer (209 Mio. Parameter), der deutsche Texte korrigiert: Rechtschreibung, Groß-/Kleinschreibung, Kommas und einfache Grammatikfehler. Das Modell ist komplett von Grund auf trainiert. Es gibt kein Fine-Tuning und keine vortrainierten Gewichte oder Tokenizer anderer Modelle.
- Demo: Gradio-Space (ZeroGPU)
- Sprache: Deutsch
- Lizenz: Apache-2.0 (vorläufig, siehe Lizenz)
- Entwickelt von: Bayernator
Stand: Trainingsstufe 1 (künstliche Fehler), 2 Sessions. Das Modell ist ein früher Zwischenstand und noch kein Ersatz für ein ausgereiftes Korrekturprogramm. Stufe 2 (gemischte Daten, lange Texte bis 500 Wörter) und Stufe 3 (echte Korrekturen) folgen. Siehe Einschränkungen.
Modell
| Architektur | Transformer Encoder-Decoder (Transformer-Big), Pre-LayerNorm |
| Parameter | 209 Mio. |
| Schichten | 6 Encoder + 6 Decoder |
| Hidden / FFN / Köpfe | 1024 / 4096 / 16 |
| Vokabular | 32.000 (SentencePiece, selbst trainiert, spm.model) |
| Einbettungen | geteilt zwischen Encoder, Decoder und Ausgabeschicht |
| Positionen | sinusförmig, aktuelle Gewichte: maximal 256 Tokens je Eingabe |
| Gewichte | horst-ai.pt, fp16, 418 MB (nur Modell, ohne Optimizer-Zustand) |
Ein Satz geht als Eingabe hinein, der korrigierte Satz kommt heraus (Beam Search). Längere Texte werden in Sätze zerlegt und in Gruppen bis zum Token-Limit korrigiert.
Verwendung
Die Gewichte liegen als PyTorch-Datei vor, es gibt kein transformers-Format. Der Code (model.py, evaluate.py, prepare.py) gehört dazu.
pip install torch sentencepiece huggingface_hub
hf download Bayernator/horst-ai --local-dir horst-ai && cd horst-ai
import sentencepiece as spm
from evaluate import correct_text, load_model
from prepare import detokenize, split_sentences, tokenize
model = load_model(["horst-ai.pt"], "cpu") # oder "cuda"
sp = spm.SentencePieceProcessor(model_file="spm.model")
text = "ich weis nicht das es so ist. Morgen gehen wir in die stadt , und kaufen ein."
sents = [tokenize(s) for s in split_sentences(text) if s]
print(detokenize(correct_text(model, sp, sents, beam=5)))
Oder direkt auf der Kommandozeile: python evaluate.py --data . --ckpt horst-ai.pt --correct "ich weis nicht das es so ist"
Training
Zweistufiger Ansatz, alles auf Kaggle (2× T4, fp16-AMP, DDP):
Stufe 1 (dieses Modell): künstliche Fehler. Saubere Sätze aus deutscher Wikipedia (wikimedia/wikipedia, 20231101.de) und epfml/FineWeb2-HQ (deu_Latn) werden on-the-fly mit realistischen Fehlern versehen (noise.py): Tippfehler nach Tastaturnachbarschaft, Umlaut-/ß-Ersatz, Verwechslungen (das/dass, seid/seit, …), Groß-/Kleinschreibung, Kommafehler, falsche Endungen.
Geplant, noch nicht im veröffentlichten Modell:
- Stufe 2: Mischung aus künstlichen Fehlern, Wikipedia-Edits (Boyd 2018 sowie selbst gemint aus Wikipedia-Revisionen), eigenen Fehlerpaaren (
Bayernator/german-spelling-data), Falko-MERLIN-Train und on-the-fly erzeugten Spezialfehlern (special.py: Groß/Klein, Komma, lautgetreue Schreibung); Passagen bis 500 Wörter,max_len1024. - Stufe 3: Feinschliff auf echten Korrekturen (Falko-MERLIN, eigene Daten).
Das Training wird abgebrochen, sobald der Dev-Mittelwert 4 Messungen in Folge nicht steigt (--patience).
Daten und Quellen
| Quelle | Verwendung | Lizenz |
|---|---|---|
| wikimedia/wikipedia (de) | saubere Sätze (Stufe 1), Edits (Stufe 2) | CC BY-SA 4.0 / GFDL |
| epfml/FineWeb2-HQ (deu_Latn) | saubere Sätze | ODC-By 1.0 |
| Wikipedia-Edits, Boyd 2018 (boyd-wnut2018) | Fehlerpaare (Stufe 2) | CC BY-SA 3.0 |
| Falko-MERLIN (Boyd 2018; Falko + MERLIN) | Fehlerpaare Train, Dev/Test zur Auswertung | Falko CC BY 3.0, MERLIN CC BY-SA 4.0 |
| Bayernator/german-spelling-data | eigene Fehlerpaare | siehe Datensatz |
| Bayernator/german-ortho | Hard-Benchmark, nur Auswertung | Apache-2.0 |
Auswertung
Metrik: F0.5 auf Edit-Ebene (Precision gewichtet doppelt), Scorer nach Art von M2/MaxMatch in evaluate.py. Decoding: greedy (Beam 1). Gemessen wurde im Trainingslauf auf Kaggle mit dem Stand, der hier veröffentlicht ist (Stufe 1, Schritt 44.000), jeweils nur auf den ersten 200 Beispielen. Das ist eine kleine Stichprobe und kein Gesamtergebnis: Die Werte schwanken um etwa ±0,02 (Schritt 40.000: 0,397 / 0,617; Schritt 48.000: 0,390 / 0,635). Eine Auswertung auf dem vollständigen Dev-/Test-Satz und ein größerer Vergleich mit LanguageTool stehen noch aus.
| Datensatz | Beispiele | Precision | Recall | F0.5 |
|---|---|---|---|---|
| german-ortho, bench-dev (Hard-Benchmark) | 200 | 0,680 | 0,740 | ca. 0,69 |
| Falko-MERLIN, dev | 200 | 0,620 | 0,169 | ca. 0,40 |
Zum Vergleich erreicht LanguageTool 6.6 auf denselben 200 Beispielen von bench-dev F0.5 = 0,644 (P 0,647, R 0,630; gleiche Metrik).
Hinweise zur Vergleichbarkeit:
- Es ist die eigene F0.5-Implementierung aus
evaluate.py, nicht der offizielle ERRANT-Scorer. Sie ist eine Näherung an MaxMatch (zwei Zerlegungen pro Änderungsblock statt des vollen Gitters). Die Werte sind mit der Literatur nur grob vergleichbar. - Auf Falko-MERLIN ist der Recall niedrig (0,17): Das Modell hat in Stufe 1 keine echten Lernerfehler gesehen und korrigiert vorsichtig.
- Die Zahlen stammen aus kleinen Stichproben und sind nicht mit mehreren Seeds abgesichert.
Lizenz
Die Lizenz ist vorläufig und noch nicht endgültig entschieden. apache-2.0 stammt aus der Vorlage des Demo-Space. Die Trainingsdaten enthalten Quellen unter CC BY-SA (Wikipedia-Text, Boyd-Wikipedia-Edits, MERLIN), was für die Gewichte eine Share-Alike-Lizenz nahelegen könnte. Bis zur Entscheidung sollten Nutzer das nicht als rechtlich geklärt betrachten.
Einschränkungen
- Frühe Stufe: Das Modell wurde bisher nur auf künstlichen Fehlern trainiert. Es korrigiert typische Tipp- und Rechtschreibfehler gut, bei echter Lernersprache und komplexer Grammatik (Kasus, Wortstellung) deutlich schlechter.
- Kontextlänge: Mit den aktuellen Gewichten höchstens 256 Tokens (ca. ein kurzer Absatz) pro Durchgang. Längere Texte werden in Gruppen geteilt, dabei geht Kontext zwischen den Gruppen verloren.
- Übergriffe: Das Modell kann korrekte Stellen ändern, etwa Eigennamen, Fachwörter, Dialekt, bewusst gewählte Schreibweisen oder Anglizismen. Ergebnisse sollten nicht ungeprüft übernommen werden.
- Tokenisierung: Eingaben werden intern wortweise tokenisiert (Abkürzungen wie „z. B.“ werden getrennt) und danach wieder zusammengesetzt. Die Leerzeichen-Formatierung kann sich dadurch leicht ändern. Zeilenumbrüche innerhalb eines Absatzes bleiben nicht erhalten.
- Nur Deutsch. Andere Sprachen oder Code werden nicht zuverlässig behandelt.
- Bias: Trainingstexte stammen aus Wikipedia und Webtexten. Deren Themen, Stil und Fehler spiegeln sich im Modell.
Nutzung und Risiken
Gedacht ist das Modell für Rechtschreib- und Grammatikvorschläge, die ein Mensch prüft. Nicht gedacht ist es für automatische, ungeprüfte Änderungen an rechtlich oder medizinisch relevanten Texten. Das Modell erzeugt keine inhaltlich neuen Texte, kann aber bei fehlerhafter Eingabe Wörter erfinden oder auslassen.
Quellcode
Training, Datenaufbereitung, Rauschen und Auswertung liegen in den Dateien dieses Repos (model.py, train.py, prepare.py, noise.py, special.py, evaluate.py).
Zitation
@misc{horst-ai-2026,
title = {HORST: deutsche Rechtschreib- und Grammatikkorrektur, von Grund auf trainiert},
author = {Bayernator},
year = {2026},
url = {https://huggingface.co/Bayernator/horst-ai}
}