Trois nouveaux patterns cœur dans `_mask_structured_line` pour des labels génériques qui n'étaient pas couverts par le pipeline kv_value (le split key:value laissait fuir la valeur quand le label dépassait les patterns existants `RE_EXTRACT_NOM_NAISSANCE`, `RE_EXTRACT_PRENOM`, `RE_EXTRACT_VILLE_RESIDENCE`). `RE_LABEL_NOM_VARIANTES` capture : - Nom de jeune fille / de famille / de naissance(.) - Nom d'usage / Nom marital / Nom marié `RE_LABEL_PRENOM` capture : - Prénom : / Prénoms : / Prénom de naissance / utilisé(e) / usuel - Capture jusqu'à fin de ligne pour les énumérations virgulées (Prénoms : Sabine, Marie → tout masqué). `RE_LABEL_VILLE` capture : - Ville : / Ville de résidence : / Ville de naissance : - Capture jusqu'à fin de ligne (gère "Saint-Jean-de-Luz", "Saint-Denis (974)", composés multi-tokens). Effets de bord positifs : - Le bug "Saint-Jean-de-Luz → [ETABLISSEMENT]-de-Luz" est corrigé : le matcher `RE_LABEL_VILLE` masque toute la valeur en `[VILLE]` AVANT que le gazetteer FINESS Aho-Corasick ne grignote "Saint-Jean". Cas 006_trackare_soignants et 008_anesthesie_complete : alignement des expected.txt sur cette amélioration. Choix d'architecture (cf cadrage docs/cadrage-projet-anonymisation.md section 10.1) : ces labels sont des règles cœur génériques applicables à tout établissement de santé français. Légitimes en hardcodé. Les patterns layout-specific (Bordeaux suffixe, CHCB en fin de phrase, email cassé par force_term) seront branchés via admin_rules dans l'étape suivante. Cas 010_fiche_admission_minimale passe désormais (retiré de KNOWN_FAILURES). Le xfail strict aurait signalé xpass. Tests : 9 passed, 2 xfailed (avant : 8 passed, 3 xfailed sur test_synthetic_review). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.6 KiB
2.6 KiB
Revue 010 — fiche d'admission administrative
Famille documentaire : fiche d'identification administrative pure, quasi sans narratif. Empilement dense de PII structurées sous des labels explicites. Pas de contexte sémantique pour aider le NER.
Patterns testés :
- structuration en blocs (IDENTITE, COORDONNEES, PERSONNE A PREVENIR, MEDECIN TRAITANT, INFORMATIONS COMPLEMENTAIRES) ;
- nom marital + nom de jeune fille empilés sur deux lignes ;
- patient et époux portant le même nom de famille (DARRIBEHAUDE) : vérifier la propagation globale ;
- 4 numéros de téléphone différents (fixe patient, portable patient, proche, médecin traitant) ;
- email avec local-part contenant le nom de famille
(
sabine.darribehaude) — fuite indirecte si l'email n'est pas masqué comme un bloc atomique ; - numéro de mutuelle MGEN (10 chiffres) à masquer ;
- numéro de sécurité sociale au format espacé (
2 73 04 65 100 100 88) qui doit être détecté par la règle NIR.
Points critiques :
- aucun token PII ne doit fuiter, malgré l'absence de contexte narratif ;
- le label structurel doit rester (
Nom :,Prénom :,Adresse :, etc.) ; - le sigle
MGEN(organisme de mutuelle, pas un nom propre) doit rester ; - le numéro d'adhérent MGEN
1234567890doit être masqué (pseudo-NDA) ; Sexe : FetNationalité : françaisedoivent rester intacts ;- le numéro de chambre
chambre 412doit rester intact (pas un identifiant patient).
Écarts résolus dans la session 2026-04-27 (commits c24b7f6 + suivants) :
- numéro adhérent mutuelle : règle
RE_NUM_ADHERENTajoutée, masqué en[ADHERENT](placeholder dédié) — gère MGEN, MAAF et toute formulationn° adhérent/Numéro d'adhérent; - NIR au format espacé :
RE_NIRréordonné AVANTRE_TELpour empêcher la consommation prématurée ; - labels structurels
Nom de jeune fille :,Prénom :,Ville :: trois nouvelles règles cœur (RE_LABEL_NOM_VARIANTES,RE_LABEL_PRENOM,RE_LABEL_VILLE) dans_mask_structured_line.
Écarts résiduels cosmétiques (non fuites) :
appartement 3Bdans la ligne adresse est tagué[ETABLISSEMENT]par le matcher FINESS Aho-Corasick — perte d'information mais aucune fuite PII. À investiguer plus tard (le motappartementne devrait pas être dans le gazetteer FINESS).kinds_presentne contient pasDATE_NAISSANCEalors que la ligneDate de naissance : 30/04/1973est masquée — la valeur est masquée via un autre code path qui n'enregistre pas le hit avec ce kind. Pas de fuite, juste une incohérence d'audit.