- Scraper: HTML-Extraktion von ECOnGOOD-Webseite - Analyzer: LLM-Bewertung (Qwen) nach GWÖ-Matrix 2.0 - Aggregator: Partei-Auswertung + Kandidat:innen-Ranking - CLI: Reproduzierbarer Workflow (scrape → analyze → aggregate) - Output: 7 Dokumente inkl. Pressemitteilung und Methodik - 27 Kandidat:innen, 162 Einzelbewertungen
4.9 KiB
4.9 KiB
Wahlprüfsteine-Auswertung — Technische Dokumentation
Übersicht
CLI-Tool zur automatisierten GWÖ-Analyse von Wahlprüfstein-Antworten mit Partei-Aggregation und Kandidat:innen-Ranking.
Komponenten
1. Scraper (scraper.py)
Funktion: Extrahiert Kandidat:innen und Antworten aus der ECOnGOOD-Webseite.
Ablauf:
- HTML von URL laden (oder lokale Datei)
- Tabellen parsen mit BeautifulSoup
- Parteinamen normalisieren (Fuzzy-Matching)
- In SQLite speichern
Partei-Normalisierung:
PARTEI_MAPPING = {
r'bündnis\s*90\s*/?\s*die\s*grünen?': 'Grüne',
r'freie\s*wähler': 'Freie Wähler',
r'^csu$': 'CSU',
# ...
}
2. Analyzer (analyzer.py)
Funktion: Bewertet jede Antwort mit Qwen LLM nach GWÖ-Kriterien.
Prompt-Struktur:
- System: GWÖ-Matrix 2.0 Kontext + Bewertungsskalen
- User: Frage + Antwort + Kandidat:in-Info
- Output: Strukturiertes JSON
Bewertungsdimensionen:
substanz_score(0-3): Konkretheit der Antwortumfang: keine/kurz/mittel/ausführlichgwoe_score(0-10): Übereinstimmung mit Matrixmatrix_felder: Berührte GWÖ-Felder (z.B. ["D5", "C2"])staerken/schwaechen: Qualitative Analyse
API-Konfiguration:
client = OpenAI(
api_key=keychain["qwen-api"],
base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
)
model = "qwen-plus" # oder qwen-max für höhere Qualität
3. Aggregator (aggregator.py)
Funktion: Erstellt Partei-Statistiken und Markdown-Reports.
Reports:
partei-auswertung.md— Detailreport mit Zitaten + Bandbreiten + Substanz-Problemparteienlandschaft.md— Komprimierte Übersichtkandidaten-ranking.md— Alle 27 Kandidat:innen im Einzelranking mit Kategorisierungwahlempfehlung.md— Begründete Empfehlung + Substanz-Problem + Verweis auf Kandidat:innen
Aggregations-Logik:
- Durchschnittswerte pro Partei (GWÖ, Substanz, Wortanzahl)
- Bandbreiten pro Partei (Min–Max der Kandidat:innen)
- Ja-Quote berechnen
- Matrix-Felder aggregieren (häufigste pro Partei)
- Top-3-Zitate pro Partei extrahieren
- Kandidat:innen-Ranking mit Kategorisierung (Vorreiter / Solide / Schwach)
- Übergreifende Beobachtungen (Substanz-Problem, Bandbreiten-Analyse)
4. CLI (cli.py)
Befehle:
scrape Daten von URL laden
analyze LLM-Bewertung durchführen
aggregate Reports generieren
status Datenbankstatus anzeigen
export JSON-Export
run Vollständiger Workflow
Datenbankschema
Tabellen
kandidaten (id, vorname, nachname, plz, kommune, landkreis,
partei_raw, partei_normalisiert, ist_waehlergemeinschaft, pdf_url)
fragen (id, nummer, kurztext, volltext)
antworten_raw (id, kandidat_id, frage_id, antwort_kurz, antwort_erlaeuterung)
bewertungen (id, antwort_id, substanz_score, umfang, wortanzahl,
gwoe_score, gwoe_begruendung, matrix_felder,
staerken, schwaechen, model, bewertet_am)
Views
v_partei_statistik -- Aggregierte Statistiken pro Partei
v_fragen_statistik -- Statistiken pro Frage
v_top_antworten -- Beste Antworten sortiert nach GWÖ-Score
GWÖ-Matrix 2.0 Referenz
Werte (Spalten)
- Menschenwürde
- Solidarität
- Ökologische Nachhaltigkeit
- Soziale Gerechtigkeit
- Transparenz & Mitbestimmung
Berührungsgruppen (Zeilen)
- A: Lieferant:innen, Dienstleister:innen
- B: Finanzpartner:innen, Steuerzahler:innen
- C: Politische Führung, Verwaltung
- D: Bürger:innen und Wirtschaft
- E: Staat, Gesellschaft, Natur
Relevante Felder für Kommunalpolitik
- D5: Demokratische Einbindung (Bürgerbeteiligung)
- D2: Gesamtwohl der Gemeinde
- C2: Gemeinwohlorientierte Zielvereinbarung
- A3/A4: Nachhaltige/soziale Beschaffung
- B5: Partizipation in Finanzpolitik
Reproduzierbarkeit
Das Tool ist vollständig reproduzierbar ohne Dotty-Beteiligung:
# Einmalige Einrichtung
cd ~/Nextcloud/dotty/projekte/2026-03-29\ Wahlprüfsteine\ _WIP_/wahlpruefsteine
python3 -m venv .venv
source .venv/bin/activate
pip install beautifulsoup4 requests openai
# Ausführung
python3 cli.py run
Voraussetzungen:
- Python 3.11+
- Qwen API-Key in Keychain (
security find-generic-password -s qwen-api -w) - Alternativ:
DASHSCOPE_API_KEYUmgebungsvariable
Kosten
- Qwen Plus: ~$0.0006 pro Bewertung
- 162 Bewertungen: ~$0.10 gesamt
- Modell-Alternativen:
qwen-turbo: günstiger, schneller, etwas weniger präziseqwen-max: teurer, höhere Qualität
Erweiterungsmöglichkeiten
- Andere Datenquellen: Scraper für andere Wahlprüfstein-Formate anpassen
- PDF-Reports: WeasyPrint oder Quarto für ECOnGOOD-Design
- Zeitreihen: Vergleich über mehrere Wahlen
- Interaktives Dashboard: Streamlit oder FastAPI + SvelteKit
- Andere Bundesländer: Partei-Mapping anpassen (CDU statt CSU etc.)
Dokumentation erstellt: 29.03.2026