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 ==================== # ==================== KONFIGURATION ====================
class Config: 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" LANG = "de"
CREDENTIALS_FILE = "service_account.json" CREDENTIALS_FILE = "service_account.json"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" 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.""" """Normalisiert Unicode, entfernt Referenzen und extra Whitespace."""
if not text: if not text:
return "k.A." return "k.A."
# Unicode-Normalisierung: Vereinheitlicht ambigue Zeichen (NFKC) # Unicode-Normalisierung (NFKC vereinheitlicht ambigue Zeichen)
text = unicodedata.normalize("NFKC", str(text)) text = unicodedata.normalize("NFKC", str(text))
text = re.sub(r'\[\d+\]', '', text) text = re.sub(r'\[\d+\]', '', text)
text = re.sub(r'\s+', ' ', text).strip() 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): def extract_numeric_value(raw_value, is_umsatz=False):
""" """
Extrahiert den numerischen Wert aus raw_value. Extrahiert den numerischen Wert aus raw_value.
- Nutzt Komma als Dezimaltrenner, entfernt Punkte als Tausendertrennzeichen. - Nutzt Komma als Dezimaltrenner und entfernt Punkte als Tausendertrennzeichen.
- Für Umsatz: Falls "mrd" vorkommt, wird mit 1000 multipliziert; fehlt eine Einheit, wird durch 1e6 geteilt. - 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. - 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() raw_value = raw_value.strip()
if not raw_value: if not raw_value:
return "k.A." return "k.A."
raw = raw_value.lower() # Ersetze nichtbrechende Leerzeichen durch normale Leerzeichen
match = re.search(r'([\d.,]+)', raw) raw = raw_value.lower().replace("\xa0", " ")
if not match or not match.group(1): 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." return "k.A."
num_str = match.group(1) num_str = match.group(1)
if ',' in num_str: if ',' in num_str:
# Entferne Punkte als Tausendertrennzeichen und ersetze Komma durch Punkt
num_str = num_str.replace('.', '').replace(',', '.') num_str = num_str.replace('.', '').replace(',', '.')
try: try:
num = float(num_str) num = float(num_str)
except Exception as e: except Exception as e:
debug_print(f"Fehler bei der Umwandlung von {num_str}: {e}") debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
return "k.A." return raw_value # Rückgabe des Rohtexts als Fallback
else: else:
num_str = num_str.replace(' ', '').replace('.', '') num_str = num_str.replace(' ', '').replace('.', '')
try: try:
num = float(num_str) num = float(num_str)
except Exception as e: except Exception as e:
debug_print(f"Fehler bei der Umwandlung von {num_str}: {e}") debug_print(f"Fehler bei der Umwandlung von '{num_str}' (Rohtext: '{raw_value}'): {e}")
return "k.A." return raw_value # Rückgabe des Rohtexts als Fallback
if is_umsatz: if is_umsatz:
if "mrd" in raw or "milliarden" in raw: if "mrd" in raw or "milliarden" in raw:
num *= 1000 num *= 1000