| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- from pathlib import Path
- import re
- import json
- BASE = Path("/opt/3cx-middleware/3cx-telefonie-middleware")
- SRC = BASE / "data/transcripts"
- OUT = BASE / "data/transcript_screening.jsonl"
- AUTO = re.compile(
- r"(herzlich willkommen|willkommen bei|"
- r"sie sind verbunden mit|"
- r"ihr gewünschter gesprächspartner ist|"
- r"ist zurzeit nicht erreichbar|"
- r"ist im moment nicht erreichbar|"
- r"leider.*nicht.*erreichbar|"
- r"bitte hinterlassen sie.*nachricht|"
- r"hinterlassen sie.*nach.*signal|"
- r"nach dem signalton|"
- r"außerhalb.*geschäftszeiten|"
- r"Vielen Dank und auf Wiederhören)",
- re.I,
- )
- BUSINESS = re.compile(
- r"(bestellung|bestellt|rechnung|zahlung|lieferung|lieferstatus|"
- r"versand|paket|dhl|gls|retoure|widerruf|storn|reklamation|"
- r"rose|rosen|clematis|pflanze|pflanzen|wurzel|container|"
- r"lieferzeit|preis|angebot|gutschein|dünger|schädling|"
- r"krank|rückruf|kunden|auftrag)",
- re.I,
- )
- OUT.parent.mkdir(exist_ok=True)
- stats = {
- "RELEVANT": 0,
- "IRRELEVANT": 0,
- "UNCERTAIN": 0,
- }
- with OUT.open("w", encoding="utf-8") as out:
- for path in sorted(SRC.glob("*.txt")):
- text = path.read_text(encoding="utf-8", errors="replace").strip()
- words = text.split()
- if not text:
- relevance = "IRRELEVANT"
- reason = "leer"
- elif len(words) < 8:
- relevance = "IRRELEVANT"
- reason = "extrem kurz"
- else:
- auto_hits = len(AUTO.findall(text))
- business_hits = len(BUSINESS.findall(text))
- # reine automatische Ansage
- if auto_hits >= 1 and business_hits == 0 and len(words) < 80:
- relevance = "IRRELEVANT"
- reason = "automatische Ansage/Mailbox"
- # echter Geschäftskontext vorhanden
- elif business_hits >= 1:
- relevance = "RELEVANT"
- reason = f"Geschäftskontext ({business_hits} Treffer)"
- # längerer Text ohne klare Geschäftssignale
- elif len(words) >= 80:
- relevance = "UNCERTAIN"
- reason = "langer Text ohne eindeutigen Geschäftskontext"
- else:
- relevance = "UNCERTAIN"
- reason = "nicht eindeutig"
- stats[relevance] += 1
- out.write(json.dumps({
- "file": path.name,
- "relevance": relevance,
- "reason": reason,
- "words": len(words),
- }, ensure_ascii=False) + "\n")
- print("=== SCREENING ===")
- for k, v in stats.items():
- print(f"{k:10} {v}")
- print(f"\nDatei: {OUT}")
|