- Detailliertere Log-Ausgaben während des gesamten Prozesses für eine bessere Nachvollziehbarkeit.
- Loggt die Anzahl der Zeilen direkt nach dem erfolgreichen Laden aus dem Google Sheet.
- Fügt explizite Start- und End-Meldungen für die regel-basierte Zuordnung (Stufe 1 & 2) hinzu.
- Loggt die genaue Anzahl der 'Undefined'-Fälle, die an die KI zur Klassifizierung gesendet werden.
- Gibt eine klare Meldung aus, wenn keine KI-Anfrage nötig ist, weil alle Fälle durch Regeln gelöst wurden.
- Verbessert die allgemeine Klarheit der Log-Nachrichten, um die Analyse von Laufzeitverhalten und potenziellen Fehlern zu erleichtern.
- Bugfix: Behebt einen kritischen APIError [400] 'Invalid list_value', der beim Zurückschreiben der Daten in das Google Sheet auftrat.
- Die Funktion `_find_best_match` gab in manchen Fällen fälschlicherweise eine Liste anstelle eines einzelnen Strings als Department zurück.
- Die Rückgabewerte der Funktion wurden korrigiert, um sicherzustellen, dass immer ein String übergeben wird.
- Dies stellt die Kompatibilität mit der Google Sheets API wieder her und macht den Schreibvorgang robust.
- Bugfix: Behebt einen `JSONDecodeError`, der auftrat, wenn die OpenAI API eine Antwort mit einleitendem Text oder ohne JSON-Array zurückgab.
- Die JSON-Extraktion in der KI-Klassifizierung wurde von einer einfachen String-Suche auf eine robuste Regex-Suche umgestellt.
- Verbessertes Fehler-Logging: Bei einem Fehler bei der KI-Klassifizierung wird nun die vollständige, rohe API-Antwort ins Log geschrieben, um die Fehlersuche zu erleichtern.
- Bugfix: Behebt ein Problem, bei dem das Skript beim Start zu hängen schien, weil große Wissensbasis-Dateien blockierend geladen wurden.
- Die Initialisierung der `ContactGrouper`-Klasse wurde verschlankt und lädt die JSON-Dateien nicht mehr automatisch.
- Eine neue Methode `load_knowledge_base()` wurde eingeführt, um das Laden der Dateien explizit und mit Logging-Feedback zu steuern.
- Das Skript gibt nun sofort nach dem Start eine Rückmeldung auf der Konsole und im Logfile, bevor zeitaufwändige Operationen beginnen.
- Verbesserte Fehlerbehandlung, falls die Wissensbasis nicht geladen werden kann.
- Erweitertes Logging mit DEBUG-Level und Logfile-Erstellung.
- Zusammenfassende Statistik der Department-Zuweisungen am Ende des Laufs.
- NEU: Stufe 3 - KI-Klassifizierung für unklare Fälle ('Undefined').
- Jobtitel, die nicht durch Stufe 1 oder 2 zugeordnet werden können, werden an die OpenAI API zur Klassifizierung gesendet.
- NEU: Lern-Mechanismus - Die von der KI ermittelten Zuordnungen werden automatisch in das 'CRM_Jobtitles'-Sheet zurückgeschrieben.
- Das System verbessert sich dadurch selbst für zukünftige Durchläufe.
--- FEATURES v5.0 ---
- NEU: Integration eines trainierten Machine-Learning-Modells (XGBoost) für die Match-Entscheidung.
- Das Modell wurde auf dem vom Benutzer bereitgestellten "Gold-Standard"-Datensatz trainiert.
- Feature Engineering: Für jeden Vergleich werden ~15 Merkmale berechnet, die dem Modell als Input dienen.
- Die alte, heuristische Scoring-Logik wurde vollständig durch das ML-Modell ersetzt.
- Ergebnis ist eine datengetriebene, hochpräzise Duplikatserkennung mit >80% Trefferquote.
- NEU: Mehrstufiges Entscheidungsmodell für höhere Präzision und "Großzügigkeit".
- Stufe 1: "Golden Match" für exakte Treffer.
- Stufe 2: "Kernidentitäts-Bonus & Tie-Breaker" zur korrekten Zuordnung von Konzerngesellschaften.
- Stufe 3: Neu kalibrierter, gewichteter Score für alle anderen Fälle.
- Intelligenter Tie-Breaker, der nur bei wirklich guten und engen Kandidaten greift.
--- FEATURES v4.0 ---
- NEU: "Kernidentitäts-Bonus": Ein hoher Bonus wird vergeben, wenn das seltenste (wichtigste) Token übereinstimmt.
Dies fördert das "großzügige Matchen" auf Basis der Kernmarke (z.B. "ANDRITZ AG" vs. "ANDRITZ HYDRO").
- NEU: Intelligenter "Shortest Name Tie-Breaker": Wird nur noch bei sehr hohen und sehr ähnlichen Scores angewendet.
- Finale Kalibrierung der Score-Berechnung und Schwellenwerte für optimale Balance.
- Golden-Rule für exakte Matches und Interaktiver Modus beibehalten.
- NEU: "Shortest Name Tie-Breaker": Bei sehr ähnlichen Scores wird der Kandidat mit dem kürzeren Namen bevorzugt,
um das Prinzip der "wirtschaftlichen Einheit" (z.B. Holding) besser abzubilden.
- Scoring-Formel und Schwellenwerte erneut feinjustiert für finale Balance.
- Golden-Rule und Interaktiver Modus beibehalten.
- Scoring-Formel und Multiplikatoren neu gewichtet, um einzigartige Namens-Tokens stärker zu bewerten ("Großzügigkeits-Boost").
- Schwellenwerte (Thresholds) erneut feinjustiert, um die Balance zwischen korrekten und falschen Treffern zu optimieren.
- Logik des Domain-Gates beibehalten und sichergestellt, dass es korrekt greift.
- Golden-Rule und Interaktiver Modus unverändert.
- Dynamische Stopword-Erkennung entfernt, da sie zu aggressiv war. Häufige Wörter erhalten nun nur ein niedriges Gewicht.
- Score-Berechnung und Schwellenwerte (Thresholds) komplett neu kalibriert für bessere Balance und Treffsicherheit.
- "Domain-Gate" wieder eingeführt: Ein Domain-Match zählt nur dann stark, wenn auch eine minimale Namensähnlichkeit besteht.
- Golden-Rule und Interaktiver Modus beibehalten.
Diese Version überarbeitet den Kern des Matching-Algorithmus grundlegend, um die Genauigkeit drastisch zu erhöhen und die manuelle Nachbearbeitung zu reduzieren. Die Änderungen basieren auf der Analyse eines umfangreichen Testdatensatzes und setzen die neue Philosophie des "großzügigen Matchens" von wirtschaftlichen Einheiten um.
Gewichtetes Namens-Scoring (TF-IDF):
- Einzigartige Namensbestandteile (z.B. "Warema") erhalten nun ein höheres Gewicht als generische Füllwörter (z.B. "Stadtwerke", "Gruppe").
- Dies löst das Problem von Fehlzuordnungen bei häufig vorkommenden, aber nicht-identifizierenden Begriffen und verbessert die Treffsicherheit bei unklaren Firmennamen signifikant.
Golden-Rule für exakte Namens-Matches:
- Eine Namensübereinstimmung von >98% führt zu einem sofortigen "Golden Match" mit einem sehr hohen Score.
- Damit wird verhindert, dass klare Treffer durch abweichende Signale (z.B. unterschiedliche URLs von Tochterfirmen) fälschlicherweise bestraft werden.
Optionaler Interaktiver Modus:
- Kann mit dem Flag --interactive gestartet werden.
- Bei uneindeutigen Ergebnissen, bei denen die Top-Kandidaten sehr ähnliche Scores haben, hält das Skript an und ermöglicht dem Benutzer die direkte Auswahl des korrekten Matches aus einer übersichtlichen Liste.
Überarbeitete Scoring-Formel:
- Die Gesamtbewertung wurde neu balanciert, um dem jetzt deutlich aussagekräftigeren Namens-Score mehr Gewicht zu verleihen.