# REDACT — banc tiers multilingue

[REDACT](https://arxiv.org/abs/2606.19881) (Vats et al., EMNLP 2026 Industry Track) est un banc synthétique de détection de données personnelles : 13 427 fiches, 51 types d'entités, 25 langues. Son **échantillon verrouillé** de 1 000 fiches (40 par langue) est celui sur lequel les auteurs notent Presidio, GLiNER, l'OpenAI Privacy Filter, GPT-4.1 et Claude Sonnet 4.6.

Le jeu **n'est pas dans ce dépôt**. Il est publié sous les [REDACT Dataset Terms v1.0](https://github.com/guneeshvats/REDACT-PII-Benchmark/blob/main/DATASET_TERMS.md) :
- l'évaluation et l'audit d'un outil de protection sont permis ;
- l'article doit être cité ;
- toute réidentification est interdite.

## Règles

- **On ne règle jamais le moteur sur l'échantillon verrouillé.** Un correctif se cherche et se valide sur les 12 427 autres fiches (`pii_benchmark_full.json`), puis on rejoue l'échantillon pour mesurer.
- `record_id` se répète dans l'échantillon (944 identifiants uniques pour 1 000 fiches) : les résultats sont appariés par **position**.
- Aucune valeur du jeu n'est imprimée ni versionnée : des comptes seulement.

## Lancer

```bash
curl -L -o /tmp/redact/pii_benchmark_sample1000.json \
  https://media.githubusercontent.com/media/guneeshvats/REDACT-PII-Benchmark/main/data/pii_benchmark_sample1000.json
# sha256 754f562ce9c3c5b7b663f1ba6127c38a31d93f5631d38364341cb727936234c6 (15,9 Mo)
cd connecteur
node bench/redact/passer.mjs /tmp/redact/pii_benchmark_sample1000.json /tmp/redact/sortie.jsonl   # ~20 min
node bench/redact/noter.mjs  /tmp/redact/pii_benchmark_sample1000.json /tmp/redact/sortie.jsonl --json rapport.json
node bench/redact/noter.mjs  /tmp/redact/pii_benchmark_sample1000.json /tmp/redact/sortie.jsonl --route fichier
```

`passer.mjs` repart d'une clé vide pour chaque fiche et fait passer le texte de deux façons :
- par `anonymiser_fichier` (un `.md`) ;
- par `coder_texte` (la route d'un message), avec le verrou de sortie.

Avec la **Double vérification** (le second lecteur local du produit, `server/second-lecteur.js`) :

```bash
node server/second-lecteur/cli.js installer double-verification-darwin-arm64.htpack /tmp/redact/modele   # paquet vérifié
HT_SECOND_LECTEUR_DIR=/tmp/redact/modele node bench/redact/passer.mjs sample1000.json dv.jsonl --second-lecteur
HT_SECOND_LECTEUR_AUTO=0 node bench/redact/passer.mjs sample1000.json seul.jsonl   # moteur seul, même si le paquet est installé
```

Chaque fiche porte alors `double_verification` : le nombre de passages ajoutés, lu dans la ligne « 🔎 » du compte rendu, ou `"indisponible"` si le second lecteur a basculé sur les règles seules. Un passage publié doit en avoir 0 indisponible.

Pour chaque route, il aligne le texte codé sur l'origine (`bench/ht-bench/lib/alignement.mjs`) et décode comme `deanonymiser`. Pour mesurer une autre version, lancer le `passer.mjs` d'un autre checkout (`git worktree add … <commit>`).

## La note

`noter.mjs` donne deux familles de mesures :

1. **Le score officiel**, transcrit de `evaluation/scripts/compute_stratified_f1.py` (MIT) :
   - appariement glouton dans chaque fiche, même type et chevauchement (`partial`) ou mêmes bornes (`exact`) ;
   - F1 micro et macro, rappel par forme de divulgation (F5) et par niveau (F6).

   Chaque préfixe de Hidden Tokens est ramené à **un** type REDACT, comme les auteurs le font pour Presidio. Ainsi `EMAIL` devient `Work_Email_Address`, `TEL` devient `Telephone_Numbers_Personal`, et un prénom suivi d'un nom devient `Full_Name`. Un code sans type (`CODE-…`) n'est pas une prédiction typée. Ce score mesure la *détection typée* : Hidden Tokens ne cherche pas à nommer le type exact d'une entité, il la cache.
2. **Ce qui compte pour l'anonymisation**, sans regarder le type :
   - identifiants directs pleinement divulgués touchés, entièrement cachés ou laissés intacts ;
   - dates de naissance lisibles ;
   - texte ordinaire codé, par langue ;
   - décodage exact par chaque route.

## Second lecteur local

`second-lecteur/` mesure ce qu'un modèle local (GLiNER, Qwen via Ollama…) ajouterait derrière le moteur, sans toucher au produit. Voir [`second-lecteur/README.md`](second-lecteur/README.md). `tirer.mjs` tire un lot hors échantillon verrouillé pour n'importe quel passage.
