From cefda9c7c03ebc7537abcd0ccf40ac4092a75568 Mon Sep 17 00:00:00 2001 From: Floke Date: Sat, 19 Jul 2025 15:25:34 +0000 Subject: [PATCH] Anpassung Verify Wiki --- data_processor.py | 115 ++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 54 deletions(-) diff --git a/data_processor.py b/data_processor.py index ee984f0e..6651e52e 100644 --- a/data_processor.py +++ b/data_processor.py @@ -373,73 +373,81 @@ class DataProcessor: # ====================================================================== if run_wiki_step and wiki_processing_needed: any_processing_done = True - grund_message_wiki = "Re-Eval" if force_reeval else "Timestamp (Z) leer" - self.logger.info( - f"Zeile {row_num_in_sheet}: Fuehre WIKI Schritte aus (Grund: {grund_message_wiki})...") - + wiki_data_updated_in_this_run = False + self.logger.info(f"Zeile {row_num_in_sheet}: Starte Wikipedia-Pipeline...") + + # --- Stufe 1: Intelligente URL-Suche (Kaskade) --- url_to_process = None - crm_vorschlag_url_n = self._get_cell_value_safe(row_data, "CRM Vorschlag Wiki URL").strip() - current_wiki_url_r = self._get_cell_value_safe(row_data, "Wiki URL").strip() + search_origin = "Nicht festgelegt" + parent_name_o = self._get_cell_value_safe(row_data, "System Vorschlag Parent Account").strip() + parent_name_for_search = parent_name_o if parent_name_o and parent_name_o.lower() != 'k.a.' else None - # Priorität 1: URL aus Spalte N (CRM Vorschlag) - if crm_vorschlag_url_n and "wikipedia.org" in crm_vorschlag_url_n.lower(): - self.logger.debug(f" -> Nutze URL aus Spalte N (CRM Vorschlag): {crm_vorschlag_url_n}") - url_to_process = crm_vorschlag_url_n - # Priorität 2: Bereits existierende URL in Spalte R - elif current_wiki_url_r and "wikipedia.org" in current_wiki_url_r.lower(): - self.logger.debug(f" -> Nutze bestehende URL aus Spalte R: {current_wiki_url_r}") - url_to_process = current_wiki_url_r - # Priorität 3: Wenn beides leer, suche eine neue URL - else: - self.logger.debug(f" -> Spalten N und R sind leer/ungültig. Starte neue Wiki-Suche...") + # Prio 1: Manuelle URLs + for col_name, origin in [("CRM Vorschlag Wiki URL", "Spalte N"), ("Wiki URL", "Spalte R")]: + url = self._get_cell_value_safe(row_data, col_name).strip() + if url and "wikipedia.org" in url.lower(): + self.logger.debug(f" -> Stufe 1: Nutze URL aus {origin}: {url}") + url_to_process = url + search_origin = origin + break + + # Prio 2 & 3: Automatische Suche + if not url_to_process: + self.logger.debug(f" -> Stufe 1: Starte automatische Suche für '{company_name}' (Parent-Kontext: {parent_name_for_search})...") try: - search_name = company_name - if parent_account_name_d and parent_account_name_d.lower() != 'k.A.': - search_name = parent_account_name_d - self.logger.debug(f" -> Suche für Parent Account (D): '{search_name}'") - - page_obj = self.wiki_scraper.search_company_article(search_name, website_url) + page_obj = self.wiki_scraper.search_company_article(company_name, website_url, parent_name_for_search) if page_obj: url_to_process = page_obj.url - self.logger.info(f" -> Neue URL für '{search_name}' gefunden: {url_to_process}") - else: - self.logger.warning(f" -> Kein passender Artikel für '{search_name}' gefunden.") - url_to_process = "Kein Artikel gefunden" - except Exception as e_wiki_search: - self.logger.error(f" -> FEHLER bei der Wiki-Suche: {e_wiki_search}") - url_to_process = "Fehler bei Suche" - - # --- Datenextraktion & Update --- + search_origin = "Automatische Suche" + self.logger.info(f" -> Stufe 1: URL durch automatische Suche gefunden: {url_to_process}") + except Exception as e: + self.logger.error(f" -> Stufe 1: Fehler bei der automatischen Suche: {e}") + + # --- Stufe 2: Inhaltsextraktion & Aufbereitung --- if url_to_process and "wikipedia.org" in url_to_process.lower(): - self.logger.info(f" -> Extrahiere Daten von URL: {url_to_process[:100]}...") + self.logger.debug(f" -> Stufe 2: Extrahiere Inhalte von '{url_to_process}'...") try: - extracted_data = self.wiki_scraper.extract_company_data(url_to_process) - final_wiki_data = extracted_data + extracted_content = self.wiki_scraper.extract_company_data(url_to_process) + + # Neue, hochwertige Zusammenfassung erstellen + self.logger.debug(" -> Erstelle KI-Zusammenfassung des Artikel-Rohtextes...") + new_summary = summarize_wikipedia_article(extracted_content.get('full_text'), company_name) + extracted_content['first_paragraph'] = new_summary # Überschreibe den alten Absatz + + final_wiki_data.update(extracted_content) wiki_data_updated_in_this_run = True - except Exception as e_extract: - self.logger.error(f" -> FEHLER bei Datenextraktion: {e_extract}") - final_wiki_data = {key: 'k.A. (FEHLER Extr.)' for key in final_wiki_data} + + except Exception as e: + self.logger.error(f" -> Stufe 2: Fehler bei der Inhaltsextraktion: {e}") + final_wiki_data.update({key: 'FEHLER (Extraktion)' for key, val in final_wiki_data.items() if key != 'url'}) final_wiki_data['url'] = url_to_process wiki_data_updated_in_this_run = True - else: # Fall: "Kein Artikel gefunden" oder "Fehler bei Suche" - final_wiki_data['url'] = url_to_process if url_to_process else "k.A." + else: + self.logger.warning(f" -> Stufe 1-2: Keine gültige URL gefunden oder Prozess übersprungen. Setze Wiki-Daten auf 'Kein Artikel gefunden'.") + final_wiki_data.update({key: 'Kein Artikel gefunden' for key, val in final_wiki_data.items()}) wiki_data_updated_in_this_run = True - # Schreibe die finalen Wiki-Daten immer, um den Zustand zu aktualisieren - # KORREKTE EINRÜCKUNG BEGINNT HIER + # --- Stufe 3: Kontextbasierte KI-Verifikation --- + verification_needed = "Suche" in search_origin # Nur verifizieren, wenn URL automatisch gesucht wurde + if verification_needed and wiki_data_updated_in_this_run and "FEHLER" not in str(final_wiki_data.get('title')): + self.logger.debug(" -> Stufe 3: Automatisch gefundene URL erfordert KI-Verifizierung...") + verification_result = verify_wiki_article_chatgpt( + company_name=company_name, + parent_name=parent_name_for_search, + website=website_url, + wiki_title=final_wiki_data.get('title', 'k.A.'), + wiki_summary=final_wiki_data.get('first_paragraph', 'k.A.') + ) + updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Wiki Konsistenzpruefung"] + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('consistency', 'X')]]}) + updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Chat Begruendung Wiki Inkonsistenz"] + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('justification', 'Fehler')]]}) + updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki Verif. Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) + + # --- Finales Schreiben ins Sheet --- if wiki_data_updated_in_this_run: - # Update für Spalte R (Wiki URL) - updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wiki URL"] + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get('url', 'k.A.')]]}) - - # Update für die restlichen Datenfelder mit korrektem Mapping key_mapping = { - 'Wiki Sitz Stadt': 'sitz_stadt', - 'Wiki Sitz Land': 'sitz_land', - 'Wiki Absatz': 'first_paragraph', - 'Wiki Branche': 'branche', - 'Wiki Umsatz': 'umsatz', - 'Wiki Mitarbeiter': 'mitarbeiter', - 'Wiki Kategorien': 'categories' + 'Wiki URL': 'url', 'Wiki Sitz Stadt': 'sitz_stadt', 'Wiki Sitz Land': 'sitz_land', + 'Wiki Absatz': 'first_paragraph', 'Wiki Branche': 'branche', 'Wiki Umsatz': 'umsatz', + 'Wiki Mitarbeiter': 'mitarbeiter', 'Wiki Kategorien': 'categories' } for sheet_col_name, data_key in key_mapping.items(): updates.append({ @@ -447,7 +455,6 @@ class DataProcessor: 'values': [[final_wiki_data.get(data_key, 'k.A.')]] }) - # Setze IMMER den Timestamp updates.append({ 'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["Wikipedia Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]