v1.2.4 - Priorisierung nach Geschäfts-Relevanz & Keyword-Optimierung

- Das Priorisierungsmodell wurde grundlegend überarbeitet und orientiert sich nun an der tatsächlichen Häufigkeit und Relevanz der Departments, anstatt an semantischer Eindeutigkeit.
- Die `STOP_WORDS`-Liste wurde signifikant angepasst. Wichtige Signalwörter wie 'service', 'customer', 'care' und 'support' wurden entfernt, um die Erkennungsrate für 'Field Service Management' drastisch zu verbessern.
- Dies korrigiert systematische Fehlzuordnungen und stellt sicher, dass die generierte Wissensbasis die Geschäftsrealität korrekt abbildet.
This commit is contained in:
2025-09-19 08:58:06 +00:00
parent dbe65b993d
commit c91dbd6246

View File

@@ -1,6 +1,6 @@
# knowledge_base_builder.py # knowledge_base_builder.py
__version__ = "v1.2.2" __version__ = "v1.2.4"
import logging import logging
import json import json
@@ -19,55 +19,59 @@ SOURCE_SHEET_NAME = "CRM_Jobtitles"
EXACT_MATCH_OUTPUT_FILE = "exact_match_map.json" EXACT_MATCH_OUTPUT_FILE = "exact_match_map.json"
KEYWORD_RULES_OUTPUT_FILE = "keyword_rules.json" KEYWORD_RULES_OUTPUT_FILE = "keyword_rules.json"
# --- NEU: Priorisierung nach Geschäfts-Relevanz ---
DEPARTMENT_PRIORITIES = { DEPARTMENT_PRIORITIES = {
"Fuhrparkmanagement": 1, # Tier 1: Kern-Fachabteilungen (geordnet nach Häufigkeit)
"Legal": 1, "Field Service Management / Kundenservice": 1,
"Baustofflogistik": 1, "IT": 2,
"Baustoffherstellung": 1, "Logistik": 3,
"Field Service Management / Kundenservice": 2,
"IT": 3,
"Production Maintenance / Wartung Produktion": 4, "Production Maintenance / Wartung Produktion": 4,
"Utility Maintenance": 5, "Utility Maintenance": 5,
"Procurement / Einkauf": 6, "Procurement / Einkauf": 6,
"Supply Chain Management": 7, "Vertrieb": 7,
"Finanzen": 8, "Supply Chain Management": 8,
"Technik": 8, "Finanzen": 9,
"Management / GF / C-Level": 10, "Technik": 10,
"Logistik": 11, "Transportwesen": 11,
"Vertrieb": 12,
"Transportwesen": 13, # Tier 2: Spezifische Nischen-Abteilungen (geordnet nach Häufigkeit)
"Berater": 20, "Fuhrparkmanagement": 15,
"Legal": 16,
"Baustofflogistik": 17,
"Baustoffherstellung": 18,
# Tier 3: Allgemeine, übergreifende Abteilungen
"Management / GF / C-Level": 20, # Muss niedriger als Fachabteilungen sein
# Tier 4: Auffang-Kategorien
"Berater": 25,
"Undefined": 99 "Undefined": 99
} }
BRANCH_GROUP_RULES = { BRANCH_GROUP_RULES = {
"bau": [ "bau": ["Baustoffhandel", "Baustoffindustrie", "Logistiker Baustoffe", "Bauunternehmen"],
"Baustoffhandel", "Baustoffindustrie", "versorger": ["Stadtwerke", "Verteilnetzbetreiber", "Telekommunikation", "Gase & Mineralöl"],
"Logistiker Baustoffe", "Bauunternehmen" "produktion": ["Maschinenbau", "Automobil", "Anlagenbau", "Medizintechnik", "Chemie & Pharma", "Elektrotechnik", "Lebensmittelproduktion", "Bürotechnik", "Automaten (Vending, Slot)", "Gebäudetechnik Allgemein", "Braune & Weiße Ware", "Fenster / Glas", "Getränke", "Möbel", "Agrar, Pellets"]
],
"versorger": [
"Stadtwerke", "Verteilnetzbetreiber",
"Telekommunikation", "Gase & Mineralöl"
],
"produktion": [
"Maschinenbau", "Automobil", "Anlagenbau", "Medizintechnik",
"Chemie & Pharma", "Elektrotechnik", "Lebensmittelproduktion",
"Bürotechnik", "Automaten (Vending, Slot)", "Gebäudetechnik Allgemein",
"Braune & Weiße Ware", "Fenster / Glas", "Getränke", "Möbel", "Agrar, Pellets"
]
} }
MIN_SAMPLES_FOR_BRANCH_RULE = 5 MIN_SAMPLES_FOR_BRANCH_RULE = 5
# --- MODIFIZIERT: Schwellenwert auf 60% gesenkt ---
BRANCH_SPECIFICITY_THRESHOLD = 0.6 BRANCH_SPECIFICITY_THRESHOLD = 0.6
# --- OPTIMIERTE STOP_WORDS LISTE ---
STOP_WORDS = { STOP_WORDS = {
# Administrative Titelteile
'manager', 'leiter', 'head', 'lead', 'senior', 'junior', 'direktor', 'director', 'manager', 'leiter', 'head', 'lead', 'senior', 'junior', 'direktor', 'director',
'verantwortlicher', 'beauftragter', 'referent', 'sachbearbeiter', 'mitarbeiter', 'verantwortlicher', 'beauftragter', 'referent', 'sachbearbeiter', 'mitarbeiter',
'spezialist', 'specialist', 'expert', 'experte', 'consultant', 'berater', 'spezialist', 'specialist', 'expert', 'experte', 'consultant',
'assistant', 'assistenz', 'teamleiter', 'teamlead', 'abteilungsleiter', 'assistant', 'assistenz', 'teamleiter', 'teamlead', 'abteilungsleiter',
'bereichsleiter', 'gruppenleiter', 'geschäftsführer', 'vorstand', 'ceo', 'cio', 'bereichsleiter', 'gruppenleiter', 'geschäftsführer', 'vorstand', 'ceo', 'cio',
'cfo', 'cto', 'coo', 'von', 'of', 'und', 'für', 'der', 'die', 'das', '&' 'cfo', 'cto', 'coo',
# Füllwörter
'von', 'of', 'und', 'für', 'der', 'die', 'das', '&',
# Zu allgemeine Begriffe, die aber Signalwörter überstimmen
'leitung', 'leiterin', 'teamleitung', 'gruppenleitung', 'bereichsleitung', 'abteilungsleitung',
'operations', 'business', 'development', 'zentrale', 'center'
# WICHTIG: 'service', 'customer', 'care', 'support' wurden bewusst entfernt!
} }
def setup_logging(): def setup_logging():
@@ -78,7 +82,6 @@ def setup_logging():
return return
log_level = logging.DEBUG log_level = logging.DEBUG
root_logger = logging.getLogger() root_logger = logging.getLogger()
if root_logger.handlers: if root_logger.handlers:
for handler in root_logger.handlers[:]: for handler in root_logger.handlers[:]:
@@ -92,13 +95,10 @@ def setup_logging():
logging.StreamHandler() logging.StreamHandler()
] ]
) )
logging.getLogger("gspread").setLevel(logging.WARNING) logging.getLogger("gspread").setLevel(logging.WARNING)
logging.getLogger("oauth2client").setLevel(logging.WARNING) logging.getLogger("oauth2client").setLevel(logging.WARNING)
logging.info(f"Logging erfolgreich initialisiert. Log-Datei: {log_filename}") logging.info(f"Logging erfolgreich initialisiert. Log-Datei: {log_filename}")
def build_knowledge_base(): def build_knowledge_base():
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
logger.info(f"Starte Erstellung der Wissensbasis (Version {__version__})...") logger.info(f"Starte Erstellung der Wissensbasis (Version {__version__})...")
@@ -190,7 +190,6 @@ def build_knowledge_base():
logger.info("Wissensbasis erfolgreich erstellt.") logger.info("Wissensbasis erfolgreich erstellt.")
if __name__ == "__main__": if __name__ == "__main__":
setup_logging() setup_logging()
build_knowledge_base() build_knowledge_base()