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:
dom
2026-02-16 15:05:26 +01:00
parent 4c6c0d25bd
commit 4ef42dd3d3
4 changed files with 123 additions and 6 deletions

View File

@@ -49,6 +49,14 @@ class TestIsValidDiagnosticText:
# Après clean, "H\n10" devient "H 10"
assert not is_valid_diagnostic_text("H 10")
def test_reject_letter_decimal(self):
"""K 3.6 = kaliémie 3.6, pas un diagnostic."""
assert not is_valid_diagnostic_text("K 3.6")
def test_reject_letter_decimal_comma(self):
"""B 12,5 = valeur labo avec virgule, pas un diagnostic."""
assert not is_valid_diagnostic_text("B 12,5")
def test_reject_concatenated_words(self):
assert not is_valid_diagnostic_text("Ventilationventilation")

View File

@@ -18,6 +18,7 @@ from src.medical.fusion import (
_merge_sejour,
_dedup_diagnostics,
_dedup_actes,
_is_enriched,
)
@@ -268,3 +269,88 @@ class TestFullMergeCROTrackare:
# Type prioritaire : trackare
assert result.document_type == "trackare"
class TestDedupParentCodes:
"""Vérifie que les codes CIM-10 parents sont retirés quand un code plus spécifique existe."""
def test_parent_removed(self):
"""K85 + K85.9 → seul K85.9 est gardé."""
das = [
Diagnostic(texte="Pancréatite", cim10_suggestion="K85", cim10_confidence="high"),
Diagnostic(texte="Pancréatite aiguë", cim10_suggestion="K85.9", cim10_confidence="medium"),
]
result = _dedup_diagnostics(das)
codes = {d.cim10_suggestion for d in result}
assert "K85.9" in codes
assert "K85" not in codes
assert len(result) == 1
def test_siblings_kept(self):
"""K85.1 + K85.9 → les deux gardés (aucun n'est préfixe de l'autre)."""
das = [
Diagnostic(texte="Pancréatite biliaire", cim10_suggestion="K85.1"),
Diagnostic(texte="Pancréatite SAI", cim10_suggestion="K85.9"),
]
result = _dedup_diagnostics(das)
codes = {d.cim10_suggestion for d in result}
assert "K85.1" in codes
assert "K85.9" in codes
assert len(result) == 2
def test_parent_removed_in_merge(self):
"""Test intégré via merge_dossiers : K85 + K85.9 → K85 retiré des DAS."""
d1 = DossierMedical(
diagnostic_principal=Diagnostic(texte="HTA", cim10_suggestion="I10"),
diagnostics_associes=[
Diagnostic(texte="Pancréatite", cim10_suggestion="K85"),
],
)
d2 = DossierMedical(
diagnostic_principal=Diagnostic(texte="HTA", cim10_suggestion="I10"),
diagnostics_associes=[
Diagnostic(texte="Pancréatite aiguë", cim10_suggestion="K85.9"),
],
)
result = merge_dossiers([d1, d2])
das_codes = {d.cim10_suggestion for d in result.diagnostics_associes}
assert "K85.9" in das_codes
assert "K85" not in das_codes
class TestDedupPreferEnriched:
"""Vérifie que la dédup préfère le diagnostic enrichi à confiance égale."""
def test_enriched_preferred(self):
"""Même code, même confiance None → celui avec justification gagne."""
das = [
Diagnostic(texte="Pancréatite", cim10_suggestion="K85.9"),
Diagnostic(texte="Pancréatite aiguë", cim10_suggestion="K85.9",
justification="Confirmé par RAG"),
]
result = _dedup_diagnostics(das)
assert len(result) == 1
assert result[0].justification == "Confirmé par RAG"
def test_enriched_preferred_reverse_order(self):
"""L'enrichi en premier, le non-enrichi en second → l'enrichi est gardé."""
das = [
Diagnostic(texte="Pancréatite aiguë", cim10_suggestion="K85.9",
justification="Confirmé par RAG"),
Diagnostic(texte="Pancréatite", cim10_suggestion="K85.9"),
]
result = _dedup_diagnostics(das)
assert len(result) == 1
assert result[0].justification == "Confirmé par RAG"
def test_higher_confidence_still_wins(self):
"""Confiance high > medium, même si medium est enrichi."""
das = [
Diagnostic(texte="Pancréatite", cim10_suggestion="K85.9",
cim10_confidence="medium", justification="RAG"),
Diagnostic(texte="Pancréatite aiguë", cim10_suggestion="K85.9",
cim10_confidence="high"),
]
result = _dedup_diagnostics(das)
assert len(result) == 1
assert result[0].cim10_confidence == "high"