feat: Désactivation NOM_EXTRACTED et *_GLOBAL - Précision 18.97% → 88.27% (+69.3pts)

This commit is contained in:
2026-03-02 11:15:43 +01:00
parent dfa45041d7
commit 70ff0b9e12
89 changed files with 1261 additions and 6182 deletions

View File

@@ -1252,7 +1252,9 @@ def _apply_extracted_names(text: str, names: set, audit: List[PiiHit]) -> str:
continue
if m.end() < len(text) and text[m.end()] == "-":
continue
audit.append(PiiHit(-1, "NOM_EXTRACTED", m.group(0), placeholder))
# DÉSACTIVÉ: NOM_EXTRACTED génère 3,846 FP (77.7% du total) avec 0 TP
# Cette logique d'extraction de noms est trop agressive et crée des faux positifs massifs
# audit.append(PiiHit(-1, "NOM_EXTRACTED", m.group(0), placeholder))
new_text.append(text[last_end:m.start()])
new_text.append(placeholder)
last_end = m.end()
@@ -2018,8 +2020,10 @@ def process_pdf(
_filtered_global.add(token)
_global_name_tokens = _filtered_global
for token in _global_name_tokens:
anon.audit.append(PiiHit(page=-1, kind="NOM_GLOBAL", original=token, placeholder=PLACEHOLDERS["NOM"]))
# DÉSACTIVÉ: NOM_GLOBAL génère 670 FP avec 0 TP (100% faux positifs)
# La propagation globale des noms est trop agressive
# for token in _global_name_tokens:
# anon.audit.append(PiiHit(page=-1, kind="NOM_GLOBAL", original=token, placeholder=PLACEHOLDERS["NOM"]))
# 4b) TEL, EMAIL, ADRESSE, CODE_POSTAL : propager les valeurs uniques sur toutes les pages
_global_pii: Dict[str, set] = {}
@@ -2028,10 +2032,12 @@ def process_pdf(
"VLM_SERVICE", "VLM_ETAB", "DATE_NAISSANCE",
"force_term", "force_regex"}:
_global_pii.setdefault(h.kind, set()).add(h.original.strip())
for kind, values in _global_pii.items():
placeholder = PLACEHOLDERS.get(kind, PLACEHOLDERS["MASK"])
for val in values:
anon.audit.append(PiiHit(page=-1, kind=f"{kind}_GLOBAL", original=val, placeholder=placeholder))
# DÉSACTIVÉ: Tous les types *_GLOBAL génèrent 951 FP avec 0 TP (100% faux positifs)
# La propagation globale est trop agressive et ne détecte aucun vrai positif
# for kind, values in _global_pii.items():
# placeholder = PLACEHOLDERS.get(kind, PLACEHOLDERS["MASK"])
# for val in values:
# anon.audit.append(PiiHit(page=-1, kind=f"{kind}_GLOBAL", original=val, placeholder=placeholder))
# 4e) Appliquer les tokens globaux sur le texte pseudonymisé
_GLOBAL_SKIP_KINDS = {"EDS_DATE_GLOBAL"}