screen_transcripts.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from pathlib import Path
  2. import re
  3. import json
  4. BASE = Path("/opt/3cx-middleware/3cx-telefonie-middleware")
  5. SRC = BASE / "data/transcripts"
  6. OUT = BASE / "data/transcript_screening.jsonl"
  7. AUTO = re.compile(
  8. r"(herzlich willkommen|willkommen bei|"
  9. r"sie sind verbunden mit|"
  10. r"ihr gewünschter gesprächspartner ist|"
  11. r"ist zurzeit nicht erreichbar|"
  12. r"ist im moment nicht erreichbar|"
  13. r"leider.*nicht.*erreichbar|"
  14. r"bitte hinterlassen sie.*nachricht|"
  15. r"hinterlassen sie.*nach.*signal|"
  16. r"nach dem signalton|"
  17. r"außerhalb.*geschäftszeiten|"
  18. r"Vielen Dank und auf Wiederhören)",
  19. re.I,
  20. )
  21. BUSINESS = re.compile(
  22. r"(bestellung|bestellt|rechnung|zahlung|lieferung|lieferstatus|"
  23. r"versand|paket|dhl|gls|retoure|widerruf|storn|reklamation|"
  24. r"rose|rosen|clematis|pflanze|pflanzen|wurzel|container|"
  25. r"lieferzeit|preis|angebot|gutschein|dünger|schädling|"
  26. r"krank|rückruf|kunden|auftrag)",
  27. re.I,
  28. )
  29. OUT.parent.mkdir(exist_ok=True)
  30. stats = {
  31. "RELEVANT": 0,
  32. "IRRELEVANT": 0,
  33. "UNCERTAIN": 0,
  34. }
  35. with OUT.open("w", encoding="utf-8") as out:
  36. for path in sorted(SRC.glob("*.txt")):
  37. text = path.read_text(encoding="utf-8", errors="replace").strip()
  38. words = text.split()
  39. if not text:
  40. relevance = "IRRELEVANT"
  41. reason = "leer"
  42. elif len(words) < 8:
  43. relevance = "IRRELEVANT"
  44. reason = "extrem kurz"
  45. else:
  46. auto_hits = len(AUTO.findall(text))
  47. business_hits = len(BUSINESS.findall(text))
  48. # reine automatische Ansage
  49. if auto_hits >= 1 and business_hits == 0 and len(words) < 80:
  50. relevance = "IRRELEVANT"
  51. reason = "automatische Ansage/Mailbox"
  52. # echter Geschäftskontext vorhanden
  53. elif business_hits >= 1:
  54. relevance = "RELEVANT"
  55. reason = f"Geschäftskontext ({business_hits} Treffer)"
  56. # längerer Text ohne klare Geschäftssignale
  57. elif len(words) >= 80:
  58. relevance = "UNCERTAIN"
  59. reason = "langer Text ohne eindeutigen Geschäftskontext"
  60. else:
  61. relevance = "UNCERTAIN"
  62. reason = "nicht eindeutig"
  63. stats[relevance] += 1
  64. out.write(json.dumps({
  65. "file": path.name,
  66. "relevance": relevance,
  67. "reason": reason,
  68. "words": len(words),
  69. }, ensure_ascii=False) + "\n")
  70. print("=== SCREENING ===")
  71. for k, v in stats.items():
  72. print(f"{k:10} {v}")
  73. print(f"\nDatei: {OUT}")