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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user