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:
@@ -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()
|
||||||
Reference in New Issue
Block a user