feat(rag): regulation_short Casing-Normalisierung am Ingest-Rand

Der Re-Ingest leitet regulation_short z.T. via title()-Casing aus Dateinamen ab
('dsgvo'->'Dsgvo', 'osha otm'->'Osha Otm') -> falsche Akronyme im Payload UND im
article_label ('Art. 37 Dsgvo'). NEU: normalize_regulation_short() in legal_metadata,
token-basiert mit kuratiertem Akronym-Set -> nur gelistete Akronyme werden gross,
legitimes Mixed-Case (GeschGehG, MuSchG, GoBD, MiCA, eIDAS, EuGH) bleibt unberuehrt.
Angewandt am Ingest-Rand in documents.py (greift fuer Payload-Feld + display_name).
+13 Tests gruen. Bestandsdaten brauchen separaten einmaligen Qdrant-Patch.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-21 18:31:45 +02:00
parent de542633e2
commit 0c5f1fd7a4
3 changed files with 71 additions and 1 deletions
+34
View File
@@ -25,6 +25,40 @@ _SUB_RE = re.compile(r"(lit\.\s*[a-z]+|Satz\s*\d+|Nr\.\s*\d+)", re.IGNORECASE)
# Zitiert wird das Aktenzeichen (display_name / regulation_short).
_RULING_TYPES = {"urteil", "ruling", "court_decision", "beschluss"}
# Akronyme, deren KORREKTE Schreibweise GROSS ist. Der Ingest leitet regulation_short
# z.T. via title()-Casing aus Dateinamen ab ("dsgvo" -> "Dsgvo", "osha otm" -> "Osha Otm").
# Token-basiert: NUR Tokens, deren Upper-Form hier steht, werden gross geschrieben — damit
# bleiben legitime Mixed-Case-Kuerzel (GeschGehG, MuSchG, GoBD, MiCA, eIDAS, EuGH) unberuehrt.
# Bewusst NICHT enthalten: EUGH/BVERFG/BVERWG (korrekt sind EuGH/BVerfG/BVerwG).
# Konservativ + erweiterbar.
_REG_SHORT_ACRONYMS = {
"DSGVO", "GDPR", "DSA", "DMA", "DORA", "AMLR", "GPSR", "DPF", "IFRS", "DSM", "MDR",
"CRA", "NIS2", "EU", "US", "PPE", "ICS", "SCADA", "OSHA", "OTM", "NIST", "NISTIR",
"ENISA", "EDPB", "EDPS", "DSK", "BFDI", "OWASP", "API", "GPAI", "EUCC", "ECCG",
"CISA", "CVSS", "CVD", "SRP", "PF", "SCHUFA", "SLSA", "BGH", "OGH", "BAG",
}
# Ganz-Wert-Overrides (Token-Logik kann diese nicht herleiten).
_REG_SHORT_OVERRIDES = {
"Dataact": "Data Act",
"Ecommerce": "E-Commerce",
}
def normalize_regulation_short(name: str) -> str:
"""Korrigiert title-caste Akronyme im druckbaren reg-short ('Dsgvo'->'DSGVO',
'Osha Otm ...'->'OSHA OTM ...', 'EU Mdr'->'EU MDR') und erhaelt legitimes Mixed-Case
(GeschGehG, MuSchG, MiCA, eIDAS, EuGH). Nur Tokens in _REG_SHORT_ACRONYMS werden
gross geschrieben; alles andere bleibt unveraendert."""
s = (name or "").strip()
if not s:
return s
if s in _REG_SHORT_OVERRIDES:
return _REG_SHORT_OVERRIDES[s]
return " ".join(
tok.upper() if tok.upper() in _REG_SHORT_ACRONYMS else tok
for tok in s.split()
)
def detect_citation_style(section: str) -> str:
"""'§ 38' -> 'paragraph' (DE-Gesetze); 'Artikel/Art. 13' -> 'article' (EU-VO)."""