From 663cdf7fc83ec18d4f9a8f7d534257c098070eb7 Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 4 Aug 2025 18:43:16 +0000 Subject: [PATCH] v2.0.4: refactor: Integrate Google-First Wikipedia logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Umbau von `_process_single_row` im DataProcessor zur Nutzung der neuen Such- und Validierungslogik. - Anpassung der an `search_company_article` übergebenen Parameter. - Härtung der Wikipedia-Pipeline gegen fehlgeschlagene Suchen oder Validierungen. --- data_processor.py | 109 ++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 66 deletions(-) diff --git a/data_processor.py b/data_processor.py index 2679524d..6d6ef0c9 100644 --- a/data_processor.py +++ b/data_processor.py @@ -7,7 +7,7 @@ Enthält die Logik für die Verarbeitung einzelner Zeilen sowie die Steuerung verschiedener Batch-Modi und Dienstprogramme. """ -__version__ = "v2.0.3" +__version__ = "v2.0.4" import logging import time @@ -370,85 +370,61 @@ class DataProcessor: [now_timestamp]]}) # ====================================================================== - # === 2. Wikipedia Handling (Search, Extraction, Status Reset) ======== - # ====================================================================== - run_wiki_step = 'wiki' in steps_to_run - wiki_processing_needed = self._needs_wiki_processing( - row_data, force_reeval) - - # ====================================================================== - # === 2. Wikipedia Handling (Search, Extraction) ===================== + # === 2. Wikipedia Handling (Google-First Strategie) ================= # ====================================================================== run_wiki_step = 'wiki' in steps_to_run wiki_processing_needed = self._needs_wiki_processing(row_data, force_reeval) + if run_wiki_step and wiki_processing_needed: any_processing_done = True - wiki_data_updated_in_this_run = False - self.logger.info(f"Zeile {row_num_in_sheet}: Starte Wikipedia-Pipeline...") + wiki_data_updated_in_this_run = False # Wird auf True gesetzt, wenn neue Daten extrahiert werden + self.logger.info(f"Zeile {row_num_in_sheet}: Starte Wikipedia-Pipeline (Google-First)...") + + page_obj = None - # --- Stufe 1: Intelligente URL-Suche (Kaskade) --- - url_to_process = None - 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 - - 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 - - if not url_to_process: - self.logger.debug(f" -> Stufe 1: Starte automatische Suche für '{company_name}' (Parent-Kontext: {parent_name_for_search})...") + # Stufe 1: Prüfen, ob eine manuelle URL in Spalte R vorhanden und valide ist + manual_url = self._get_cell_value_safe(row_data, "Wiki URL").strip() + if manual_url and "wikipedia.org" in manual_url.lower(): + self.logger.debug(f" -> Prüfe manuelle URL aus Spalte R: {manual_url}") try: - 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 - 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.debug(f" -> Stufe 2: Extrahiere Inhalte von '{url_to_process}'...") - try: - extracted_content = self.wiki_scraper.extract_company_data(url_to_process) - - 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 - - final_wiki_data.update(extracted_content) - wiki_data_updated_in_this_run = True + page_title = unquote(manual_url.split('/wiki/')[-1].replace('_', ' ')) + page_candidate = wikipedia.page(title=page_title, auto_suggest=False, redirect=True) + # Die Validierung benötigt zusätzliche Daten aus der Zeile + crm_city = self._get_cell_value_safe(row_data, "CRM Ort") + parent_name_for_validation = self._get_cell_value_safe(row_data, "Parent Account Name") + if self.wiki_scraper._validate_article(page_candidate, company_name, website_url, crm_city, parent_name_for_validation): + self.logger.info(f" -> Manuelle URL '{manual_url}' erfolgreich validiert.") + page_obj = page_candidate + else: + self.logger.warning(f" -> Manuelle URL '{manual_url}' konnte nicht validiert werden. Starte Google-Suche als Fallback.") except Exception as e: - self.logger.error(f" -> Stufe 2: Fehler bei der Inhaltsextraktion: {e}") - error_data = {key: 'FEHLER (Extraktion)' for key in final_wiki_data.keys()} - final_wiki_data.update(error_data) - final_wiki_data['url'] = url_to_process - wiki_data_updated_in_this_run = True + self.logger.error(f" -> Fehler bei Verarbeitung der manuellen URL '{manual_url}': {e}") + + # Stufe 2: Wenn keine valide manuelle URL, starte die "Google-First" Suche + if not page_obj: + crm_city = self._get_cell_value_safe(row_data, "CRM Ort") + parent_name_for_search = self._get_cell_value_safe(row_data, "Parent Account Name") + page_obj = self.wiki_scraper.search_company_article(company_name, website_url, crm_city, parent_name_for_search) + + # Stufe 3: Ergebnisse verarbeiten und schreiben + if page_obj: + self.logger.debug(f" -> Extrahiere Daten aus validiertem Artikel: '{page_obj.title}'") + extracted_content = self.wiki_scraper.extract_company_data(page_obj) + # Erstelle zusätzlich eine KI-Zusammenfassung des Rohtextes + new_summary = summarize_wikipedia_article(extracted_content.get('full_text'), company_name) + extracted_content['first_paragraph'] = new_summary + + final_wiki_data.update(extracted_content) + wiki_data_updated_in_this_run = True else: - self.logger.warning(f" -> Stufe 1-2: Keine gültige URL gefunden. Setze Wiki-Daten auf 'Kein Artikel gefunden'.") + self.logger.warning(f" -> Keine passende & validierte URL gefunden. Setze Wiki-Daten auf 'Kein Artikel gefunden'.") no_article_data = {key: 'Kein Artikel gefunden' for key in final_wiki_data.keys()} + no_article_data['url'] = 'Kein Artikel gefunden' # Sicherstellen, dass auch die URL zurückgesetzt wird final_wiki_data.update(no_article_data) wiki_data_updated_in_this_run = True - # --- Stufe 3: Kontextbasierte KI-Verifikation --- - verification_needed = "Suche" in search_origin - 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'{_get_col_letter(get_col_idx("Chat Wiki Konsistenzpruefung") + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('consistency', 'X')]]}) - updates.append({'range': f'{_get_col_letter(get_col_idx("Chat Begründung Wiki Inkonsistenz") + 1)}{row_num_in_sheet}', 'values': [[verification_result.get('justification', 'Fehler')]]}) - updates.append({'range': f'{_get_col_letter(get_col_idx("Wiki Verif. Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) - - # --- Finales Schreiben ins Sheet --- + # Schreibe die finalen Wiki-Daten (entweder extrahiert oder "Kein Artikel gefunden") key_mapping = { 'Wiki URL': 'url', 'Wiki Sitz Stadt': 'sitz_stadt', 'Wiki Sitz Land': 'sitz_land', 'Wiki Absatz': 'first_paragraph', 'Wiki Branche': 'branche', 'Wiki Umsatz': 'umsatz', @@ -459,6 +435,7 @@ class DataProcessor: if col_idx is not None: updates.append({'range': f'{_get_col_letter(col_idx + 1)}{row_num_in_sheet}', 'values': [[final_wiki_data.get(data_key, 'k.A.')]]}) + # Setze immer den Timestamp, um zu zeigen, dass dieser Prozess gelaufen ist updates.append({'range': f'{_get_col_letter(get_col_idx("Wikipedia Timestamp") + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]}) # --- 3. ChatGPT Evaluationen (Branch, FSM, etc.) & Plausi ---