1.5.11: Dispatcher und modulare Batch-Prozesse für Wiki, Website und Branch integriert

- 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.
This commit is contained in:
2025-04-11 11:33:21 +00:00
parent 82c033170b
commit 6095478284

View File

@@ -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 SY), process_website_batch (Spalten AR/AS)
und process_branch_batch (Spalten WY) 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 VY (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.