gwoe-wahlpruefsteine/DOKUMENTATION.md
Dotty Dotter f2a12f1238 Initial: GWÖ-Wahlprüfsteine Auswertung Bayern 2026
- 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
2026-03-30 23:37:11 +02:00

172 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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:**
1. HTML von URL laden (oder lokale Datei)
2. Tabellen parsen mit BeautifulSoup
3. Parteinamen normalisieren (Fuzzy-Matching)
4. In SQLite speichern
**Partei-Normalisierung:**
```python
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 Antwort
- `umfang`: keine/kurz/mittel/ausführlich
- `gwoe_score` (0-10): Übereinstimmung mit Matrix
- `matrix_felder`: Berührte GWÖ-Felder (z.B. ["D5", "C2"])
- `staerken/schwaechen`: Qualitative Analyse
**API-Konfiguration:**
```python
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:**
1. `partei-auswertung.md` — Detailreport mit Zitaten + Bandbreiten + Substanz-Problem
2. `parteienlandschaft.md` — Komprimierte Übersicht
3. `kandidaten-ranking.md` — Alle 27 Kandidat:innen im Einzelranking mit Kategorisierung
4. `wahlempfehlung.md` — Begründete Empfehlung + Substanz-Problem + Verweis auf Kandidat:innen
**Aggregations-Logik:**
- Durchschnittswerte pro Partei (GWÖ, Substanz, Wortanzahl)
- Bandbreiten pro Partei (MinMax 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
```sql
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
```sql
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)
1. Menschenwürde
2. Solidarität
3. Ökologische Nachhaltigkeit
4. Soziale Gerechtigkeit
5. 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:
```bash
# 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_KEY` Umgebungsvariable
## Kosten
- **Qwen Plus:** ~$0.0006 pro Bewertung
- **162 Bewertungen:** ~$0.10 gesamt
- **Modell-Alternativen:**
- `qwen-turbo`: günstiger, schneller, etwas weniger präzise
- `qwen-max`: teurer, höhere Qualität
## Erweiterungsmöglichkeiten
1. **Andere Datenquellen:** Scraper für andere Wahlprüfstein-Formate anpassen
2. **PDF-Reports:** WeasyPrint oder Quarto für ECOnGOOD-Design
3. **Zeitreihen:** Vergleich über mehrere Wahlen
4. **Interaktives Dashboard:** Streamlit oder FastAPI + SvelteKit
5. **Andere Bundesländer:** Partei-Mapping anpassen (CDU statt CSU etc.)
---
*Dokumentation erstellt: 29.03.2026*