diff --git a/brancheneinstufung.py b/brancheneinstufung.py index b83244f2..704ab413 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -533,21 +533,21 @@ class DataProcessor: # ==================== NEUE FUNKTION: process_verification_only ==================== def process_verification_only(): """ - Überarbeiteter Batch‑Prozess (Modus 51): + Überarbeiteter Batch‑Prozess (Version 1.5.7, Modus 51): - Fragt in der Konsole ab, wie viele Zeilen insgesamt verarbeitet werden sollen. - - Alle Zeilen, bei denen Spalte AO (Index 40) nicht vorhanden oder leer ist, werden verarbeitet. - - Die zu verarbeitenden Zeilen werden in Paketen der Größe Config.BATCH_SIZE (z. B. 10 Zeilen) gebündelt. - - Für jedes Batch wird ein aggregierter Prompt erstellt, an ChatGPT gesendet und die aggregierte Antwort + - Ermittelt die Gesamtzahl der Zeilen (exkl. Header) und protokolliert diesen Wert. + - Alle Zeilen, bei denen Spalte AO (Index 40) entweder gar nicht vorhanden oder leer ist, werden verarbeitet. + - Diese Zeilen werden in Paketen der Größe Config.BATCH_SIZE (z. B. 10 Zeilen) gebündelt. + - Für jedes Batch wird ein aggregierter Prompt erstellt, an ChatGPT gesendet und die Antwort zeilenweise geparst. - Die Ergebnisse werden in den Spalten S bis Y geschrieben: - S: Wiki-Validierung (z. B. "OK" oder "X") + S: Wiki-Validierung ("OK" oder "X") T: Alternativer Wiki-Artikel (URL oder "Kein Wikipedia-Eintrag vorhanden.") U: Wiki-Erklärung / Begründung - V, W, X, Y: Platzhalter (leer) - - Umfassendes Logging informiert über Batch, Zeilennummern, Token-Zahl etc. + V–Y: Platzhalter (leer) + - Umfangreiche Log-Ausgaben unterstützen die Fehlerdiagnose. """ - debug_print("Starte Verifizierungsmodus (Modus 51) im Batch-Prozess...") - # Abfrage: Wie viele Zeilen sollen insgesamt verarbeitet werden? + debug_print("Starte Verifizierungsmodus (Modus 51) im Batch-Prozess (Version 1.5.7)...") try: total_rows = int(input("Wie viele Zeilen sollen insgesamt bearbeitet werden? ")) except Exception as e: @@ -559,24 +559,29 @@ def process_verification_only(): sh = gc.open_by_url(Config.SHEET_URL) main_sheet = sh.sheet1 data = main_sheet.get_all_values() + available_total = len(data) - 1 # ohne Header + debug_print(f"Anzahl Zeilen (exkl. Header): {available_total}") + if total_rows is not None: + available_rows = min(total_rows, available_total) + else: + available_rows = available_total - # Bestimme die Anzahl der zu verarbeitenden Zeilen (ohne Header) - available_rows = len(data) - 1 - if total_rows is not None and total_rows < available_rows: - available_rows = total_rows + if available_rows <= 0: + debug_print("Keine Zeilen zum Verarbeiten gefunden.") + return - batch_size = Config.BATCH_SIZE # z. B. 10, einstellbar in der Config + batch_size = Config.BATCH_SIZE # z. B. 10, einstellbar in der Config batches = [] row_numbers = [] - # Verarbeite jede Zeile (Index ab 2, da Header in Zeile 1) for i, row in enumerate(data[1:], start=2): - if i > available_rows + 1: # +1 wegen Header + if i > available_rows + 1: break - # Überspringe Zeilen, bei denen Spalte AO (Index 40) existiert und nicht leer ist. + # Wenn die Zeile mindestens 41 Spalten hat und in Spalte AO (Index 40) bereits ein Wert steht, überspringe sie. if len(row) >= 41 and row[40].strip() != "": + debug_print(f"Zeile {i} wird übersprungen, da Spalte AO bereits gefüllt ist.") continue - # Nimm diese Zeile in den Batch auf – keine weiteren Bedingungen! + # Aufnahme der Zeile in das aktuelle Batch (unabhängig von weiteren Bedingungen) entry_text = ( f"Eintrag {i}:\n" f"Firmenname: {row[1] if len(row) > 1 else ''}\n" @@ -588,7 +593,6 @@ def process_verification_only(): ) batches.append(entry_text) row_numbers.append(i) - if len(batches) == batch_size: aggregated_prompt = ( "Du bist ein Experte in der Verifizierung von Wikipedia-Artikeln für Unternehmen. " @@ -602,12 +606,10 @@ def process_verification_only(): ) aggregated_prompt += "\n".join(batches) debug_print(f"Verarbeite Batch für Zeilen {row_numbers[0]} bis {row_numbers[-1]}.") - agg_token_count = "n.v." if tiktoken: try: enc = tiktoken.encoding_for_model(Config.TOKEN_MODEL) - agg_token_count = len(enc.encode(aggregated_prompt)) - debug_print(f"Token-Zahl für aktuellen Batch: {agg_token_count}") + debug_print(f"Token-Zahl für aktuellen Batch: {len(enc.encode(aggregated_prompt))}") except Exception as e: debug_print(f"Fehler beim Token-Counting: {e}") try: @@ -663,6 +665,7 @@ def process_verification_only(): time.sleep(Config.RETRY_DELAY) batches = [] row_numbers = [] + if batches: aggregated_prompt = ( "Du bist ein Experte in der Verifizierung von Wikipedia-Artikeln für Unternehmen. " @@ -672,12 +675,10 @@ def process_verification_only(): ) aggregated_prompt += "\n".join(batches) debug_print(f"Verarbeite letztes Batch für Zeilen {row_numbers[0]} bis {row_numbers[-1]}.") - agg_token_count = "n.v." if tiktoken: try: enc = tiktoken.encoding_for_model(Config.TOKEN_MODEL) - agg_token_count = len(enc.encode(aggregated_prompt)) - debug_print(f"Token-Zahl für letztes Batch: {agg_token_count}") + debug_print(f"Token-Zahl für letztes Batch: {len(enc.encode(aggregated_prompt))}") except Exception as e: debug_print(f"Fehler beim Token-Counting im letzten Batch: {e}") try: @@ -734,6 +735,7 @@ def process_verification_only(): debug_print("Verifizierungs-Batch abgeschlossen.") + # ==================== List Metatitel, Description und Überschriften aus Websiten aus ==================== def scrape_website_details(url): """