diff --git a/knowledge_base_builder.py b/knowledge_base_builder.py index c1a6c929..f846ee32 100644 --- a/knowledge_base_builder.py +++ b/knowledge_base_builder.py @@ -1,6 +1,6 @@ # knowledge_base_builder.py -__version__ = "v1.2.2" +__version__ = "v1.2.4" import logging import json @@ -19,55 +19,59 @@ SOURCE_SHEET_NAME = "CRM_Jobtitles" EXACT_MATCH_OUTPUT_FILE = "exact_match_map.json" KEYWORD_RULES_OUTPUT_FILE = "keyword_rules.json" +# --- NEU: Priorisierung nach Geschäfts-Relevanz --- DEPARTMENT_PRIORITIES = { - "Fuhrparkmanagement": 1, - "Legal": 1, - "Baustofflogistik": 1, - "Baustoffherstellung": 1, - "Field Service Management / Kundenservice": 2, - "IT": 3, + # Tier 1: Kern-Fachabteilungen (geordnet nach Häufigkeit) + "Field Service Management / Kundenservice": 1, + "IT": 2, + "Logistik": 3, "Production Maintenance / Wartung Produktion": 4, "Utility Maintenance": 5, "Procurement / Einkauf": 6, - "Supply Chain Management": 7, - "Finanzen": 8, - "Technik": 8, - "Management / GF / C-Level": 10, - "Logistik": 11, - "Vertrieb": 12, - "Transportwesen": 13, - "Berater": 20, + "Vertrieb": 7, + "Supply Chain Management": 8, + "Finanzen": 9, + "Technik": 10, + "Transportwesen": 11, + + # Tier 2: Spezifische Nischen-Abteilungen (geordnet nach Häufigkeit) + "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 } BRANCH_GROUP_RULES = { - "bau": [ - "Baustoffhandel", "Baustoffindustrie", - "Logistiker Baustoffe", "Bauunternehmen" - ], - "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" - ] + "bau": ["Baustoffhandel", "Baustoffindustrie", "Logistiker Baustoffe", "Bauunternehmen"], + "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 -# --- MODIFIZIERT: Schwellenwert auf 60% gesenkt --- BRANCH_SPECIFICITY_THRESHOLD = 0.6 +# --- OPTIMIERTE STOP_WORDS LISTE --- STOP_WORDS = { + # Administrative Titelteile 'manager', 'leiter', 'head', 'lead', 'senior', 'junior', 'direktor', 'director', 'verantwortlicher', 'beauftragter', 'referent', 'sachbearbeiter', 'mitarbeiter', - 'spezialist', 'specialist', 'expert', 'experte', 'consultant', 'berater', + 'spezialist', 'specialist', 'expert', 'experte', 'consultant', 'assistant', 'assistenz', 'teamleiter', 'teamlead', 'abteilungsleiter', '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(): @@ -78,7 +82,6 @@ def setup_logging(): return log_level = logging.DEBUG - root_logger = logging.getLogger() if root_logger.handlers: for handler in root_logger.handlers[:]: @@ -92,13 +95,10 @@ def setup_logging(): logging.StreamHandler() ] ) - logging.getLogger("gspread").setLevel(logging.WARNING) logging.getLogger("oauth2client").setLevel(logging.WARNING) - logging.info(f"Logging erfolgreich initialisiert. Log-Datei: {log_filename}") - def build_knowledge_base(): logger = logging.getLogger(__name__) logger.info(f"Starte Erstellung der Wissensbasis (Version {__version__})...") @@ -190,7 +190,6 @@ def build_knowledge_base(): logger.info("Wissensbasis erfolgreich erstellt.") - if __name__ == "__main__": setup_logging() build_knowledge_base() \ No newline at end of file