"""Feature engineering constants for the Howzer risk scorer.""" FEATURE_DIM = 120 # 27 GoEmotions labels (no neutral in pipeline, but we include it for completeness) EMOTION_LABELS: list[str] = [ "admiration", "amusement", "anger", "annoyance", "approval", "caring", "confusion", "curiosity", "desire", "disappointment", "disapproval", "disgust", "embarrassment", "excitement", "fear", "grief", "joy", "love", "nervousness", "optimism", "pride", "realization", "relief", "remorse", "sadness", "surprise", "neutral", ] # 30 root cause categories (from MASTER_PROMPT spec) ROOT_CAUSE_CATEGORIES: list[str] = [ "pannenhilfe_wartezeit", "pannenhilfe_reparatur", "pannenhilfe_abschleppen", "pannenhilfe_service", "versicherung_kosten", "versicherung_schadenabwicklung", "versicherung_leistung", "versicherung_kuendigung", "mitgliedschaft_kuendigung", "mitgliedschaft_beitrag", "mitgliedschaft_leistung", "mitgliedschaft_service", "kundenservice_wartezeit", "kundenservice_kompetenz", "kundenservice_erreichbarkeit", "kundenservice_freundlichkeit", "spritpreis_politik", "beitragserhoehung", "positive_pannenhilfe", "positive_service", "positive_versicherung", "positive_allgemein", "reiseruecktritt", "ausland_service", "rechtsberatung", "werkstatt_partner", "mietwagen", "digitale_services", "andere", "unbekannt", ] # Mapping from benchmark/DB root cause IDs to our canonical categories ROOT_CAUSE_ID_MAP: dict[str, str] = { # Benchmark English IDs → canonical "technical_issues": "andere", "customer_service": "kundenservice_kompetenz", "pricing_billing": "versicherung_kosten", "product_quality": "andere", "product_functionality": "andere", "delivery_shipping": "andere", "returns_refunds": "andere", "installation_setup": "andere", "account_access": "andere", "performance_latency": "andere", "packaging_handling": "andere", "security_safety": "andere", "policy_terms": "andere", "product_fit_sizing": "andere", # DB German labels → canonical "Kundenservice & Support (Reaktionsfähigkeit, Wissen, Einstellung)": "kundenservice_kompetenz", "Preisgestaltung & Abrechnung (Gebühren, Wert, Kosten)": "versicherung_kosten", "Technische Probleme (Abstürze, Fehler, Konnektivität)": "andere", "Produktqualität (Mängel, Haltbarkeit, Materialien)": "andere", "Produktfunktionalität (Funktionen, Leistung, Kompatibilität)": "andere", "Lieferung & Versand (Verzögerungen, Fehlende Artikel, Falscher Artikel)": "andere", "Rücksendungen & Erstattungen (Prozess, Berechtigung, Geschwindigkeit)": "andere", "Installation & Einrichtung (Montage, Konfiguration)": "andere", "Konto & Zugang (Login, Authentifizierung)": "andere", "Leistung & Latenz (Langsam, Timeouts)": "andere", "Verpackung & Handhabung (Schaden, Schutz)": "andere", "Sicherheit & Schutz (Physische Sicherheit, Datensicherheit)": "andere", "Richtlinien & Bedingungen (Garantien, Verträge)": "andere", "Produktpassform & Größe (Kleidung, Abmessungen, Passform)": "andere", "Wartezeit_Pannenhilfe": "pannenhilfe_wartezeit", "Wartezeit_Hotline": "kundenservice_wartezeit", "Kuendigung_Drohung": "mitgliedschaft_kuendigung", "Service_Qualitaet": "kundenservice_kompetenz", "Rechnungsfehler": "versicherung_kosten", "App_Performance": "digitale_services", } CHANNELS: list[str] = [ "email", "phone", "app", "web", "letter", "social", "survey", "chat", "unknown", ] TIER_NAMES: list[str] = ["low", "medium", "high", "critical"] TIER_THRESHOLDS: dict[str, float] = { "critical": 0.88, "high": 0.72, "medium": 0.38, } # Membership tier numeric mapping MEMBERSHIP_TIER_MAP: dict[str, float] = { "basic": 0.33, "plus": 0.66, "premium": 1.0, "unknown": 0.33, } # Urgency mapping URGENCY_MAP: dict[str, float] = { "low": 0.0, "normal": 0.25, "high": 0.75, "critical": 1.0, } # Feature group index ranges FEAT_SENTIMENT = (0, 4) # 4 features FEAT_EMOTION = (4, 31) # 27 features FEAT_ROOT_CAUSE = (31, 66) # 35 features (5 scores + 30 one-hot) FEAT_HISTORY = (66, 76) # 10 features FEAT_CHANNEL = (76, 85) # 9 features FEAT_TEXT_META = (85, 91) # 6 features FEAT_DERIVED = (91, 120) # 29 features