feat: scoring DP déterministe + parser CPAM nouveau format + sections CRH
- Nouveau module dp_scoring.py : shortlist, scoring multi-critères, select_dp, LLM one-shot fallback avec garde-fous (négation, comorbidité, Z/R-codes) - Parser CPAM : auto-détection format legacy/ucr_extract, 6 nouveaux champs ControleCPAM (codes_etablissement, libelle, codes_retenus, ghm_ghs) - CRH parser : 3 nouvelles sections (diag_sortie, diag_principal, synthese) - Prompt DP_LLM_ONESHOT externalisé dans templates.py - Propagation dp_selection dans fusion.py - 808 tests passent (dont 21 nouveaux CPAM + 77 dp_scoring + 8 CRH) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -109,6 +109,139 @@ de masse 34.370"""
|
||||
assert result["signes_vitaux"]["imc"] == 34.370
|
||||
|
||||
|
||||
class TestCRHParserDiagSections:
|
||||
"""Tests pour les nouvelles sections à fort signal DP."""
|
||||
|
||||
def test_parse_diag_sortie(self):
|
||||
text = """Mon cher confrère,
|
||||
Votre patient a été hospitalisé du 01/01/2024 au 05/01/2024.
|
||||
|
||||
Diagnostic de sortie :
|
||||
Pancréatite aiguë biliaire (K85.1)
|
||||
|
||||
Traitement de sortie :
|
||||
Paracétamol"""
|
||||
result = parse_crh(text)
|
||||
assert "diag_sortie" in result["sections"]
|
||||
assert "K85.1" in result["sections"]["diag_sortie"]
|
||||
|
||||
def test_parse_diagnostics_retenus(self):
|
||||
text = """Conclusion :
|
||||
Bonne évolution.
|
||||
|
||||
Diagnostics retenus :
|
||||
- Cholécystite aiguë lithiasique
|
||||
- Lithiase vésiculaire
|
||||
|
||||
Traitement de sortie :
|
||||
Paracétamol"""
|
||||
result = parse_crh(text)
|
||||
assert "diag_sortie" in result["sections"]
|
||||
assert "Cholécystite" in result["sections"]["diag_sortie"]
|
||||
|
||||
def test_parse_diag_principal(self):
|
||||
text = """Examen clinique :
|
||||
Abdomen souple.
|
||||
|
||||
Diagnostic principal :
|
||||
Embolie pulmonaire segmentaire droite
|
||||
|
||||
Diagnostics de sortie :
|
||||
EP + TVP"""
|
||||
result = parse_crh(text)
|
||||
assert "diag_principal" in result["sections"]
|
||||
assert "Embolie pulmonaire" in result["sections"]["diag_principal"]
|
||||
|
||||
def test_parse_probleme_principal(self):
|
||||
text = """Examen clinique :
|
||||
Patient stable.
|
||||
|
||||
Problème principal :
|
||||
Insuffisance cardiaque décompensée
|
||||
|
||||
Devenir : retour à domicile."""
|
||||
result = parse_crh(text)
|
||||
assert "diag_principal" in result["sections"]
|
||||
assert "Insuffisance cardiaque" in result["sections"]["diag_principal"]
|
||||
|
||||
def test_parse_synthese(self):
|
||||
text = """Examen clinique :
|
||||
RAS.
|
||||
|
||||
Synthèse :
|
||||
Patient de 75 ans hospitalisé pour AVC ischémique sylvien droit.
|
||||
|
||||
Traitement de sortie :
|
||||
Aspirine"""
|
||||
result = parse_crh(text)
|
||||
assert "synthese" in result["sections"]
|
||||
assert "AVC" in result["sections"]["synthese"]
|
||||
|
||||
def test_existing_sections_preserved(self):
|
||||
"""Les 7 sections existantes sont toujours capturées."""
|
||||
text = """pour le motif suivant:
|
||||
Pancréatite aiguë
|
||||
|
||||
Antécédents :
|
||||
HTA, diabète
|
||||
|
||||
Histoire de la maladie
|
||||
Douleur abdominale brutale
|
||||
|
||||
Examen clinique
|
||||
Abdomen défense en HCD
|
||||
|
||||
Au total :
|
||||
Pancréatite aiguë biliaire
|
||||
|
||||
TTT de sortie :
|
||||
Paracétamol
|
||||
|
||||
Devenir :
|
||||
Retour à domicile"""
|
||||
result = parse_crh(text)
|
||||
assert "motif_hospitalisation" in result["sections"]
|
||||
assert "antecedents" in result["sections"]
|
||||
assert "histoire_maladie" in result["sections"]
|
||||
assert "examen_clinique" in result["sections"]
|
||||
assert "conclusion" in result["sections"]
|
||||
assert "traitement_sortie" in result["sections"]
|
||||
assert "devenir" in result["sections"]
|
||||
|
||||
def test_diag_sortie_multiline(self):
|
||||
text = """Au total :
|
||||
Bonne évolution.
|
||||
|
||||
Diagnostic de sortie :
|
||||
- Pancréatite aiguë biliaire K85.1
|
||||
- Lithiase vésiculaire K80.2
|
||||
- Obésité E66.0
|
||||
|
||||
Traitement de sortie :
|
||||
Paracétamol"""
|
||||
result = parse_crh(text)
|
||||
assert "diag_sortie" in result["sections"]
|
||||
section = result["sections"]["diag_sortie"]
|
||||
assert "K85.1" in section
|
||||
assert "K80.2" in section
|
||||
assert "E66.0" in section
|
||||
|
||||
def test_conclusion_does_not_overflow_into_diag_sortie(self):
|
||||
text = """Au total :
|
||||
Pancréatite aiguë biliaire, évolution favorable.
|
||||
|
||||
Diagnostic de sortie :
|
||||
Pancréatite aiguë biliaire K85.1
|
||||
|
||||
Traitement de sortie :
|
||||
Paracétamol"""
|
||||
result = parse_crh(text)
|
||||
assert "conclusion" in result["sections"]
|
||||
assert "diag_sortie" in result["sections"]
|
||||
# La conclusion ne doit PAS contenir le texte de diag_sortie
|
||||
assert "K85.1" not in result["sections"]["conclusion"]
|
||||
|
||||
|
||||
class TestCleanPersonName:
|
||||
def test_clean_simple(self):
|
||||
assert _clean_person_name("Sarah DUTREY") == "Sarah DUTREY"
|
||||
|
||||
Reference in New Issue
Block a user