feat(phase2): Extraction layout-aware multi-colonnes — 322 fuites → 0, -103 FP

Phase 2 de l'amélioration qualité anonymisation :

1. Extraction multi-colonnes (PyMuPDF layout-aware) :
   - Nouvelle fonction _extract_page_layout_aware() détecte les layouts
     sidebar+corps (typiques des CRH/CRO hospitaliers)
   - Remplace pdfplumber comme extraction primaire (PyMuPDF blocks)
   - Élimine l'entrelacement de texte entre sidebar et corps médical
   - pdfplumber conservé pour les tables et comme fallback

2. Masquage FINESS multiline :
   - Détection "N° Finess\n[...]\n640000162" (label et numéro séparés)
   - Propagation globale du numéro FINESS sur toutes les pages
   - Gestion du format *640000162* (avec astérisques Trackare)

3. Masquage URLs hospitalières (www.ch-xxx.fr)

4. Nettoyage crochets doubles [[PLACEHOLDER]] → [PLACEHOLDER]

Résultats non-régression (30 fichiers audit) :
- Fuites : 322 → 0 (-100%)
- Faux positifs : 113 → 10 (-91%)
- 0 régression fonctionnelle
- OGC 1-59 : 0 fuite soignant, 0 FINESS, 0 lieu de naissance

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 18:19:08 +01:00
parent bc2fe667a0
commit e967a67052
55 changed files with 38506 additions and 18343 deletions

View File

@@ -1,24 +1,21 @@
{"page": 0, "kind": "force_term", "original": "CENTRE HOSPITALIER COTE BASQUE", "placeholder": "[MASK]", "bbox_hint": null}
{"page": 0, "kind": "IPP", "original": "03017203", "placeholder": "[IPP]", "bbox_hint": null}
{"page": 0, "kind": "DATE_NAISSANCE", "original": "Date de naissance: 06/06/1967", "placeholder": "[DATE_NAISSANCE]", "bbox_hint": null}
{"page": 0, "kind": "VILLE", "original": "KENDIRA", "placeholder": "[VILLE]", "bbox_hint": null}
{"page": 0, "kind": "CODE_POSTAL", "original": "Code Postal: 64250", "placeholder": "[CODE_POSTAL]", "bbox_hint": null}
{"page": 0, "kind": "ADRESSE", "original": "6 AVENUE D ESPAGNE RES UDABERRI Ville de résidence", "placeholder": "[ADRESSE]", "bbox_hint": null}
{"page": 0, "kind": "ETAB", "original": "Unité Médecine Ambulatoire HDJ Médecin courant", "placeholder": "[MASK]", "bbox_hint": null}
{"page": 0, "kind": "ADRESSE", "original": "6 AVENUE D ESPAGNE RES UDABERRI", "placeholder": "[ADRESSE]", "bbox_hint": null}
{"page": 0, "kind": "ETAB", "original": "Unité Médecine Ambulatoire HDJ", "placeholder": "[MASK]", "bbox_hint": null}
{"page": 0, "kind": "NOM", "original": "Dorothée NIVET", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 0, "kind": "TEL", "original": "05.59.93.72.74", "placeholder": "[TEL]", "bbox_hint": null}
{"page": 0, "kind": "CODE_POSTAL", "original": "64250 CAMBO LES BAINS", "placeholder": "[CODE_POSTAL]", "bbox_hint": null}
{"page": 0, "kind": "NOM", "original": "José ZULAICA", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 0, "kind": "CODE_POSTAL", "original": "64250 CAMBO LES BAINS", "placeholder": "[CODE_POSTAL]", "bbox_hint": null}
{"page": 0, "kind": "TEL", "original": "05.59.93.72.74", "placeholder": "[TEL]", "bbox_hint": null}
{"page": 0, "kind": "TEL", "original": "0615204864", "placeholder": "[TEL]", "bbox_hint": null}
{"page": 0, "kind": "ADRESSE", "original": "6 AVENUE D ESPAGNE RES", "placeholder": "[ADRESSE]", "bbox_hint": null}
{"page": 0, "kind": "TEL", "original": "06.15.20.48.64", "placeholder": "[TEL]", "bbox_hint": null}
{"page": 0, "kind": "TEL", "original": "06.15.20.48.64", "placeholder": "[TEL]", "bbox_hint": null}
{"page": 0, "kind": "CODE_POSTAL", "original": "64250 CAMBO LES", "placeholder": "[CODE_POSTAL]", "bbox_hint": null}
{"page": 0, "kind": "TEL", "original": "06.15.20.48.64", "placeholder": "[TEL]", "bbox_hint": null}
{"page": 0, "kind": "TEL", "original": "06.15.20.48.64", "placeholder": "[TEL]", "bbox_hint": null}
{"page": 0, "kind": "DATE_NAISSANCE", "original": "Date de naissance: 06/06/1967", "placeholder": "[DATE_NAISSANCE]", "bbox_hint": null}
{"page": 1, "kind": "ETAB", "original": "SSR Annie ENia", "placeholder": "[ETABLISSEMENT]", "bbox_hint": null}
{"page": 1, "kind": "NOM", "original": "Mathilde", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 1, "kind": "NOM", "original": "Tam KHUONG", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 1, "kind": "NOM", "original": "Madeleine", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 1, "kind": "NOM", "original": "Felix", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 1, "kind": "ETAB", "original": "SSR Annie ENia", "placeholder": "[ETABLISSEMENT]", "bbox_hint": null}
{"page": 1, "kind": "DATE_NAISSANCE", "original": "Date de naissance: 06/06/1967", "placeholder": "[DATE_NAISSANCE]", "bbox_hint": null}
{"page": 2, "kind": "NOM", "original": "Boube", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 2, "kind": "NOM", "original": "Felix", "placeholder": "[NOM]", "bbox_hint": null}
@@ -41,6 +38,7 @@
{"page": 0, "kind": "CODE_POSTAL", "original": "64250 CAMBO LES\nBAINS FRANCE", "placeholder": "[CODE_POSTAL]", "bbox_hint": null}
{"page": 1, "kind": "ETAB", "original": "SSR Annie ENia\nIctère", "placeholder": "[ETABLISSEMENT]", "bbox_hint": null}
{"page": 1, "kind": "NOM", "original": "Mathilde BOUBE", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 1, "kind": "NOM", "original": "Tam KHUONG HUU", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 1, "kind": "NOM", "original": "Madeleine HAZARD", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 1, "kind": "NOM", "original": "Felix GOUTORBE", "placeholder": "[NOM]", "bbox_hint": null}
{"page": 2, "kind": "NOM", "original": "Boube", "placeholder": "[NOM]", "bbox_hint": null}