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