Hessen-Themen-Klassifikator
TL;DR (English)
A small SetFit classifier that assigns one of
10 official EU DCAT themes
to German open-data catalog entries (title + description). Trained on the
hand-labeled catalog of the German state of Hesse
(
sven-wehser/hessen-datenschrank).
What makes it worth publishing is not the accuracy but the auditable
chain: harvest → link audit → hand labeling → blind label audit → dataset →
training → blind evaluation → transfer test, every link quantified — including
the numbers that hurt:
- In-domain (Hesse): 94.2 % on a held-out test set; against a blind
human judgment it reaches 66 % — more than the training labels themselves
(58 %), because unsystematic label noise partly averages out in training.
- Transfer (Schleswig-Holstein, blind-judged sample): 41 %. The hardest
question — did it learn themes or memorize Hesse? — has an honest answer:
too much Hesse. The failure is concentrated: one label ("Regionen und
Städte") acts as a catch-all drawer for unfamiliar text.
- This is therefore, declared honestly, a Hesse catalog navigator — not a
general German open-data classifier.
The model and the full card below are in German — as is everything it reads.
Ein kleiner SetFit-Klassifikator:
Titel + Beschreibung eines
Katalogeintrags → eines von 10 amtlichen EU-DCAT-Themen. Trainiert auf den
1377 handgetauften Einträgen des hessischen Landesportals
(
sven-wehser/hessen-datenschrank,
Spalte
thema, Version v1.1). Basis:
intfloat/multilingual-e5-small,
kontrastiv feingetunt, logistische Regression als Kopf.
Dieses Modell ist das Schlussstück einer belegbaren Kette — Ernte →
Link-Audit → Taufe → blindes Etiketten-Audit → Dataset → Training → blinde
Evaluation → Transfer-Test. Jedes Glied ist beziffert, auch die Zahlen, die
wehtun.
Die Zahlen — alle, nicht nur die schönen
| Messung | Ergebnis |
|---|
| Halteset Hessen (276 Einträge, nie im Training) | 94,2 %, Makro-F1 0,93 |
| Baseline zum Vergleich (eingefrorene Embeddings + log. Regression) | 70,7 %, Makro-F1 0,39 |
| Verlässlichkeit der Trainingsetiketten (blindes Audit, disjunkte 100er-Stichprobe) | 58 % |
| Modell gegen blindes Menschen-Urteil, Hessen | 66 % (63/95) |
| — davon Einträge, die es nie im Training sah | 81 % (13/16 — kleine Stichprobe, Vorsicht) |
| Transfer Schleswig-Holstein, gegen blindes Menschen-Urteil (100er-Stichprobe) | 41 % (36/87) |
| Transfer, automatisch gegen amtliche SH-Themen (32 476 Einträge) | 40 % (Vorbehalt: fremde Amts-Etiketten können Serienstempel sein) |
| Zum Vergleich: amtliche SH-Etiketten gegen dasselbe blinde Urteil | 69 % |
Lesehilfe: Die 94,2 % messen, wie gut das Modell die Taufe imitiert —
einschließlich ihrer Fehler. Die 66 % messen es gegen einen unabhängigen
blinden Blick: mehr als die Etiketten selbst (58 %), weil sich unsystematisches
Etiketten-Rauschen im Training teilweise herausmittelt. Die 41 % messen die
härteste Frage: Themen gelernt oder Hessen auswendig? Antwort: zu viel
Hessen auswendig.
Die ehrliche Deklaration: ein Hessen-Katalog-Navigator
Der Transfer-Fehler ist konzentriert, nicht diffus: 38 der 51 blinden
Fehlurteile in Schleswig-Holstein sind dieselbe Verwechslung — das Modell
sagt „Regionen und Städte" (13 346 von 32 636 Einträgen), wo Menschen Umwelt,
Bildung oder Wirtschaft sehen. In Hessen sammelte dieses Thema die Geo- und
Verwaltungs-Boilerplate; das Modell hat dort Stil gelernt, wo es Inhalt
hätte lernen sollen, und auf fremdem Boden wird die Schublade zum
Auffangbecken. Außerhalb dieser Schublade trifft es auch in
Schleswig-Holstein ordentlich (gegen die dortigen Amts-Etiketten: Umwelt
90 %, Landwirtschaft 96 %, Energie 91 %, Bildung 80 %).
Nutze das Modell also für das, was es belegt kann: hessische
Katalogeinträge einsortieren und durchsuchbar machen — nicht als
länderübergreifenden Themen-Klassifikator.
Verwendung
1from setfit import SetFitModel
2
3modell = SetFitModel.from_pretrained("sven-wehser/hessen-themen-klassifikator")
4modell.predict(["passage: Empfänger nach Geschlecht, Nationalität und Altersgruppen"])
5# → ['Bevoelkerung und Gesellschaft']
Eingabe-Vertrag: passage: + Titel (+ . + Beschreibung, sinnvoll bei
~600 Zeichen gekappt). Das Präfix stammt vom E5-Basismodell — ohne es sinkt
die Qualität. Ausgabe ist immer genau eines von 10 Themen (ASCII-Schreibweise,
z. B. Bevoelkerung und Gesellschaft); ein „weiß nicht" gibt es nicht (siehe
Grenzen). Stand Juli 2026: setfit 1.1.3 braucht unter transformers 5 zwei
kleine Handgriffe — siehe training.py im Projekt.
Grenzen
- Kein Enthalten. Die 122 Hessen-Einträge „bewusst ohne Thema" blieben
beim Training draußen; das Modell rät immer ein Thema. Im blinden
SH-Durchgang hätte der Mensch 13 von 100 Einträgen gar kein Thema gegeben.
- Nur 10 der 13 DCAT-Themen. „Internationale Themen", „Justiz" und
„Wissenschaft und Technologie" kamen in Hessen nicht vor — das Modell kann
sie nicht vergeben.
- Die Etiketten-Verlässlichkeit (58 %) ist die Messgrenze. Präziser als
seine Taufe kann kein Nachfolger beziffert werden.
- DCAT kennt keine Perspektiven, nur Gegenstände. Ein Datensatz kann
zugleich Verkehr und eine Gender-Auswertung sein; das eindimensionale
Schubladen-Vokabular — und damit dieses Modell — hat dafür keinen Platz.
Das ist eine Lücke der Norm, die das Modell erbt.
- Bei Ein-Wort-Metadaten sagt es wenig Belastbares (Titel „Gasverbrauch",
Beschreibung „Gasverbrauch") — genau dort, wo ein Portal Hilfe am
nötigsten hätte. Befund: Das Portal benennt, es beschreibt nicht.
- Trainiert auf formelbereinigtem Text: In Hessen wurden bekannte
Serienformeln (GENESIS, Regionalatlas, Geodienste) vor Training und Taufe
abgeschnitten; die Regexe sind auf Hessen geeicht. Der Transfer-Test lief
ehrlicherweise auf ungeschnittenem Text.
Training & Reproduzierbarkeit
SetFit auf intfloat/multilingual-e5-small (118 M Parameter, davon der
Großteil mehrsprachiges Vokabular): kontrastives
Feintuning (Batch 16, 1 Epoche, ~22 000 Paare, Saat 0), Kopf logistische
Regression. 1101 Trainings- / 276 Halteset-Einträge, stratifiziert. Trainiert
in 1 h 50 auf einem MacBook — ohne GPU-Cloud, ohne API, ohne Kosten.
Alle Werkzeuge der Kette sind kleine, lesbare Python-Skripte im
Projekt-Repo: harvest.py (Ernte), probe.py (Link-Audit), taufe.py
(Taufe + blinde Audits), build_dataset.py (Dataset), training.py
(dieses Modell), transfer_ernte.py/transfer_test.py (Transfer-Test).
Alle Stichproben deterministisch (Saaten 0, 8, 4). Trainingsdaten:
Dataset-Revision v1.1.
Bonus-Befund aus dem Transfer-Test
Mit derselben Elle (blindes 100er-Urteil) gemessen, erreichen die
amtlichen Etiketten Schleswig-Holsteins 69 % — Hessens Handtaufe kam auf
58 %, und Hessens amtliche Themen waren als Serienstempel unbrauchbar. Das
nördliche Portal pflegt nicht nur die Themen-Abdeckung besser (99,6 % der
32 636 Einträge tragen ein DCAT-Thema, in Hessen fehlten 289 komplett),
sondern etikettiert auch inhaltlich besser, als dieses Projekt es Hessen
beibringen konnte. Gute Katalogpflege ist möglich — sie findet nur nicht
überall statt.
Erstellt als privates Data-Journalism-Projekt, Juli 2026. Schwesterstück:
das Dataset
sven-wehser/hessen-datenschrank
mit Link-Audit, Embeddings und beiden Etiketten-Lagen.