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 keinen ppb-Wert. Auf dem Testsplit (elf ppb-Werte) ist MESSWERT fü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. MESSSTATION und GRENZWERT kommen 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

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

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-reported
    0.844
  • micro-P, Hybrid on LANUK Luftqualität NER (Testsplit, Goldstandard)
    test set self-reported
    0.912
  • micro-R, Hybrid on LANUK Luftqualität NER (Testsplit, Goldstandard)
    test set self-reported
    0.785