bugfix
This commit is contained in:
@@ -391,41 +391,20 @@ def is_valid_company_article(wiki_categories):
|
|||||||
|
|
||||||
def load_target_schema(csv_filepath="ziel_Branchenschema.csv"):
|
def load_target_schema(csv_filepath="ziel_Branchenschema.csv"):
|
||||||
"""
|
"""
|
||||||
Liest das Ziel-Branchenschema aus der CSV-Datei ein.
|
Baut das Ziel-Branchenschema als String aus der CSV-Datei.
|
||||||
Die CSV-Datei sollte in Spalte A den externen (Wikipedia-)Branchenbegriff
|
Gibt ein Tupel zurück: (mapping, schema_string, allowed_targets)
|
||||||
und in Spalte B den zugehörigen Zielwert enthalten.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
mapping (dict): Ein Dictionary, das externe Branchenbegriffe (lowercase) auf
|
|
||||||
die zugehörigen Zielwerte (lowercase) abbildet.
|
|
||||||
schema_string (str): Eine formattierte Zeichenkette als Aufzählung der gültigen
|
|
||||||
Zielbranchen, die im Prompt übergeben werden kann.
|
|
||||||
allowed_targets (list): Eine sortierte Liste der eindeutigen Zielwerte.
|
|
||||||
"""
|
"""
|
||||||
import csv
|
mapping, allowed_branches = load_target_branches(csv_filepath)
|
||||||
mapping = {}
|
if allowed_branches:
|
||||||
valid_targets = set()
|
schema_string = (
|
||||||
try:
|
"Ziel-Branchenschema: Folgende Branchenbereiche sind gültig:\n" +
|
||||||
with open(csv_filepath, encoding="utf-8") as f:
|
"\n".join(f"- {branch}" for branch in allowed_branches) +
|
||||||
reader = csv.reader(f, delimiter=";")
|
"\nBitte ordne das Unternehmen ausschließlich in einen dieser Bereiche ein."
|
||||||
for row in reader:
|
)
|
||||||
if len(row) >= 2:
|
return mapping, schema_string, allowed_branches
|
||||||
external = row[0].strip().lower()
|
else:
|
||||||
target = row[1].strip().lower()
|
|
||||||
if target:
|
|
||||||
mapping[external] = target
|
|
||||||
valid_targets.add(target)
|
|
||||||
except Exception as e:
|
|
||||||
debug_print("Fehler beim Einlesen des Ziel-Branchenschemas: " + str(e))
|
|
||||||
return {}, "Ziel-Branchenschema nicht verfügbar.", []
|
return {}, "Ziel-Branchenschema nicht verfügbar.", []
|
||||||
|
|
||||||
sorted_targets = sorted(valid_targets, key=lambda s: s.lower())
|
|
||||||
schema_string = (
|
|
||||||
"Ziel-Branchenschema: Folgende Branchenbereiche sind gültig:\n" +
|
|
||||||
"\n".join(f"- {value}" for value in sorted_targets) +
|
|
||||||
"\nBitte ordne das Unternehmen ausschließlich in einen dieser Bereiche ein."
|
|
||||||
)
|
|
||||||
return mapping, schema_string, sorted_targets
|
|
||||||
|
|
||||||
def serp_website_lookup(company_name):
|
def serp_website_lookup(company_name):
|
||||||
"""
|
"""
|
||||||
@@ -627,7 +606,7 @@ def merge_with_prefix(suggestion, crm_branch):
|
|||||||
|
|
||||||
def fuzzy_similarity(str1, str2):
|
def fuzzy_similarity(str1, str2):
|
||||||
"""
|
"""
|
||||||
Gibt den Ähnlichkeitswert (zwischen 0 und 1) der beiden Strings zurück.
|
Berechnet die Ähnlichkeit zweier Strings als Wert zwischen 0 und 1.
|
||||||
"""
|
"""
|
||||||
return SequenceMatcher(None, str1, str2).ratio()
|
return SequenceMatcher(None, str1, str2).ratio()
|
||||||
|
|
||||||
@@ -1534,6 +1513,32 @@ class WikipediaScraper:
|
|||||||
debug_print(f"Suchfehler: {str(e)}")
|
debug_print(f"Suchfehler: {str(e)}")
|
||||||
continue
|
continue
|
||||||
return None
|
return None
|
||||||
|
# Annahme: debug_print und Config sind bereits definiert
|
||||||
|
|
||||||
|
def load_target_branches(csv_filepath="ziel_Branchenschema.csv"):
|
||||||
|
"""
|
||||||
|
Liest das Ziel-Branchenschema aus der CSV-Datei ein.
|
||||||
|
Erwartet, dass in Spalte A der externe (Wikipedia-)Branchenbegriff
|
||||||
|
und in Spalte B der zugehörige Zielwert (z. B. "maschinenbau") enthalten ist.
|
||||||
|
Gibt ein Mapping (Dictionary) und eine sortierte Liste der erlaubten Ziel-Branchen zurück.
|
||||||
|
"""
|
||||||
|
mapping = {}
|
||||||
|
allowed_branches = set()
|
||||||
|
try:
|
||||||
|
with open(csv_filepath, encoding="utf-8") as f:
|
||||||
|
reader = csv.reader(f)
|
||||||
|
for row in reader:
|
||||||
|
if len(row) >= 2:
|
||||||
|
external = row[0].strip().lower()
|
||||||
|
target = row[1].strip().lower()
|
||||||
|
if external and target:
|
||||||
|
mapping[external] = target
|
||||||
|
allowed_branches.add(target)
|
||||||
|
allowed_branches = sorted(list(allowed_branches), key=lambda s: s.lower())
|
||||||
|
return mapping, allowed_branches
|
||||||
|
except Exception as e:
|
||||||
|
debug_print("Fehler beim Einlesen des Ziel-Branchenschemas: " + str(e))
|
||||||
|
return {}, []
|
||||||
|
|
||||||
# ==================== NEUE FUNKTION: Angepasste evaluate_branche_chatgpt ====================
|
# ==================== NEUE FUNKTION: Angepasste evaluate_branche_chatgpt ====================
|
||||||
def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary):
|
def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary):
|
||||||
@@ -1547,11 +1552,11 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
|
|||||||
Falls der Vorschlag nicht validiert werden kann, erfolgt ein Fallback auf den CRM-Wert.
|
Falls der Vorschlag nicht validiert werden kann, erfolgt ein Fallback auf den CRM-Wert.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
crm_branche (str): Branche laut CRM
|
crm_branche (str): Branche laut CRM.
|
||||||
beschreibung (str): Unternehmensbeschreibung (CRM)
|
beschreibung (str): Unternehmensbeschreibung (CRM).
|
||||||
wiki_branche (str): Branche aus Wikipedia (falls vorhanden)
|
wiki_branche (str): Branche aus Wikipedia (falls vorhanden).
|
||||||
wiki_kategorien (str): Wikipedia-Kategorien
|
wiki_kategorien (str): Wikipedia-Kategorien.
|
||||||
website_summary (str): Zusammenfassung des Website-Inhalts
|
website_summary (str): Zusammenfassung des Website-Inhalts.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dict: Enthält "branch", "consistency" (ok oder X) und "justification".
|
dict: Enthält "branch", "consistency" (ok oder X) und "justification".
|
||||||
@@ -1559,7 +1564,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
|
|||||||
# Lade Mapping und Liste der erlaubten Ziel-Branchen
|
# Lade Mapping und Liste der erlaubten Ziel-Branchen
|
||||||
mapping, allowed_branches = load_target_branches()
|
mapping, allowed_branches = load_target_branches()
|
||||||
|
|
||||||
# Baue den Text für das Ziel-Branchenschema, der im System-Prompt an ChatGPT übergeben wird
|
# Baue den Text für das Ziel-Branchenschema, der im System-Prompt an ChatGPT übergeben wird.
|
||||||
schema_lines = ["Ziel-Branchenschema: Folgende Branchenbereiche sind gültig:"]
|
schema_lines = ["Ziel-Branchenschema: Folgende Branchenbereiche sind gültig:"]
|
||||||
for branch in allowed_branches:
|
for branch in allowed_branches:
|
||||||
schema_lines.append(f"- {branch}")
|
schema_lines.append(f"- {branch}")
|
||||||
@@ -1619,23 +1624,23 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
|
|||||||
elif lower_line.startswith("begründung:"):
|
elif lower_line.startswith("begründung:"):
|
||||||
explanation = line.split(":", 1)[1].strip()
|
explanation = line.split(":", 1)[1].strip()
|
||||||
|
|
||||||
# Bereinige den Vorschlag: Entferne unnötige Satzzeichen und konvertiere in Kleinbuchstaben
|
# Bereinige den Vorschlag: Entferne unnötige Satzzeichen und konvertiere in Kleinbuchstaben.
|
||||||
clean_suggestion = re.sub(r'[^\w\s/&-]', '', suggestion).strip().lower()
|
clean_suggestion = re.sub(r'[^\w\s/&-]', '', suggestion).strip().lower()
|
||||||
|
|
||||||
# Falls der bereinigte Vorschlag kein Hierarchie-Trennzeichen ">" enthält, übernehme den Präfix aus der CRM-Branche
|
# Falls der bereinigte Vorschlag kein Hierarchie-Trennzeichen ">" enthält, übernehme den Präfix aus der CRM-Branche.
|
||||||
if ">" not in clean_suggestion and ">" in crm_branche:
|
if ">" not in clean_suggestion and ">" in crm_branche:
|
||||||
prefix = crm_branche.split(">")[0].strip().lower()
|
prefix = crm_branche.split(">")[0].strip().lower()
|
||||||
clean_suggestion = prefix + " > " + clean_suggestion
|
clean_suggestion = prefix + " > " + clean_suggestion
|
||||||
|
|
||||||
# Prüfe, ob der bereinigte Vorschlag mit einem erlaubten Eintrag (Fuzzy Matching) übereinstimmt
|
# Prüfe, ob der bereinigte Vorschlag mit einem erlaubten Eintrag (Fuzzy Matching) übereinstimmt.
|
||||||
valid = False
|
valid = False
|
||||||
for allowed in allowed_branches:
|
for allowed in allowed_branches:
|
||||||
sim = fuzzy_similarity(clean_suggestion, allowed)
|
sim = fuzzy_similarity(clean_suggestion, allowed)
|
||||||
if sim > 0.95: # sehr hoher Ähnlichkeitswert (anpassbar)
|
if sim > 0.95: # Sehr hoher Ähnlichkeitswert (anpassbar)
|
||||||
valid = True
|
valid = True
|
||||||
# Setze den Vorschlag exakt auf den Zielwert
|
clean_suggestion = allowed # Setze exakte Übereinstimmung
|
||||||
clean_suggestion = allowed
|
|
||||||
break
|
break
|
||||||
|
|
||||||
if not valid:
|
if not valid:
|
||||||
debug_print(f"Mapping ungültig für Vorschlag: '{clean_suggestion}'. Fallback: CRM-Branche ('{crm_branche}') verwendet.")
|
debug_print(f"Mapping ungültig für Vorschlag: '{clean_suggestion}'. Fallback: CRM-Branche ('{crm_branche}') verwendet.")
|
||||||
return {"branch": crm_branche, "consistency": consistency, "justification": "Fallback: CRM-Wert verwendet aufgrund ungültiger ChatGPT-Zuweisung."}
|
return {"branch": crm_branche, "consistency": consistency, "justification": "Fallback: CRM-Wert verwendet aufgrund ungültiger ChatGPT-Zuweisung."}
|
||||||
|
|||||||
Reference in New Issue
Block a user