test: Validation correction fuites - Rappel 100%, Précision 88.27% maintenue

Évaluation qualité après correction propagation globale sélective:
- Rappel: 100.00%  (objectif ≥99.5%)
- Précision: 88.27% ⚠️ (objectif ≥97%, écart -8.73pts)
- F1-Score: 93.77% ⚠️ (objectif ≥98%, écart -4.23pts)
- 0 faux négatif (FN=0) - Aucune fuite
- 154 faux positifs restants (EPISODE: 106, VILLE: 20, autres: 28)

Prochaine optimisation: Filtrage EPISODE (69% des FP restants)
This commit is contained in:
2026-03-02 15:16:30 +01:00
parent f92da4d54e
commit 883f14ab79
2 changed files with 196 additions and 2 deletions

View File

@@ -1304,8 +1304,12 @@ def anonymise_document_regex(pages_text: List[str], tables_lines: List[List[str]
table_blocks.append("\n".join(mbuf))
tables_block = "\n\n".join(table_blocks)
text_out = "\f".join(out_pages) # séparateur de pages
if tables_block.strip():
text_out += "\n\n[TABLES]\n" + tables_block + "\n[/TABLES]"
# NOTE: on n'ajoute PAS le bloc [TABLES] au text_out.
# pdfplumber extrait souvent le contenu principal comme "table", créant un doublon
# intégral du texte. Ce doublon échappait au NER et au rescan (protégé par les
# marqueurs [TABLES]), et le NER EDS-pseudo corrompait les marqueurs en changeant
# la longueur du texte → fuite PII massive (dates de naissance, adresses, noms).
# Les PII détectés dans les tables sont toujours dans l'audit (Phase 1 regex).
# Phase 2 : application globale des noms extraits (rattrapage)
if extracted_names:
@@ -2187,6 +2191,9 @@ def process_pdf(
except Exception as e:
log.warning("Erreur lors du filtrage hospitalier : %s", e)
# Sécurité : supprimer tout bloc [TABLES] résiduel (ne devrait plus arriver)
final_text = re.sub(r"\n*\[TABLES\].*?\[/TABLES\]\n*", "\n", final_text, flags=re.DOTALL)
# Sauvegardes
base = pdf_path.stem
txt_path = out_dir / f"{base}.pseudonymise.txt"