v1.1.16: Added fallback debug for Umsatz extraction; improved Mitarbeiter parsing

Unicode Normalisierung:

clean_text nutzt nun unicodedata.normalize("NFKC", ...) zur Vereinheitlichung ambigue Unicode-Zeichen.

Umsatz-Extraktion:

In extract_numeric_value wird nun vor der Regex-Suche nichtbrechende Leerzeichen (\xa0) durch normale Leerzeichen ersetzt.

Bei fehlender Umwandlung (z. B. wenn kein numerischer String gefunden wird) wird ein Debug-Log ausgegeben, der den Original-Rohtext zeigt.

Mitarbeiterextraktion:

Gleiche Methode wie bei Umsatz, wobei die Mitarbeiterzahl als ganze Zahl zurückgegeben wird.

Flexible Regex (unter Nutzung von in im Vergleich) fängt Varianten ab, sodass z. B. "4.175 (2021/22)" zu "4175" wird.
This commit is contained in:
2025-04-01 06:33:31 +00:00
parent a47fae0480
commit 4a3f290e4c

View File

@@ -13,7 +13,7 @@ import csv
# ==================== KONFIGURATION ====================
class Config:
VERSION = "v1.1.15" # v1.1.15: Umsatz in Mio € und Mitarbeiterzahl extrahiert; Unicode normalisiert
VERSION = "v1.1.16" # v1.1.16: Umsatz in Mio € & Mitarbeiterzahl extrahiert; Fallback-Debug bei fehlender Umwandlung
LANG = "de"
CREDENTIALS_FILE = "service_account.json"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
@@ -45,7 +45,7 @@ def clean_text(text):
"""Normalisiert Unicode, entfernt Referenzen und extra Whitespace."""
if not text:
return "k.A."
# Unicode-Normalisierung: Vereinheitlicht ambigue Zeichen (NFKC)
# Unicode-Normalisierung (NFKC vereinheitlicht ambigue Zeichen)
text = unicodedata.normalize("NFKC", str(text))
text = re.sub(r'\[\d+\]', '', text)
text = re.sub(r'\s+', ' ', text).strip()
@@ -75,33 +75,35 @@ def normalize_company_name(name):
def extract_numeric_value(raw_value, is_umsatz=False):
"""
Extrahiert den numerischen Wert aus raw_value.
- Nutzt Komma als Dezimaltrenner, entfernt Punkte als Tausendertrennzeichen.
- Für Umsatz: Falls "mrd" vorkommt, wird mit 1000 multipliziert; fehlt eine Einheit, wird durch 1e6 geteilt.
- Nutzt Komma als Dezimaltrenner und entfernt Punkte als Tausendertrennzeichen.
- Für Umsatz: Falls "mrd" vorkommt, wird mit 1000 multipliziert; enthält der Text keine Einheit, so wird durch 1e6 geteilt.
- Für Mitarbeiter: Gibt den ganzzahligen Wert zurück.
- Falls die Umwandlung fehlschlägt, wird der Original-Rohtext im Debug-Log ausgegeben.
"""
raw_value = raw_value.strip()
if not raw_value:
return "k.A."
raw = raw_value.lower()
match = re.search(r'([\d.,]+)', raw)
if not match or not match.group(1):
# Ersetze nichtbrechende Leerzeichen durch normale Leerzeichen
raw = raw_value.lower().replace("\xa0", " ")
match = re.search(r'([\d.,]+)', raw, flags=re.UNICODE)
if not match or not match.group(1).strip():
debug_print(f"Keine numerischen Zeichen gefunden im Rohtext: '{raw_value}'")
return "k.A."
num_str = match.group(1)
if ',' in num_str:
# Entferne Punkte als Tausendertrennzeichen und ersetze Komma durch Punkt
num_str = num_str.replace('.', '').replace(',', '.')
try:
num = float(num_str)
except Exception as e:
debug_print(f"Fehler bei der Umwandlung von {num_str}: {e}")
return "k.A."
debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
return raw_value # Rückgabe des Rohtexts als Fallback
else:
num_str = num_str.replace(' ', '').replace('.', '')
try:
num = float(num_str)
except Exception as e:
debug_print(f"Fehler bei der Umwandlung von {num_str}: {e}")
return "k.A."
debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
return raw_value # Rückgabe des Rohtexts als Fallback
if is_umsatz:
if "mrd" in raw or "milliarden" in raw:
num *= 1000