From cca93803845bce9aa7aa85c742942ee2febe1fbb Mon Sep 17 00:00:00 2001 From: Floke Date: Tue, 15 Apr 2025 10:33:33 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 57 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 9730221f..a01004a4 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -389,6 +389,38 @@ def is_valid_company_article(wiki_categories): return True return False +def load_target_schema_string(csv_filepath="ziel_Branchenschema.csv"): + """ + Liest das Ziel-Branchenschema aus der CSV-Datei ein. + Die CSV-Datei sollte in Spalte A den externen (Wikipedia-)Branchenbegriff + und in Spalte B den zugehörigen Zielwert enthalten. + Es werden alle eindeutigen Zielwerte gesammelt und als Aufzählung zurückgegeben. + """ + import csv + valid_targets = set() + try: + with open(csv_filepath, encoding="utf-8") as f: + reader = csv.reader(f) + for row in reader: + # Wir erwarten mindestens zwei Spalten: Externer Begriff und Zielwert + if len(row) >= 2: + target = row[1].strip() + if target: + valid_targets.add(target) + except Exception as e: + debug_print("Fehler beim Einlesen des Ziel-Branchenschemas: " + str(e)) + return "Ziel-Branchenschema nicht verfügbar." + + if valid_targets: + # Wir können die Zielwerte sortieren, um immer dieselbe Reihenfolge zu gewährleisten. + sorted_targets = sorted(valid_targets, key=lambda s: s.lower()) + return ( + "Ziel-Branchenschema: Folgende Branchenbereiche sind gültig:\n" + + "\n".join(f"- {value}" for value in sorted_targets) + + "\nBitte ordne das Unternehmen ausschließlich in einen dieser Bereiche ein." + ) + else: + return "Ziel-Branchenschema nicht verfügbar." def serp_website_lookup(company_name): """ @@ -1507,21 +1539,20 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg Vorgehen: 1. Es wird ein aggregierter Prompt mit den Angaben (CRM-Branche, Beschreibung, Wikipedia-Branche, Wikipedia-Kategorien, Website-Zusammenfassung) erstellt und an ChatGPT geschickt. - 2. Der von ChatGPT zurückgegebene externe Branchenvorschlag wird geparst. - 3. Unerwünschte Präfixe werden entfernt. - 4. Anschließend wird der externe Vorschlag mittels map_external_branch() in den - standardisierten Zielwert überführt. - 5. Falls der resultierende Standardwert noch kein hierarchisches Trennzeichen ">" enthält, - wird – sofern im CRM-Wert vorhanden – der fehlende Präfix ergänzt. - 6. Der so ermittelte externe Vorschlag wird dann übernommen, sodass der finale Rückgabewert - exakt dem Ziel-Branchenschema entspricht. - Falls kein sinnvoller externer Vorschlag vorliegt, erfolgt der Fallback auf den CRM-Wert. + 2. Zusätzlich wird das gültige Ziel-Branchenschema (als Übersicht) dem Prompt angehängt. + 3. Der von ChatGPT zurückgegebene externe Branchenvorschlag wird geparst, normalisiert und + mittels map_external_branch() in den standardisierten Zielwert überführt. + 4. Falls erforderlich, wird der CRM-Präfix ergänzt. + 5. Falls kein sinnvoller externer Vorschlag vorliegt, erfolgt der Fallback auf den CRM-Wert. """ debug_print( f"Verwendete Angaben: CRM-Branche='{crm_branche}', externe Beschreibung='{beschreibung}', " f"Wiki-Branche='{wiki_branche}', Wiki-Kategorien='{wiki_kategorien}', Website-Zusammenfassung='{website_summary}'" ) + # Hier definieren wir das Ziel-Branchenschema als Text, der ChatGPT als Grundlage dienen soll. + target_schema_info = load_target_schema_string() + prompt = ( f"Ordne das Unternehmen anhand folgender Angaben exakt einer Branche des Ziel-Branchenschemas zu:\n" f"CRM-Branche: {crm_branche}\n" @@ -1529,6 +1560,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg f"Wikipedia-Branche: {wiki_branche}\n" f"Wikipedia-Kategorien: {wiki_kategorien}\n" f"Website-Zusammenfassung: {website_summary}\n\n" + f"{target_schema_info}\n\n" "Antworte im Format:\n" "Branche: \n" "Übereinstimmung: \n" @@ -1555,6 +1587,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg debug_print("Fehler bei der ChatGPT-Anfrage: " + str(e)) return {"branch": "k.A.", "consistency": "X", "justification": "ChatGPT-Anfrage fehlgeschlagen."} + # Parsen der Antwort von ChatGPT suggested_branch = "" consistency = "" justification = "" @@ -1568,15 +1601,15 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg debug_print(f"Ursprünglicher ChatGPT-Vorschlag: '{suggested_branch}', Übereinstimmung='{consistency}', Begründung='{justification}'") + # Entferne ggf. den Zusatz "CRM-Branche:" falls vorhanden if suggested_branch.lower().startswith("crm-branche"): suggested_branch = suggested_branch.split(":", 1)[-1].strip() - # Externen Vorschlag über das Mapping in den Zielstandard überführen + # Mapping anwenden: Externen Vorschlag in den standardisierten Zielwert überführen mapped_branch = map_external_branch(suggested_branch) debug_print(f"Nach Mapping erhalten: '{mapped_branch}'") - # Hierarchie ergänzen: Falls der resultierende Mappingwert kein ">" enthält, - # wird der Präfix aus dem CRM-Wert übernommen (sofern vorhanden und sinnvoll) + # Hierarchie ergänzen: Falls das Mapping keinen hierarchischen Trennstrich enthält und ein CRM-Präfix vorhanden ist if ">" not in mapped_branch and crm_branche.lower() != "k.a.": prefix = crm_branche.split(">")[0].strip() if ">" in crm_branche else "" if prefix: