diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 6160c11b..9e536b98 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -1,16 +1,15 @@ #!/usr/bin/env python3 """ -Version: v1.4.6 +Version: v1.4.7 Datum: {aktuelles Datum} Git-Überschrift (max. 100 Zeichen): -v1.4.6 Erweiterte Modi: Neuer Modus 23 Website-Detail Extraction + SERP Lookup +v1.4.7 Fallback Website-Details: Mehr Logging & Fallback in Branchenbewertung Git-Änderungsbeschreibung: -- Neuer Modus 23 implementiert: Website Detail Extraction für Zeilen mit "x" in Spalte A. -- scrape_website_details() extrahiert Seitentitel, Meta-Description und h1/h2/h3 aus der Startseite. -- SERP-API Website Lookup (Modus 22) integriert: Fehlt in Spalte D eine Website, wird diese ermittelt und normalisiert. -- Alignment Demo bleibt unverändert; neue Spalten AR (Website Rohtext) und AS (Website Zusammenfassung) werden beibehalten. -- Main-Funktion und DataProcessor entsprechend der neuen Betriebsmodi angepasst. +- In evaluate_branche_chatgpt() wird geprüft, ob sowohl Wiki- als auch externe Beschreibung 'k.A.' sind. +- Falls ja, wird der Website-Zusammenfassungstext als Fallback zur Branchenbewertung genutzt. +- Zusätzliche debug_print()-Ausgaben wurden eingefügt, um anzuzeigen, welche Informationen für die Entscheidungsfindung herangezogen wurden. +- Nach der ChatGPT-Antwort wird das Endergebnis ebenfalls geloggt. """ @@ -940,15 +939,19 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg debug_print(f"Fehler beim Lesen des API-Tokens (Branche): {e}") return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."} openai.api_key = api_key - - # Wenn weder Wikipedia-Branche noch externe Beschreibung vorliegen, verwende Website-Zusammenfassung als Fallback + + # Fallback: Falls Wikipedia-Branche und externe Beschreibung beide 'k.A.' sind, nutze Website-Zusammenfassung if wiki_branche.strip().lower() == "k.a." and beschreibung.strip().lower() == "k.a.": - beschreibung = website_summary + debug_print("Keine Wiki- und externe Branchenbeschreibung vorhanden, verwende Website-Zusammenfassung als Fallback.") + used_description = website_summary + else: + 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 = ( "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"Branchenbeschreibung (Spalte G): {beschreibung if beschreibung.strip() != '' else 'k.A.'}\n" + f"Branchenbeschreibung (Spalte G): {used_description if used_description.strip() != '' else 'k.A.'}\n" f"Wikipedia-Branche (Spalte N): {wiki_branche}\n" f"Wikipedia-Kategorien (Spalte Q): {wiki_kategorien}\n\n" "Das Ziel-Branchenschema umfasst ALLE gültigen Branchen, also sowohl Fokusbranchen als auch weitere, z. B. 'Housing > Sozialbau Unternehmen'.\n" @@ -958,7 +961,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg f"{focus_branches_str}\n\n" "Gewichtung der Angaben:\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 übernimmt gegebenenfalls der Website-Zusammenfassungstext, wenn beide fehlen)\n" + "2. Branchenbeschreibung (Spalte G) – (hier wird Website-Zusammenfassung genutzt, wenn beide Wikipedia- und externe Beschreibung fehlen)\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" @@ -983,18 +986,23 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg consistency = line.split(":", 1)[1].strip() elif line.lower().startswith("begründung:"): justification = line.split(":", 1)[1].strip() + # Falls das Ergebnis nicht im Ziel-Branchenschema enthalten ist, vermerke dies if branch.lower() not in [tb.lower() for tb in target_branches]: justification = "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema." branch = "k.A." consistency = "X" + # Falls die CRM-Branche exakt übereinstimmt, löschen wir die Begründung if crm_branche.strip() and branch.lower() == crm_branche.strip().lower(): justification = "" consistency = "ok" + # Zusätzliche Debug-Ausgabe zur Endbewertung + debug_print(f"Endergebnis Branchenbewertung: Branche='{branch}', Übereinstimmung='{consistency}', Begründung='{justification}'") return {"branch": branch, "consistency": consistency, "justification": justification} except Exception as e: debug_print(f"Fehler beim Aufruf der ChatGPT API für Branchenabgleich: {e}") return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."} + def evaluate_servicetechnicians_estimate(company_name, company_data): try: with open("serpApiKey.txt", "r") as f: