From 672d5fc06bc2ca8ce2f3abe5e599c308519558f6 Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 14 Apr 2025 06:13:31 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 76 +++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index d016b312..7694496c 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -1406,19 +1406,21 @@ class WikipediaScraper: # ==================== NEUE FUNKTION: Angepasste evaluate_branche_chatgpt ==================== def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary): + # Ziel-Branchenschema laden (BOM entfernen) def load_target_branches(): try: - # Mit "utf-8-sig" werden BOM-Zeichen automatisch entfernt. with open("ziel_Branchenschema.csv", "r", encoding="utf-8-sig") as csvfile: reader = csv.reader(csvfile) - # Filtern: Nur Zeilen, deren erster Eintrag (nach Strip) nicht exakt "branche" (unabhängig von Groß-/Kleinschreibung) ist. - branches = [row[0].strip() for row in reader if row and row[0].strip().lower() != "branche"] + # Nimm alle Einträge (Spalte 0), ohne leere Zeilen + branches = [row[0].strip() for row in reader if row and row[0].strip()] return branches except Exception as e: debug_print(f"Fehler beim Laden des Ziel-Branchenschemas: {e}") return [] target_branches = load_target_branches() target_branches_str = "\n".join(target_branches) + + # Definierte Fokusbranchen (wie bisher) focus_branches = [ "Gutachter / Versicherungen > Baugutachter", "Gutachter / Versicherungen > Technische Gutachten", @@ -1437,6 +1439,8 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg "Versorger > Telekommunikation" ] focus_branches_str = "\n".join(focus_branches) + + # API-Key laden try: with open("api_key.txt", "r") as f: api_key = f.read().strip() @@ -1445,6 +1449,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."} openai.api_key = api_key + # Fallback: Wenn kein Wikipedia-Artikel vorhanden, verwende Website-Zusammenfassung if wiki_branche.strip().lower() == "k.a.": debug_print("Kein Wikipedia-Artikel vorhanden – verwende Website-Zusammenfassung als Branchenbeschreibung-Fallback.") used_description = website_summary @@ -1452,6 +1457,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg used_description = beschreibung debug_print(f"Verwendete Angaben: CRM-Branche='{crm_branche}', externe Beschreibung='{beschreibung}', Wiki-Branche='{wiki_branche}', Wiki-Kategorien='{wiki_kategorien}'") + # System-Prompt erstellen system_prompt = ( "Du bist ein Experte im Field Service Management. Deine Aufgabe ist es, ein Unternehmen basierend auf folgenden Angaben einer Branche zuzuordnen.\n\n" f"CRM-Branche (Spalte F): {crm_branche if crm_branche.strip() != '' else 'k.A.'}\n" @@ -1467,8 +1473,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg "1. Wikipedia-Branche (Spalte N) zusammen mit Wikipedia-Kategorien (Spalte Q) (höchste Priorität, wenn verifiziert, ansonsten erhöhte Gewichtung der Kategorien)\n" "2. Branchenbeschreibung (Spalte G) – (hier wird die Website-Zusammenfassung genutzt, wenn kein Wikipedia-Artikel vorhanden ist)\n" "3. CRM-Branche (Spalte F)\n\n" - "Ordne das Unternehmen exakt einer der oben genannten Branchen zu (keine zusätzlichen Branchen erfinden). " - "Bitte antworte im Format:\n" + "Ordne das Unternehmen exakt einer der oben genannten Branchen zu (keine zusätzlichen Branchen erfinden). Bitte antworte im Format:\n" "Branche: \nÜbereinstimmung: \nBegründung: " ) @@ -1484,35 +1489,44 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg debug_print(f"Fehler beim Aufruf der ChatGPT API für Branchenabgleich: {e}") return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."} - branch = None - consistency = None - justification = "" + # Ergebnisse parsen + chat_branch = None + chat_consistency = None + chat_justification = "" for line in result.split("\n"): - if line.lower().startswith("branche:"): - branch = line.split(":", 1)[1].strip() - elif line.lower().startswith("übereinstimmung:"): - consistency = line.split(":", 1)[1].strip() - elif line.lower().startswith("begründung:"): - justification = line.split(":", 1)[1].strip() + lower_line = line.lower() + if lower_line.startswith("branche:"): + chat_branch = line.split(":", 1)[1].strip() + elif lower_line.startswith("übereinstimmung:"): + chat_consistency = line.split(":", 1)[1].strip() + elif lower_line.startswith("begründung:"): + chat_justification = line.split(":", 1)[1].strip() - # Fallback-Logik: Falls der von ChatGPT vorgeschlagene Branch nicht im Ziel-Branchenschema enthalten ist, - # wird geprüft, ob der in CRM angegebene Branch vorhanden und gültig ist; andernfalls der erste Eintrag. - target_lower = [tb.lower() for tb in target_branches] - if branch is None or branch.lower() not in target_lower: - debug_print("Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema, Fallback verwenden.") - fallback = None - if crm_branche.strip() and crm_branche.lower() in target_lower: - fallback = crm_branche.strip() - elif target_branches: - fallback = target_branches[0] - else: - fallback = "k.A." - branch = fallback - consistency = "ok" - justification = "" - debug_print(f"Endergebnis Branchenbewertung: Branche='{branch}', Übereinstimmung='{consistency}', Begründung='{justification}'") - return {"branch": branch, "consistency": consistency, "justification": justification} + # Überprüfung: Wird ein Branch vorgeschlagen und ist dieser im Ziel-Schema enthalten? + valid = False + if chat_branch: + # Vergleiche normiert + norm_chat = normalize_company_name(chat_branch) + norm_targets = [normalize_company_name(tb) for tb in target_branches] + if norm_chat and norm_chat in norm_targets: + valid = True + if not valid: + # Falls der Vorschlag nicht im Schema enthalten ist, gebe klar die Fehlermeldung zurück + debug_print("Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema.") + return {"branch": "k.A.", "consistency": "X", "justification": "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema."} + else: + # Wenn der ChatGPT-Vorschlag gültig ist, vergleichen wir ihn mit der normierten CRM-Branche + norm_crm = normalize_company_name(crm_branche) + norm_chat = normalize_company_name(chat_branch) + debug_print(f"Vergleich normierter Werte: CRM='{norm_crm}' vs. ChatGPT='{norm_chat}'") + if norm_crm and norm_crm == norm_chat: + chat_consistency = "ok" + chat_justification = "" + else: + chat_consistency = "X" + debug_print(f"Endergebnis Branchenbewertung: Branche='{chat_branch}', Übereinstimmung='{chat_consistency}', Begründung='{chat_justification}'") + return {"branch": chat_branch, "consistency": chat_consistency, "justification": chat_justification}