v1.4.5 Timestamp-Skip und URL-Scheme ergänzt, Website-Fallback bleibt, Alignment Demo vollständig be

- 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.
This commit is contained in:
2025-04-08 14:43:32 +00:00
parent 13ab783364
commit 7b625e454f

View File

@@ -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 <Zeilennummer>: <Antwort>\n"
"Dabei gelten folgende Regeln:\n- Bei Übereinstimmung: 'OK'\n- Bei Nichtübereinstimmung: 'Alternativer Wikipedia-Artikel vorgeschlagen: <URL> | X | <Begründung>'\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: <URL> | X | <Begründung>'\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")