ner-lanuk-luftqualitaet — Domänenmodell und Hybrid für Luftqualitätstexte des LANUK NRW
Ein spaCy-EntityRecognizer für sechs Fachklassen (SCHADSTOFF, ORGANISATION, MESSWERT,
MESSSTATION, RECHTSNORM, GRENZWERT), trainiert auf dem Silberstandard des Datensatzes
fhswf/lanuk-luftqualitaet-ner, plus die Regel- und Gazetteer-Schicht, mit der zusammen es das
Hybrid bildet — das beste System der zugehörigen Studienarbeit (micro-F₁ 0,844 auf dem
menschlich annotierten Testsplit).
Autor: Simeon Ehmer, Fachhochschule Südwestfalen, September 2026. Lizenz: CC BY 4.0
(Gewichte, Regelschicht, laden.py); der Trainingsdatensatz fhswf/lanuk-luftqualitaet-ner
steht unter CC BY-NC 4.0.
Was enthalten ist
| Pfad | Inhalt |
|---|---|
spacy_ner_lanuk_weights/ |
NER-Gewichte (spaCy 3.8.14, TransitionBasedParser.v2, MultiHashEmbed + statische Vektoren), gespeichert mit exclude=["vocab"]; ner/model SHA-256 6c08defe0f4036c4… |
regeln/preannotation_entityruler.py, regeln/stationen.json |
Regel- und Gazetteer-Schicht (Stand Juli 2026) und Stationsliste (79 Messorte, LUQS) |
laden.py |
lädt Domänenmodell, Regeln und Hybrid und zeigt die drei Vorhersagen für einen Beispielsatz |
requirements-cpu.txt |
gepinnte Umgebung (Python 3.11.9, spaCy 3.8.14, de_core_news_lg 3.8.0) |
training_history.json, dev_werte.json, eval_test.json |
Trainingsverlauf, Dev- und Testkennzahlen |
Laden
Die Gewichte brauchen die statischen Vektoren aus de_core_news_lg 3.8.0 (500.000 Schlüssel,
300 Dimensionen), genau wie im Training:
pip install -r requirements-cpu.txt
pip install https://github.com/explosion/spacy-models/releases/download/de_core_news_lg-3.8.0/de_core_news_lg-3.8.0-py3-none-any.whl
python laden.py "Für Benzol ist in der 39. BImSchV ein Grenzwert von 5 µg/m³ festgesetzt."
from laden import domaenenmodell, regelschicht, hybrid
nlp = domaenenmodell() # spaCy-Pipeline mit NER
pred_r = regelschicht() # text -> [[start, end, label], ...]
pred_h = hybrid(nlp, pred_r) # Hybrid: SCHADSTOFF aus Regeln, Rest aus dem Modell, Regeln haben Vorrang
pred_h("Für Benzol ist in der 39. BImSchV ein Grenzwert von 5 µg/m³ festgesetzt.")
Training
| Trainingsdaten | 315 Sätze, 290 Spannen (Silberstandard, LLM-gestützt, nicht menschlich geprüft) |
| Dev | 55 Sätze, 38 Spannen (drei Klassen) — Modellwahl nach Dev-F₁ |
| Architektur | spacy.TransitionBasedParser.v2, tok2vec: MultiHashEmbed.v2 (NORM, PREFIX, SUFFIX, SHAPE; Breite 96) + MaxoutWindowEncoder.v2 (Breite 96, Tiefe 4), statische Vektoren aus de_core_news_lg |
| Optimierung | Adam (spaCy-Standard), Dropout 0,1, Batch 4 → 32 (compounding), höchstens 40 Epochen, Early Stopping mit Patience 8 |
| Ergebnis | 17 Epochen, beste Epoche 8, Dev-F₁ 0,806; Training 144 s auf CPU; Seed 42; bitgleich wiederholt am 15.09.2026 |
| Keine Hyperparametersuche | bei 38 Dev-Spannen wäre sie Anpassung an Rauschen |
Ergebnisse (Testsplit, 80 Sätze, 79 Goldspannen; seqeval strict, IOB2)
| System | P | R | micro-F₁ | macro-F₁ (4 Klassen) | F₁ nur offene Klassen |
|---|---|---|---|---|---|
| Regeln/Gazetteer | 1,000 | 0,646 | 0,785 | 0,429 | 0,263 |
| Domänenmodell (diese Gewichte) | 0,781 | 0,633 | 0,699 | 0,541 | 0,516 |
| Hybrid | 0,912 | 0,785 | 0,844 | 0,578 | 0,593 |
zum Vergleich: deepset/gbert-large feinabgestimmt |
0,744 | 0,848 | 0,793 | 0,685 | 0,611 |
Je Klasse (F₁, Hybrid): SCHADSTOFF 0,989 · ORGANISATION 0,824 · RECHTSNORM 0,500 ·
MESSWERT 0,000 (siehe Grenzen). Der Vorsprung des Hybrids ist im gepaarten Bootstrap
(1.000 Ziehungen) belegt: +0,061 gegen die Regeln (p = 0,026), +0,140 gegen das Domänenmodell
(p < 0,002), +0,051 gegen gbert-large (p = 0,040). Vollständig in eval_test.json und im
Belegexemplar (Notebook, Kapitel 9–10).
Bekannte Grenzen
ppb-Lücke. Das Messwertmuster der Regeln kennt Massenkonzentrationen (µg/m³), keine Volumenmischungsverhältnisse (ppb,nmol/mol); das Training enthält keinenppb-Wert. Auf dem Testsplit (elfppb-Werte) istMESSWERTfür Regeln, Modell und Hybrid 0,000. Die Lücke wurde in der Arbeit bewusst nicht geschlossen, um sie messen zu können; eine Regelzeile behebt sie.- Zwei Klassen ungemessen.
MESSSTATIONundGRENZWERTkommen im Testsplit nicht vor; die Leistung darauf ist unbekannt. - Silber-Deckel. Das Modell hat aus Annotationen gelernt, die zu 0,765 (span-F₁) mit menschlicher Annotation übereinstimmen.
- Ein Dokumenttyp im Test. Alle Testsätze stammen aus einem Ringversuchsbericht; die Übertragbarkeit auf Jahresberichte oder Luftreinhaltepläne ist nicht gemessen.
- Falschfunde der Regeln sind selten, Auslassungen häufig (P 1,000, R 0,646): Wer belegbare Extraktion braucht, nimmt Regeln oder Hybrid; wer Vollständigkeit braucht, ein großes feinabgestimmtes Modell.
Zitation
Ehmer, S. (2026): Domänenspezifische Named Entity Recognition auf deutschen Luftqualitäts- und Behördentexten. Studienarbeit, Fachhochschule Südwestfalen. Modell: https://huggingface.co/fhswf/ner-lanuk-luftqualitaet · Datensatz: https://huggingface.co/datasets/fhswf/lanuk-luftqualitaet-ner
Dataset used to train fhswf/ner-lanuk-luftqualitaet
Evaluation results
- micro-F1 (seqeval strict, IOB2), Hybrid on LANUK Luftqualität NER (Testsplit, Goldstandard)test set self-reported0.844
- micro-P, Hybrid on LANUK Luftqualität NER (Testsplit, Goldstandard)test set self-reported0.912
- micro-R, Hybrid on LANUK Luftqualität NER (Testsplit, Goldstandard)test set self-reported0.785