This commit is contained in:
2025-04-14 06:13:31 +00:00
parent 47a7f1d442
commit 672d5fc06b

View File

@@ -1406,19 +1406,21 @@ class WikipediaScraper:
# ==================== NEUE FUNKTION: Angepasste evaluate_branche_chatgpt ==================== # ==================== NEUE FUNKTION: Angepasste evaluate_branche_chatgpt ====================
def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary): def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary):
# Ziel-Branchenschema laden (BOM entfernen)
def load_target_branches(): def load_target_branches():
try: try:
# Mit "utf-8-sig" werden BOM-Zeichen automatisch entfernt.
with open("ziel_Branchenschema.csv", "r", encoding="utf-8-sig") as csvfile: with open("ziel_Branchenschema.csv", "r", encoding="utf-8-sig") as csvfile:
reader = csv.reader(csvfile) reader = csv.reader(csvfile)
# Filtern: Nur Zeilen, deren erster Eintrag (nach Strip) nicht exakt "branche" (unabhängig von Groß-/Kleinschreibung) ist. # Nimm alle Einträge (Spalte 0), ohne leere Zeilen
branches = [row[0].strip() for row in reader if row and row[0].strip().lower() != "branche"] branches = [row[0].strip() for row in reader if row and row[0].strip()]
return branches return branches
except Exception as e: except Exception as e:
debug_print(f"Fehler beim Laden des Ziel-Branchenschemas: {e}") debug_print(f"Fehler beim Laden des Ziel-Branchenschemas: {e}")
return [] return []
target_branches = load_target_branches() target_branches = load_target_branches()
target_branches_str = "\n".join(target_branches) target_branches_str = "\n".join(target_branches)
# Definierte Fokusbranchen (wie bisher)
focus_branches = [ focus_branches = [
"Gutachter / Versicherungen > Baugutachter", "Gutachter / Versicherungen > Baugutachter",
"Gutachter / Versicherungen > Technische Gutachten", "Gutachter / Versicherungen > Technische Gutachten",
@@ -1437,6 +1439,8 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
"Versorger > Telekommunikation" "Versorger > Telekommunikation"
] ]
focus_branches_str = "\n".join(focus_branches) focus_branches_str = "\n".join(focus_branches)
# API-Key laden
try: try:
with open("api_key.txt", "r") as f: with open("api_key.txt", "r") as f:
api_key = f.read().strip() 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."} return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."}
openai.api_key = api_key openai.api_key = api_key
# Fallback: Wenn kein Wikipedia-Artikel vorhanden, verwende Website-Zusammenfassung
if wiki_branche.strip().lower() == "k.a.": if wiki_branche.strip().lower() == "k.a.":
debug_print("Kein Wikipedia-Artikel vorhanden verwende Website-Zusammenfassung als Branchenbeschreibung-Fallback.") debug_print("Kein Wikipedia-Artikel vorhanden verwende Website-Zusammenfassung als Branchenbeschreibung-Fallback.")
used_description = website_summary used_description = website_summary
@@ -1452,6 +1457,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
used_description = beschreibung used_description = beschreibung
debug_print(f"Verwendete Angaben: CRM-Branche='{crm_branche}', externe Beschreibung='{beschreibung}', Wiki-Branche='{wiki_branche}', Wiki-Kategorien='{wiki_kategorien}'") 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 = ( 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" "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" 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" "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" "2. Branchenbeschreibung (Spalte G) (hier wird die Website-Zusammenfassung genutzt, wenn kein Wikipedia-Artikel vorhanden ist)\n"
"3. CRM-Branche (Spalte F)\n\n" "3. CRM-Branche (Spalte F)\n\n"
"Ordne das Unternehmen exakt einer der oben genannten Branchen zu (keine zusätzlichen Branchen erfinden). " "Ordne das Unternehmen exakt einer der oben genannten Branchen zu (keine zusätzlichen Branchen erfinden). Bitte antworte im Format:\n"
"Bitte antworte im Format:\n"
"Branche: <vorgeschlagene Branche>\nÜbereinstimmung: <ok oder X>\nBegründung: <kurze Begründung, falls abweichend, ansonsten leer>" "Branche: <vorgeschlagene Branche>\nÜbereinstimmung: <ok oder X>\nBegründung: <kurze Begründung, falls abweichend, ansonsten leer>"
) )
@@ -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}") debug_print(f"Fehler beim Aufruf der ChatGPT API für Branchenabgleich: {e}")
return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."} return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."}
branch = None # Ergebnisse parsen
consistency = None chat_branch = None
justification = "" chat_consistency = None
chat_justification = ""
for line in result.split("\n"): for line in result.split("\n"):
if line.lower().startswith("branche:"): lower_line = line.lower()
branch = line.split(":", 1)[1].strip() if lower_line.startswith("branche:"):
elif line.lower().startswith("übereinstimmung:"): chat_branch = line.split(":", 1)[1].strip()
consistency = line.split(":", 1)[1].strip() elif lower_line.startswith("übereinstimmung:"):
elif line.lower().startswith("begründung:"): chat_consistency = line.split(":", 1)[1].strip()
justification = 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, # Überprüfung: Wird ein Branch vorgeschlagen und ist dieser im Ziel-Schema enthalten?
# wird geprüft, ob der in CRM angegebene Branch vorhanden und gültig ist; andernfalls der erste Eintrag. valid = False
target_lower = [tb.lower() for tb in target_branches] if chat_branch:
if branch is None or branch.lower() not in target_lower: # Vergleiche normiert
debug_print("Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema, Fallback verwenden.") norm_chat = normalize_company_name(chat_branch)
fallback = None norm_targets = [normalize_company_name(tb) for tb in target_branches]
if crm_branche.strip() and crm_branche.lower() in target_lower: if norm_chat and norm_chat in norm_targets:
fallback = crm_branche.strip() valid = True
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}
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}