diff --git a/anonymizer_core_refactored_onnx.py b/anonymizer_core_refactored_onnx.py index ffd74a4..223e3b1 100644 --- a/anonymizer_core_refactored_onnx.py +++ b/anonymizer_core_refactored_onnx.py @@ -391,7 +391,19 @@ RE_IPP = re.compile(r"\b(?:I\.?P\.?P\.?|IPP|N°\s*Ipp)\s*[:\-]?\s*([A-Za-z0-9]{6 RE_CSULT = re.compile(r"\b(?:N°\s*Csult|N°\s*Interv)\s*[:\-]?\s*(\d{6,})\b", re.IGNORECASE) RE_FINESS = re.compile(r"\b(?:N°\s*)?FINESS?\s*[:\-]?\s*(\d{9})\b", re.IGNORECASE) RE_OGC = re.compile(r"\b(?:N°\s*)?OGC\s*[:\-]?\s*([A-Za-z0-9\-]{1,})\b", re.IGNORECASE) -RE_RPPS = re.compile(r"\b(?:N°\s*)?RPPS\s*[:\-]?\s*(\d{8,11})\b", re.IGNORECASE) +RE_RPPS = re.compile( + r"\b(?:N°\s*)?RPPS" + # 0 à 3 mots qualificateurs entre RPPS et la valeur : + # "RPPS prescripteur :", "RPPS du médecin signataire :", + # "RPPS de garde :", etc. Si qualificateur présent, le séparateur + # est obligatoire pour éviter d'aspirer du narratif. + r"(?:" + r"(?:\s+[A-Za-zéèàùÉÈÀÙ'-]+){1,3}\s*[:\-]\s*" + r"|\s*[:\-]?\s*" + r")" + r"(\d{8,11})\b", + re.IGNORECASE, +) RE_NUM_ADHERENT = re.compile( r"\b(?:n[°o]?\s*|num[ée]ro\s+(?:d['’]\s*)?)adh[ée]rent[e]?\s*[:\-]?\s*([A-Z0-9]{6,15})\b", re.IGNORECASE, diff --git a/tests/synthetic_review/cases/005_bacterio_complete/expected.txt b/tests/synthetic_review/cases/005_bacterio_complete/expected.txt index 73368c1..804bd3b 100644 --- a/tests/synthetic_review/cases/005_bacterio_complete/expected.txt +++ b/tests/synthetic_review/cases/005_bacterio_complete/expected.txt @@ -9,7 +9,7 @@ N° venue [NOM] [NOM] [NDA] IPP : [IPP] -RPPS prescripteur : [RPPS] +RPPS : [RPPS] Prélèvement : ECBU Date de prélèvement : 02/04/2024 à 08h30 diff --git a/tests/synthetic_review/cases/005_bacterio_complete/review.md b/tests/synthetic_review/cases/005_bacterio_complete/review.md index 3ef4842..55f960f 100644 --- a/tests/synthetic_review/cases/005_bacterio_complete/review.md +++ b/tests/synthetic_review/cases/005_bacterio_complete/review.md @@ -20,11 +20,14 @@ Points critiques : - le nom composé `MARIE-PIERRE` doit être traité en bloc ; - le biologiste signataire (`Dr DUHALDE Anne`) doit être masqué. -Écarts détectés au runner (à corriger) : -- **fuite RPPS critique** : `RPPS prescripteur : 10101010101` n'est pas masqué. - La règle RPPS courante attend `RPPS\s*:\s*\d{11}` et ne tolère pas un - qualificateur (`prescripteur`, `signataire`, `prescripteur du jour`, …) - entre `RPPS` et `:`. Mêmes layouts probables pour FINESS, IPP, NDA. +Écart résolu dans la session 2026-04-27 : +- **fuite RPPS** : pattern `RE_RPPS` étendu pour tolérer 0 à 3 mots + qualificateurs (`prescripteur`, `signataire`, `du médecin`, `de garde`) + entre `RPPS` et `:`. Le qualificateur est consommé par le matcher et + la sortie reconstruit `RPPS : [RPPS]` (perte cosmétique du qualificateur, + pas de fuite). + +Écart résiduel cosmétique : - bloc `Dr DUHALDE Anne` masqué comme un seul `[NOM]` plutôt que `Dr [NOM] [NOM]` — accepté tant qu'aucun token de nom ne fuit ; à retraiter si l'usage demande la conservation du préfixe `Dr`. diff --git a/tests/unit/test_synthetic_review.py b/tests/unit/test_synthetic_review.py index 02b9171..ad9ea59 100644 --- a/tests/unit/test_synthetic_review.py +++ b/tests/unit/test_synthetic_review.py @@ -30,10 +30,6 @@ from tools.run_synthetic_review_corpus import ( # noqa: E402 KNOWN_FAILURES: dict[str, str] = { - "005_bacterio_complete": ( - "RPPS avec qualificateur (`RPPS prescripteur :`) non détecté — " - "fuite identifiant médecin." - ), "009_multi_etablissements": ( "Fuites résiduelles : suffixe `de Bordeaux` après " "[ETABLISSEMENT], CHCB en fin de phrase. À traiter via "