From 7b625e454f6d6a3b2a20951b22c7dc5f3fcd7a23 Mon Sep 17 00:00:00 2001 From: Floke Date: Tue, 8 Apr 2025 14:43:32 +0000 Subject: [PATCH] =?UTF-8?q?v1.4.5=20Timestamp-Skip=20und=20URL-Scheme=20er?= =?UTF-8?q?g=C3=A4nzt,=20Website-Fallback=20bleibt,=20Alignment=20Demo=20v?= =?UTF-8?q?ollst=C3=A4ndig=20be?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - In _process_single_row() und process_verification_only() wird nun geprüft, ob in Spalte AO bereits ein Timestamp steht – in diesem Fall wird die Zeile übersprungen. - In get_website_raw() wird vor dem Abruf geprüft, ob der URL mit "http" beginnt; andernfalls wird "https://" vorangestellt. - Ansonsten bleibt die bisherige Logik (inklusive Website-Extraktion und -Zusammenfassung, Fallback in evaluate_branche_chatgpt und vollständige Alignment Demo) unverändert. --- brancheneinstufung.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 251216ba..c4cc8b52 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -1,17 +1,14 @@ #!/usr/bin/env python3 """ -Version: v1.4.4 +Version: v1.4.5 Datum: {aktuelles Datum} Git-Überschrift (max. 100 Zeichen): -v1.4.4 Fallback über Website integriert, Alignment Demo vollständig beibehalten +v1.4.5 Timestamp-Skip und URL-Scheme ergänzt, Website-Fallback bleibt, Alignment Demo vollständig beibehalten Git-Änderungsbeschreibung: -- Neue Funktionen: - • get_website_raw(url, max_length=1000): Extrahiert den bereinigten Rohtext der Firmenstartseite (bis maximal 1000 Zeichen). - • summarize_website_content(raw_text): Erstellt mithilfe der ChatGPT API eine Zusammenfassung des extrahierten Website-Texts, fokussiert auf Tätigkeitsfeld, Produkte & Leistungen. -- In evaluate_branche_chatgpt wurde ein neuer Parameter website_summary eingeführt. Falls sowohl Wikipedia-Branche als auch externe Branchenbeschreibung (Spalte H) "k.A." sind, wird website_summary als Fallback zur Branchenbewertung genutzt. -- In _process_single_row (und in process_verification_only) wird der Website-URL (aus Spalte D) verwendet, um den Rohtext und die Zusammenfassung zu ermitteln. Diese Werte werden in den Spalten AR (Website Rohtext) und AS (Website Zusammenfassung) abgelegt. -- Die Alignment Demo (Funktion alignment_demo) wurde nicht entfernt – sie ist exakt vorhanden und erweitert (Spalten A bis AS). +- In _process_single_row() und process_verification_only() wird nun geprüft, ob in Spalte AO bereits ein Timestamp steht – in diesem Fall wird die Zeile übersprungen. +- In get_website_raw() wird vor dem Abruf geprüft, ob der URL mit "http" beginnt; andernfalls wird "https://" vorangestellt. +- Ansonsten bleibt die bisherige Logik (inklusive Website-Extraktion und -Zusammenfassung, Fallback in evaluate_branche_chatgpt und vollständige Alignment Demo) unverändert. """ import os @@ -36,7 +33,7 @@ except ImportError: # ==================== KONFIGURATION ==================== class Config: - VERSION = "v1.4.4" + VERSION = "v1.4.5" LANG = "de" CREDENTIALS_FILE = "service_account.json" SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" @@ -199,6 +196,9 @@ def mark_processed(field): # ==================== NEUE FUNKTION: Website-Rohtext extrahieren ==================== def get_website_raw(url, max_length=1000): + # Falls URL kein Schema besitzt, ergänze "https://" + if not url.lower().startswith("http"): + url = "https://" + url try: response = requests.get(url, timeout=10) soup = BeautifulSoup(response.text, Config.HTML_PARSER) @@ -256,6 +256,9 @@ def process_verification_only(): batch_entries = [] row_indices = [] for i, row in enumerate(data[1:], start=2): + # Überspringe Zeilen, bei denen bereits in Spalte AO (Index 40) ein Timestamp steht + if len(row) > 40 and row[40].strip() != "": + continue if len(row) <= 25 or row[24].strip() == "": entry_text = f"Eintrag {i}:\nFirmenname: {row[1] if len(row)>1 else ''}\nCRM-Beschreibung: {row[7] if len(row)>7 else ''}\nWikipedia-URL: {row[11] if len(row)>11 and row[11].strip() not in ['', 'k.A.'] else 'k.A.'}\nWiki-Absatz: {row[12] if len(row)>12 else 'k.A.'}\nWiki-Kategorien: {row[16] if len(row)>16 else 'k.A.'}\n-----\n" batch_entries.append(entry_text) @@ -268,7 +271,7 @@ def process_verification_only(): aggregated_prompt = ("Du bist ein Experte in der Verifizierung von Wikipedia-Artikeln für Unternehmen. " "Für jeden der folgenden Einträge prüfe, ob der vorhandene Wikipedia-Artikel (URL, Absatz, Kategorien) plausibel passt. " "Gib das Ergebnis für jeden Eintrag im Format aus:\nEintrag : \n" - "Dabei gelten folgende Regeln:\n- Bei Übereinstimmung: 'OK'\n- Bei Nichtübereinstimmung: 'Alternativer Wikipedia-Artikel vorgeschlagen: | X | '\n- Falls kein Artikel gefunden wurde: 'Kein Wikipedia-Eintrag vorhanden.'\n\n") + "Regeln:\n- Bei Übereinstimmung: 'OK'\n- Bei Nichtübereinstimmung: 'Alternativer Wikipedia-Artikel vorgeschlagen: | X | '\n- Falls kein Artikel gefunden wurde: 'Kein Wikipedia-Eintrag vorhanden.'\n\n") aggregated_prompt += "\n".join(batch_entries) debug_print("Aggregierter Prompt für Verifizierungs-Batch erstellt.") agg_token_count = "n.v." @@ -738,7 +741,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."} openai.api_key = api_key - # Wenn weder Wikipedia-Branche noch externe Beschreibung vorliegen, nutze den Website-Zusammenfassungstext als Fallback + # Wenn weder Wikipedia-Branche noch externe Beschreibung vorliegen, verwende Website-Zusammenfassung als Fallback if wiki_branche.strip().lower() == "k.a." and beschreibung.strip().lower() == "k.a.": beschreibung = website_summary @@ -755,7 +758,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 dann gegebenenfalls der Website-Zusammenfassungstext, wenn beide fehlen)\n" + "2. Branchenbeschreibung (Spalte G) – (hier übernimmt gegebenenfalls der Website-Zusammenfassungstext, wenn beide 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" @@ -922,6 +925,11 @@ class DataProcessor: self._process_single_row(i, row) rows_processed += 1 def _process_single_row(self, row_num, row_data, process_wiki=True, process_chatgpt=True): + # Überspringe Zeile, falls in Spalte AO (Timestamp letzte Prüfung, Index 40) bereits ein Wert steht + if len(row_data) > 40 and row_data[40].strip() != "": + debug_print(f"Zeile {row_num} übersprungen: Timestamp bereits vorhanden.") + return + company_name = row_data[1] if len(row_data) > 1 else "" website_url = row_data[3] if len(row_data) > 3 else "k.A." current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S")