fix: filtre DAS décimaux, dédup parents CIM-10, tiebreak enrichissement
- Rule 3 das_filter étendue pour rejeter "K 3.6", "B 12,5" (valeurs labo) - Suppression codes parents dans la fusion (K85 retiré si K85.9 présent) - Préférence du diagnostic enrichi RAG à confiance égale lors de la dédup Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -35,8 +35,8 @@ def is_valid_diagnostic_text(text: str) -> bool:
|
||||
if digits >= len(t) * 0.5:
|
||||
return False
|
||||
|
||||
# 3. Lettre + chiffres OCR : "H 51", "À 08", "H\n10"
|
||||
if re.match(r"^[A-ZÀ-Ú]\s*\d{1,3}$", t):
|
||||
# 3. Lettre + chiffres OCR : "H 51", "À 08", "H\n10", "K 3.6", "B 12,5"
|
||||
if re.match(r"^[A-ZÀ-Ú]\s*\d{1,3}([.,]\d+)?$", t):
|
||||
return False
|
||||
|
||||
# 4. Mots concaténés : "Ventilationventilation"
|
||||
|
||||
@@ -85,6 +85,11 @@ def _merge_sejour(dossiers: list[DossierMedical]) -> Sejour:
|
||||
return merged
|
||||
|
||||
|
||||
def _is_enriched(d: Diagnostic) -> bool:
|
||||
"""Retourne True si le diagnostic a une justification RAG."""
|
||||
return bool(d.justification or d.sources_rag)
|
||||
|
||||
|
||||
def _dedup_diagnostics(all_das: list[Diagnostic]) -> list[Diagnostic]:
|
||||
"""Déduplique les diagnostics associés par code CIM-10, garde la meilleure confiance."""
|
||||
conf_order = {"high": 0, "medium": 1, "low": 2}
|
||||
@@ -100,12 +105,30 @@ def _dedup_diagnostics(all_das: list[Diagnostic]) -> list[Diagnostic]:
|
||||
seen[key] = d
|
||||
else:
|
||||
existing = seen[key]
|
||||
# Garder celui avec la meilleure confiance
|
||||
if conf_order.get(d.cim10_confidence or "", 3) < conf_order.get(
|
||||
existing.cim10_confidence or "", 3
|
||||
):
|
||||
new_conf = conf_order.get(d.cim10_confidence or "", 3)
|
||||
old_conf = conf_order.get(existing.cim10_confidence or "", 3)
|
||||
# Garder celui avec la meilleure confiance, ou à confiance égale celui enrichi
|
||||
if new_conf < old_conf or (new_conf == old_conf and _is_enriched(d) and not _is_enriched(existing)):
|
||||
seen[key] = d
|
||||
|
||||
# Supprimer les codes parents quand un code plus spécifique existe
|
||||
# Ex: K85 retiré si K85.9 présent (K85 est préfixe strict de K859)
|
||||
codes = {k for k in seen if k and not k.startswith("__text__")}
|
||||
normalized = {c: c.replace(".", "") for c in codes}
|
||||
parents_to_remove: set[str] = set()
|
||||
for code_a in codes:
|
||||
norm_a = normalized[code_a]
|
||||
for code_b in codes:
|
||||
if code_a == code_b:
|
||||
continue
|
||||
norm_b = normalized[code_b]
|
||||
if norm_b.startswith(norm_a) and len(norm_b) > len(norm_a):
|
||||
parents_to_remove.add(code_a)
|
||||
break
|
||||
|
||||
for parent in parents_to_remove:
|
||||
del seen[parent]
|
||||
|
||||
return list(seen.values())
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user