v1.2.7: Verbesserte numerische Bereinigung; robustere Umwandlung von Umsatz & Mitarbeiterzahlen

Verbesserte Numerische Extraktion:
In extract_numeric_value werden nun führende Nicht-Ziffern entfernt. Es wird unterschieden, ob ein Komma als Dezimaltrennzeichen oder als Tausendertrenner genutzt wird. Dadurch werden Werte wie "2,395 Mrd. Euro" korrekt in 2395 Mio. Euro umgerechnet und Mitarbeiterzahlen wie "ca. 800" werden korrekt extrahiert.

Erweiterte Debug-Ausgabe:
Die bereinigten Vergleichswerte für CRM- und Wikipedia-Umsätze werden im Log ausgegeben, um Formatierungsprobleme schneller zu erkennen.

Fallback-Handling:
Bei fehlerhafter Umwandlung wird der Originaltext als Fallback zurückgegeben.
This commit is contained in:
2025-04-01 18:28:40 +00:00
parent 3d403b113b
commit 46a7b62848

View File

@@ -14,7 +14,7 @@ import csv
# ==================== KONFIGURATION ====================
class Config:
VERSION = "v1.2.6" # v1.2.6: Erweiterte String-Bereinigung und robustere Umwandlung von Umsatz/Mitarbeiterwerten
VERSION = "v1.2.7" # v1.2.7: Verbesserte numerische Extraktion für Umsatz und Mitarbeiterzahlen
LANG = "de"
CREDENTIALS_FILE = "service_account.json"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
@@ -72,34 +72,36 @@ def normalize_company_name(name):
return normalized.lower()
def extract_numeric_value(raw_value, is_umsatz=False):
# Erweiterte Vorverarbeitung: Entferne gängige Zusätze und unerwünschte Zeichen.
raw_value = raw_value.strip()
if not raw_value:
return "k.A."
# Entferne häufige Zusätze
# Entferne gängige Zusätze
raw_value = re.sub(r'\b(ca\.?|circa|etwa|über|rund)\b', '', raw_value, flags=re.IGNORECASE)
# Entferne unnötige Leerzeichen und Sonderzeichen
raw_value = raw_value.replace("\xa0", " ").strip()
raw = raw_value.lower()
match = re.search(r'([\d.,]+)', raw, flags=re.UNICODE)
if not match or not match.group(1).strip():
# Entferne führende Nicht-Ziffern
num_str = re.sub(r'^[^\d]+', '', raw_value)
# Extrahiere die Zahl (Ziffern, Komma und Punkt)
match = re.search(r'([\d.,]+)', num_str)
if not match:
debug_print(f"Keine numerischen Zeichen gefunden im Rohtext: '{raw_value}'")
return "k.A."
num_str = match.group(1)
# Prüfe, ob Komma als Dezimaltrennzeichen genutzt wird (deutsches Format)
if ',' in num_str and num_str.count(',') == 1 and len(num_str.split(',')[1]) <= 2:
num_str = num_str.replace('.', '').replace(',', '.')
# Prüfe, ob ein einzelnes Komma als Dezimaltrennzeichen verwendet wird (wenn kein Punkt vorhanden)
if ',' in num_str and '.' not in num_str and len(num_str.split(',')[1]) <= 2:
num_str = num_str.replace(',', '.')
else:
num_str = num_str.replace(' ', '').replace('.', '')
# Entferne alle Kommas als Tausendertrennzeichen
num_str = num_str.replace(',', '')
try:
num = float(num_str)
except Exception as e:
debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
return raw_value
if is_umsatz:
if "mrd" in raw or "milliarden" in raw:
raw_lower = raw_value.lower()
if "mrd" in raw_lower or "milliarden" in raw_lower:
num *= 1000
elif "mio" in raw or "millionen" in raw:
elif "mio" in raw_lower or "millionen" in raw_lower:
pass
else:
num /= 1e6
@@ -402,11 +404,6 @@ class DataProcessor:
if i >= self.sheet_handler.get_start_index():
self._process_single_row(i, row)
def _process_single_row(self, row_num, row_data):
# Neues Schema:
# B: Firmenname, C: Website, CRM-Umsatz in Spalte I (Index 8)
# Wikipedia-Daten: Spalten K bis Q
# ChatGPT Umsatz in Spalte AF, Vergleich in Spalte AG,
# Timestamp in Spalte AH, Version in Spalte AI.
company_name = row_data[1] if len(row_data) > 1 else ""
website = row_data[2] if len(row_data) > 2 else ""
wiki_update_range = f"K{row_num}:Q{row_num}"
@@ -429,7 +426,7 @@ class DataProcessor:
'full_infobox': 'k.A.'
}
wiki_values = [
"k.A.", # Vorschlag Wiki URL
"k.A.", # Vorschlag Wiki URL (spalte K)
company_data.get('url', 'k.A.'),
company_data.get('first_paragraph', 'k.A.'),
company_data.get('branche', 'k.A.'),
@@ -438,15 +435,13 @@ class DataProcessor:
company_data.get('categories', 'k.A.')
]
self.sheet_handler.sheet.update(values=[wiki_values], range_name=wiki_update_range)
time.sleep(1) # 1 Sekunde Pause, um sicherzustellen, dass die Daten gespeichert wurden
# ChatGPT API: Umsatzbewertung
time.sleep(1) # 1 Sekunde Pause für Datensynchronisation
wiki_umsatz = company_data.get('umsatz', 'k.A.')
if wiki_umsatz != "k.A.":
chatgpt_umsatz = evaluate_umsatz_chatgpt(company_name, wiki_umsatz)
else:
chatgpt_umsatz = "k.A."
self.sheet_handler.sheet.update(values=[[chatgpt_umsatz]], range_name=chatgpt_range)
# Umsatz-Abgleich: CRM-Umsatz (Spalte I) vs. Wikipedia-Umsatz
crm_umsatz = row_data[8] if len(row_data) > 8 else "k.A."
debug_print(f"Bereinigte Vergleichswerte vor Umwandlung: CRM Umsatz: '{crm_umsatz}', Wiki Umsatz: '{wiki_umsatz}'")
abgleich_result = compare_umsatz_values(crm_umsatz, wiki_umsatz)