From ae5fd028c2e79298cd770104384c1abebf121e12 Mon Sep 17 00:00:00 2001 From: Floke Date: Fri, 11 Apr 2025 11:33:21 +0000 Subject: [PATCH] =?UTF-8?q?1.5.11:=20Dispatcher=20und=20modulare=20Batch-P?= =?UTF-8?q?rozesse=20f=C3=BCr=20Wiki,=20Website=20und=20Branch=20integrier?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Neuer run_dispatcher, der den Startpunkt (erste Zeile ohne Zeitstempel in AO ab Zeile 7) ermittelt und den verarbeitenden Bereich (z. B. 50 Zeilen) definiert. - Separate Batch-Funktionen: process_wiki_batch (Spalten S–Y), process_website_batch (Spalten AR/AS) und process_branch_batch (Spalten W–Y) werden je nach Modus aufgerufen. - Erlaubt getrennte oder kombinierte Durchläufe via Modus-Parameter. - Verbesserte Log-Ausgaben unterstützen die Fehleranalyse. --- brancheneinstufung.py | 143 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 137 insertions(+), 6 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index bd48734a..ff18ccf5 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -1,15 +1,18 @@ #!/usr/bin/env python3 """ -Version: v1.5.3 +Version: v1.5.4 Datum: {aktuelles Datum} Git-Überschrift (max. 100 Zeichen): -1.5.3: Optimierung Batch-Modus und Alignment-Demo Integration für robustes Update +1.5.4: Dispatcher und modulare Batch-Prozesse für Wiki, Website und Branch integriert Git-Änderungsbeschreibung: -- Neue Funktion get_email_address zur Erzeugung der E-Mail-Adresse im Format vorname.nachname@domain.tld -- Anpassung von process_contact_research: E-Mail-Adresse in Spalte I eingetragen, LinkedIn-Link und Timestamp entsprechend verschoben -- Integration der E-Mail-Generierung in den bestehenden Kontaktverarbeitungs-Workflow, bestehende Funktionen weitgehend unverändert +- Neuer run_dispatcher, der den Startpunkt (erste Zeile ohne Zeitstempel in AO ab Zeile 7) + ermittelt und den verarbeitenden Bereich (z. B. 50 Zeilen) definiert. +- Separate Batch-Funktionen: process_wiki_batch (Spalten S–Y), process_website_batch (Spalten AR/AS) + und process_branch_batch (Spalten W–Y) werden je nach Modus aufgerufen. +- Erlaubt getrennte oder kombinierte Durchläufe via Modus-Parameter. +- Verbesserte Log-Ausgaben unterstützen die Fehleranalyse. """ @@ -37,7 +40,7 @@ except ImportError: # ==================== KONFIGURATION ==================== class Config: - VERSION = "v1.5.3" + VERSION = "v1.5.4" LANG = "de" CREDENTIALS_FILE = "service_account.json" SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" @@ -98,6 +101,134 @@ def simple_normalize_url(url): except Exception as e: return "k.A." + + +def process_wiki_batch(main_sheet, data, start_row, end_row): + """ + Batch-Prozess für Wikipedia-Verifizierung (Wiki-Modus): + - Verarbeitet alle Zeilen von start_row bis end_row in Gruppen (Batchgröße = Config.BATCH_SIZE). + - Für jeden Batch wird ein aggregierter Prompt erstellt und an ChatGPT geschickt. + - Die Aggregat-Ergebnisse werden zeilenweise in Spalte S (Wiki-Validierung), T (alternativer Wiki-Artikel), + U (Wiki-Erklärung) und V–Y (Platzhalter) geschrieben. + """ + batch_size = Config.BATCH_SIZE + batches = [] + row_numbers = [] + for i in range(start_row, end_row + 1): + row = data[i - 1] + entry_text = ( + f"Eintrag {i}:\n" + f"Firmenname: {row[1] if len(row) > 1 else ''}\n" + f"CRM-Beschreibung: {row[7] if len(row) > 7 else ''}\n" + f"Wikipedia-URL: {row[11] if len(row) > 11 and row[11].strip() not in ['', 'k.A.'] else 'k.A.'}\n" + f"Wiki-Absatz: {row[12] if len(row) > 12 else 'k.A.'}\n" + f"Wiki-Kategorien: {row[16] if len(row) > 16 else 'k.A.'}\n" + "-----\n" + ) + batches.append(entry_text) + row_numbers.append(i) + if len(batches) == batch_size: + _process_batch(main_sheet, batches, row_numbers) + batches = [] + row_numbers = [] + if batches: + _process_batch(main_sheet, batches, row_numbers) + debug_print("Wiki batch processing completed.") + +def process_website_batch(main_sheet, data, start_row, end_row): + """ + Batch-Prozess für Website-Scraping (Website-Modus): + - Für jede Zeile von start_row bis end_row wird, falls eine CRM-Website vorhanden ist, + get_website_raw aufgerufen, um den Rohtext abzurufen, und summarize_website_content zur Zusammenfassung. + - Die Ergebnisse werden in Spalte AR (Website Rohtext) und AS (Website Zusammenfassung) geschrieben. + """ + for i in range(start_row, end_row + 1): + row = data[i - 1] + website = row[3] if len(row) >= 4 else "" + if website.strip() == "" or website.strip().lower() == "k.a.": + debug_print(f"Zeile {i}: Kein gültiger Website-Eintrag.") + continue + raw_text = get_website_raw(website) + summary = summarize_website_content(raw_text) + try: + main_sheet.update(values=[[raw_text]], range_name=f"AR{i}") + main_sheet.update(values=[[summary]], range_name=f"AS{i}") + debug_print(f"Zeile {i}: Website-Daten aktualisiert.") + except Exception as e: + debug_print(f"Fehler beim Updaten der Website-Daten in Zeile {i}: {e}") + time.sleep(Config.RETRY_DELAY) + debug_print("Website batch processing completed.") + +def process_branch_batch(main_sheet, data, start_row, end_row): + """ + Batch-Prozess für Brancheneinschätzung (Branch-Modus): + - Für jede Zeile von start_row bis end_row werden die relevanten Felder für die Brancheneinschätzung ausgelesen. + - Es werden evaluate_branche_chatgpt aufgerufen, die das Branchenergebnis als Dictionary zurückgibt. + - Die Ergebnisse werden in Spalte W (Chat Vorschlag Branche), X (Chat Konsistenz Branche) + und Y (Chat Begründung Abweichung Branche) geschrieben. + """ + for i in range(start_row, end_row + 1): + row = data[i - 1] + crm_branche = row[6] if len(row) > 6 else "" + beschreibung = row[7] if len(row) > 7 else "" + wiki_branche = row[14] if len(row) > 14 else "" + wiki_kategorien = row[17] if len(row) > 17 else "" + # Website Zusammenfassung aus Spalte AS (Index 45, wenn vorhanden) + website_summary = row[44] if len(row) > 44 else "" + result = evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary) + try: + main_sheet.update(values=[[result["branch"]]], range_name=f"W{i}") + main_sheet.update(values=[[result["consistency"]]], range_name=f"X{i}") + main_sheet.update(values=[[result["justification"]]], range_name=f"Y{i}") + debug_print(f"Zeile {i}: Branch-Einschätzung aktualisiert: {result}") + except Exception as e: + debug_print(f"Fehler beim Updaten der Branch-Daten in Zeile {i}: {e}") + time.sleep(Config.RETRY_DELAY) + debug_print("Branch batch processing completed.") + +def run_dispatcher(mode, row_limit=None): + """ + Dispatcher-Funktion: + - Ermittelt aus dem Google Sheet ab Zeile 7 die erste Zeile, in der in Spalte AO (Index 41) kein Zeitstempel steht. + - Legt den zu verarbeitenden Bereich fest: ab diesem Startpunkt werden row_limit Zeilen (falls angegeben) verarbeitet. + - Basierend auf dem Modus-Parameter (wiki, website, branch, combined) werden die entsprechenden Batch-Prozesse gestartet. + """ + debug_print(f"Starte Dispatcher im Modus '{mode}' mit row_limit={row_limit}.") + gc = gspread.authorize(ServiceAccountCredentials.from_json_keyfile_name( + Config.CREDENTIALS_FILE, ["https://www.googleapis.com/auth/spreadsheets"])) + sh = gc.open_by_url(Config.SHEET_URL) + main_sheet = sh.sheet1 + data = main_sheet.get_all_values() + start_row = None + for i in range(7, len(data) + 1): + row = data[i - 1] + if len(row) < 41 or row[40].strip() == "": + start_row = i + break + if start_row is None: + debug_print("Keine Zeile ohne Zeitstempel in Spalte AO gefunden. Dispatcher beendet.") + return + debug_print(f"Dispatcher: Verarbeitung startet ab Zeile {start_row}.") + if row_limit is not None: + end_row = start_row + row_limit - 1 + else: + end_row = len(data) # bis zum Ende + debug_print(f"Dispatcher: Es werden Zeilen {start_row} bis {end_row} bearbeitet.") + + if mode == "wiki": + process_wiki_batch(main_sheet, data, start_row, end_row) + elif mode == "website": + process_website_batch(main_sheet, data, start_row, end_row) + elif mode == "branch": + process_branch_batch(main_sheet, data, start_row, end_row) + elif mode == "combined": + process_wiki_batch(main_sheet, data, start_row, end_row) + process_website_batch(main_sheet, data, start_row, end_row) + process_branch_batch(main_sheet, data, start_row, end_row) + else: + debug_print("Ungültiger Modus im Dispatcher.") + + def normalize_string(s): """ Normalisiert Sonderzeichen in einem String anhand eines umfangreichen Mappings.