REDACT : Hidden Tokens sur un banc tiers multilingue, pertes comprises
- Le banc d'un autre. REDACT est un banc de détection de données personnelles publié par d'autres que nous : 51 types d'entités, 25 langues, des documents synthétiques. Ses auteurs y notent Presidio, GLiNER, l'OpenAI Privacy Filter, GPT-4.1 et Claude Sonnet 4.6. Nous y avons passé Hidden Tokens, et nous publions tout, y compris ce qui est moins bon.
- Identifiants directs (noms, e-mails, téléphones, numéros d'identité, de compte, adresses) pleinement divulgués, moteur 2.85.1 seul : 99,2 % touchés par un code, 89,0 % entièrement cachés, 139 sur 17 103 laissés intacts. Avec la Double vérification (un second lecteur local, en option) : 95,6 % entièrement cachés, 83 laissés intacts.
- Dates de naissance restées lisibles : 60,9 % avec le connecteur 2.57.0, 41,1 % avec le 2.85.1 seul, 5,1 % avec la Double vérification.
- Décodage exact d'un message codé : 372 sur 1 000 avec le 2.57.0, 568 avec le 2.85.1 seul, 471 avec la Double vérification, qui coûte aussi un peu de sur-codage et du temps (voir plus bas).
- Score typé officiel : 0,212 (0,223 avec la Double vérification), au-dessus de Presidio (0,195), loin des modèles de langue (0,597 et 0,636). Hidden Tokens cache une entité sans chercher à nommer son type exact : ce score le pénalise, et nous le publions quand même.
Résumé, version par version
Chaque colonne est un passage du même harnais, sur les mêmes 1 000 fiches. Le connecteur 2.57.0 est celui mesuré le 31/10/2026 ; les 2.63.0 et 2.64.0 ont corrigé ce que le passage précédent montrait. Le 2.85.1 est le connecteur du 06/11/2026, mesuré seul et avec la Double vérification.
| Mesure | Connecteur 2.57.0 | Connecteur 2.63.0 | Connecteur 2.64.0 | Connecteur 2.77.0 | Connecteur 2.77.0 + Double vérification | Connecteur 2.85.1 | Connecteur 2.85.1 + Double vérification |
|---|---|---|---|---|---|---|---|
| Identifiants directs pleinement divulgués touchés par un code | 98,8 % | 99,0 % | 99,2 % | 99,2 % | 99,5 % | 99,2 % | 99,5 % |
| … entièrement cachés | 87,5 % | 88,3 % | 89,0 % | 89,0 % | 96,4 % | 89,0 % | 95,6 % |
| … laissés intacts | 200 / 17 103 | 174 / 17 103 | 139 / 17 103 | 139 / 17 103 | 80 / 17 103 | 139 / 17 103 | 83 / 17 103 |
| Dates de naissance restées lisibles | 60,9 % | 41,1 % | 40,9 % | 41,1 % | 3,2 % | 41,1 % | 5,1 % |
| Texte codé qui redevient l'original au décodage (par message) | 372 / 1 000 | 542 / 1 000 | 549 / 1 000 | 561 / 1 000 | 549 / 1 000 | 568 / 1 000 | 471 / 1 000 |
| … (par fichier) | 765 / 1 000 | 748 / 1 000 | 751 / 1 000 | 776 / 1 000 | 716 / 1 000 | 552 / 1 000 | 465 / 1 000 |
| Score typé, méthode officielle (micro-F1 partiel) | 0,203 | 0,211 | 0,212 | 0,213 | 0,239 | 0,212 | 0,223 |
La Double vérification : un second lecteur sur le poste
La Double vérification est un paquet en option (725 Mo sur Mac, 702 Mo sur Windows) que l'appli Hidden Tokens installe à la demande. Un modèle local (GLiNER multi-PII, Apache 2.0) relit le texte avant le codage, sur le poste, sans réseau. Ses trouvailles s'ajoutent aux valeurs à coder et reçoivent de vrais codes, qui se décodent. Une fois installée, elle est active par défaut ; un dossier peut la couper. Ci-dessous : les mêmes 1 000 fiches, le même connecteur 2.85.1, sans elle et avec elle. Dans ce passage, elle a lu 1 000 fiches sur 1 000 (0 indisponible) et ajouté 9 015 passages au codage.
| Mesure | Moteur seul 2.85.1 | 2.85.1 + Double vérification | Écart |
|---|---|---|---|
| Identifiants directs laissés intacts | 139 | 83 | −56 |
| … entièrement cachés | 89,0 % | 95,6 % | +6,6 pt |
| Dates de naissance restées lisibles | 41,1 % | 5,1 % | −36,0 pt |
| Texte ordinaire codé, français | 10,7 % | 12,9 % | +2,2 pt |
| … anglais | 23,6 % | 27,2 % | +3,6 pt |
| … moyenne des 25 langues | 56,0 % | 58,9 % | +2,9 pt |
| Décodage exact, par message | 568 / 1 000 | 471 / 1 000 | −97 |
| … par fichier | 552 / 1 000 | 465 / 1 000 | −87 |
| Score typé officiel (micro-F1 partiel) | 0,212 | 0,223 | +0,011 |
| Temps par fiche, médiane (deux routes) | 0,05 s | 0,89 s | — |
Ce qu'elle coûte, et ce qui n'est pas encore juste :
- Un peu plus de sur-codage : +2,2 pt en français, +3,6 pt en anglais, +2,9 pt en moyenne sur les 25 langues. Le modèle code aussi quelques mots qui ne sont pas des données.
- Moins de textes qui reviennent à l'identique : 97 fichiers et 110 messages ne se décodent plus exactement (10 et 13 se décodent désormais). 92 de ces fichiers et 103 de ces messages ne diffèrent que par les majuscules : c'est la règle « une écriture par code » (plus bas), appliquée à plus de valeurs. Le sens revient, pas toujours la casse. Les 5 fichiers et 7 messages restants diffèrent autrement ; ils ne sont pas encore analysés.
- « Elle ne fait qu'ajouter » tient : aucune valeur que le moteur seul codait ne reste intacte avec elle, sur les deux routes. Ce n'était pas le cas en 2.77.0 (2 valeurs : un prénom danois, une référence client anglaise) : depuis le 2.85.1, c'est garanti par construction et contrôlé mot à mot à chaque texte, avec le moteur seul en dernier recours.
- Du temps et de la mémoire : 0,05 s par fiche en médiane sans elle, 0,89 s avec (95ᵉ centile 4,3 s), pour les deux routes, sur un Mac M5 ; environ 1,1 à 1,3 Go de mémoire pendant la lecture (mesurés avec le banc portable, sur 100 fiches). Mac Apple Silicon et Windows x64 seulement, pas les Mac Intel. Windows n'a pas été mesuré sur cet échantillon.
- Sur cet échantillon, elle est à l'aveugle. Son réglage (seuil 0,5, sans l'étiquette « organisation ») a été choisi le 05/11/2026 sur 2 600 fiches hors échantillon ; ces 1 000 fiches n'ont jamais servi à la régler.
Ce qui a reculé, et ce qui manque encore
- Des attributs écrits en mots courants sont désormais lisibles. Avant les listes de mots de l'allemand, de l'espagnol, de l'italien, du portugais, du néerlandais, du turc et de l'arabe (connecteur 2.63.0), tout mot inconnu de ces langues était codé, et des attributs (statut marital, orientation sexuelle, infractions, informations médicales, nationalité, genre, titres de poste) étaient cachés par hasard. Ils sont maintenant lisibles, comme en français : Hidden Tokens code l'identité, et laisse les attributs lisibles pour que l'IA puisse travailler. REDACT les compte comme des données personnelles, et certains sont des catégories sensibles : c'est un choix de produit, à discuter, que nous rendons visible ici. Voir les niveaux ci-dessous.
- Le connecteur 2.63.0 a laissé passer des valeurs que le 2.57.0 codait. Un patronyme allemand qui est aussi un nom commun, derrière un prénom (« Lena Brunnen ») ; des pseudonymes et des noms d'utilisateur faits de mots ; des numéros de compte et d'employé derrière un libellé d'une langue sans liste. Le tableau ci-dessous les compte. Le connecteur 2.64.0 corrige ces cas par des règles générales : aucune valeur que le 2.63.0 codait n'est laissée intacte. Face au 2.57.0, 4 valeurs restent intactes alors qu'il les codait (CS 3, HU 1) : de petits numéros et un prénom dans des langues sans liste, qu'il ne cachait que par hasard, parce que le mot voisin était codé.
- La détection de langue du 2.64.0 est plus stricte (il faut un mot-outil de la langue) pour ne plus prendre un paragraphe danois ou tchèque pour de l'allemand : quelques paragraphes espagnols ou portugais courts ne sont plus reconnus, et leur sur-codage remonte de 1 à 5 points.
- Les langues sans liste de mots restent codées presque entièrement : langues nordiques, slaves, hongrois, hébreu, hindi, thaï, coréen, chinois et japonais (qu'il faudrait d'abord découper en mots). Protégé, mais peu exploitable par l'IA.
- Le décodage ne rend qu'une écriture par code. Un mot codé une fois avec une majuscule (en tête de phrase, dans un titre) revient avec elle partout ; une initiale (« P. Haverkamp ») disparaît dans le nom. C'est la règle « une personne, un code » ; c'est la première cause des textes qui ne reviennent pas à l'identique. Elle explique aussi le léger recul par fichier (765 → 751 sur 1 000 du 2.57.0 au 2.64.0) : un mot devenu lisible en minuscules est recodé ailleurs dès que le même mot a été codé avec une majuscule, et revient capitalisé.
| Versions | Codés en plus | Laissés intacts en plus | Types laissés intacts |
|---|---|---|---|
| 2.57.0 → 2.63.0 | 41 | 15 | Employee_ID_Number (3), Social_Media_Identifiers (3), Building_Badge_Card_Number (3), National_Identification_Number (2), First_Given_Name (1), Customer_Reference_Number (1), Last_Family_Name (1), Account_Statements (1) |
| 2.63.0 → 2.64.0 | 35 | 0 | — |
| 2.64.0 → 2.77.0 | 0 | 0 | — |
| 2.77.0 → 2.77.0 + Double vérification | 61 | 2 | First_Given_Name (1), Customer_Reference_Number (1) |
| 2.77.0 → 2.85.1 | 2 | 2 | Customer_Reference_Number (2) |
| 2.85.1 → 2.85.1 + Double vérification | 56 | 0 | — |
| Niveau REDACT | touchés / cachés, 2.57.0 | touchés / cachés, 2.63.0 | touchés / cachés, 2.64.0 | touchés / cachés, 2.77.0 | touchés / cachés, 2.77.0 + Double vérification | touchés / cachés, 2.85.1 | touchés / cachés, 2.85.1 + Double vérification |
|---|---|---|---|---|---|---|---|
| HIGH | 84,6 % / 57,5 % | 86,8 % / 59,2 % | 87,4 % / 60,0 % | 87,3 % / 60,1 % | 93,9 % / 78,8 % | 87,3 % / 60,1 % | 93,9 % / 77,6 % |
| MEDIUM | 98,0 % / 89,1 % | 97,7 % / 89,7 % | 97,9 % / 90,2 % | 97,9 % / 90,2 % | 98,2 % / 95,8 % | 97,9 % / 90,2 % | 98,2 % / 95,1 % |
| LOW | 79,8 % / 59,1 % | 77,5 % / 58,4 % | 77,8 % / 58,9 % | 77,9 % / 59,1 % | 80,4 % / 62,8 % | 77,8 % / 59,1 % | 80,8 % / 62,9 % |
Texte ordinaire codé, par langue
La part des mots qui ne font partie d'aucune entité de REDACT et que Hidden Tokens a codés : du sur-codage, réversible, mais qui retire du sens à l'IA.
| Langue | 2.57.0 | 2.63.0 | 2.64.0 | 2.77.0 | 2.77.0 + Double vérification | 2.85.1 | 2.85.1 + Double vérification |
|---|---|---|---|---|---|---|---|
| FR | 10,7 % | 10,7 % | 10,7 % | 10,7 % | 12,2 % | 10,7 % | 12,9 % |
| EN | 24,6 % | 23,8 % | 24,1 % | 23,8 % | 25,4 % | 23,6 % | 27,2 % |
| DE | 78,5 % | 44,1 % | 44,7 % | 44,5 % | 45,0 % | 44,5 % | 46,1 % |
| ES | 65,6 % | 39,2 % | 44,5 % | 44,5 % | 43,2 % | 44,5 % | 54,2 % |
| IT | 65,2 % | 36,7 % | 38,0 % | 37,9 % | 36,8 % | 37,9 % | 44,1 % |
| PT_BR | 68,5 % | 40,2 % | 41,8 % | 41,7 % | 41,3 % | 41,7 % | 47,9 % |
| PT_EU | 65,5 % | 42,4 % | 45,0 % | 44,9 % | 45,9 % | 44,8 % | 49,4 % |
| NL | 61,9 % | 43,2 % | 43,7 % | 43,5 % | 44,5 % | 43,5 % | 46,2 % |
| TR | 85,6 % | 54,1 % | 54,8 % | 54,8 % | 55,1 % | 54,8 % | 60,5 % |
| AR | 76,9 % | 64,6 % | 64,6 % | 64,4 % | 65,2 % | 64,4 % | 69,9 % |
Autres langues (pas encore de liste de mots)
| Langue | 2.57.0 | 2.63.0 | 2.64.0 | 2.77.0 | 2.77.0 + Double vérification | 2.85.1 | 2.85.1 + Double vérification |
|---|---|---|---|---|---|---|---|
| CS | 73,7 % | 71,9 % | 72,0 % | 71,8 % | 72,0 % | 71,8 % | 72,4 % |
| DA | 67,1 % | 64,6 % | 64,9 % | 64,7 % | 65,1 % | 64,7 % | 66,4 % |
| FI | 78,1 % | 76,0 % | 76,0 % | 76,4 % | 76,7 % | 76,4 % | 78,2 % |
| HE | 65,7 % | 65,5 % | 65,5 % | 65,5 % | 65,7 % | 65,5 % | 66,2 % |
| HI | 51,1 % | 48,5 % | 48,7 % | 48,4 % | 49,6 % | 48,4 % | 52,1 % |
| HU | 73,9 % | 71,2 % | 71,4 % | 71,3 % | 72,2 % | 71,3 % | 73,0 % |
| JA | 74,3 % | 68,8 % | 68,8 % | 68,7 % | 68,8 % | 68,7 % | 69,4 % |
| KO | 80,8 % | 77,6 % | 77,7 % | 77,6 % | 78,3 % | 77,6 % | 79,4 % |
| NO | 72,6 % | 70,1 % | 70,2 % | 70,2 % | 71,4 % | 70,2 % | 71,8 % |
| RU | 83,5 % | 81,9 % | 81,9 % | 81,9 % | 82,6 % | 81,9 % | 82,8 % |
| SV | 73,0 % | 71,6 % | 71,6 % | 71,5 % | 72,3 % | 71,5 % | 72,9 % |
| TH | 79,7 % | 75,6 % | 75,7 % | 75,5 % | 75,9 % | 75,5 % | 76,6 % |
| ZH_CN | 77,4 % | 76,0 % | 76,0 % | 75,9 % | 78,9 % | 75,9 % | 79,3 % |
| ZH_TW | 61,7 % | 58,8 % | 60,3 % | 60,7 % | 61,0 % | 60,5 % | 61,8 % |
Le score typé officiel
La méthode des auteurs : une entité est trouvée si une prédiction du même type la chevauche (micro-F1 partiel), ou a les mêmes bornes (exact). Comme les auteurs le font pour Presidio, chaque préfixe de Hidden Tokens est ramené à un seul type (TEL → Telephone_Numbers_Personal, un prénom suivi d'un nom → Full_Name…) ; un code sans type (CODE-…, un mot inconnu) ne compte pas. Chiffres des cinq détecteurs : ceux publiés par les auteurs.
| Détecteur | micro-F1 partiel | F1 macro | micro-F1 exact |
|---|---|---|---|
| Presidio | 0,195 | 0,063 | 0,145 |
| GLiNER-multi | 0,320 | 0,224 | 0,293 |
| OpenAI Privacy Filter | 0,512 | 0,254 | 0,171 |
| GPT-4.1 | 0,597 | 0,565 | 0,558 |
| Claude Sonnet 4.6 | 0,636 | 0,619 | 0,602 |
| Hidden Tokens 2.85.1 | 0,212 | 0,076 | 0,176 |
| Hidden Tokens 2.85.1 + Double vérification | 0,223 | 0,102 | 0,189 |
Méthode et limites
- Le jeu. L'échantillon verrouillé de REDACT,
pii_benchmark_sample1000.json(SHA-256754f562ce9c3c5b7b663f1ba6127c38a31d93f5631d38364341cb727936234c6), sous les REDACT Dataset Terms. Le jeu n'est pas redistribué ici. - Le passage. Pour chaque fiche, une clé vide ; le texte passe par
anonymiser_fichier(un fichier) et parcoder_texte(un message, avec le verrou de sortie). Le texte codé est aligné sur l'origine, puis décodé comme le faitdeanonymiser. Aucun réglage, aucune langue imposée, aucun pack. La colonne « Double vérification » : le même passage avecpasser.mjs --second-lecteuret le paquet vérifiédouble-verification-1; chaque fiche y garde le nombre de passages ajoutés, lu dans le compte rendu, ce qui montre que le second lecteur n'a basculé sur les règles seules pour aucune. - « Touché », « caché ». Une valeur est touchée si au moins une lettre ou un chiffre est sous un code ; cachée si tous le sont. Seules les valeurs pleinement divulguées comptent (
disclosed,complete). - Notre mesure, pas un audit indépendant. Les classes de défauts corrigées par les connecteurs 2.62.0 et 2.64.0 ont été lues sur cet échantillon même : pour elles, il n'est plus aveugle. Les correctifs sont des règles générales, vérifiées sur nos propres phrases. Le prochain passage les validera sur les 12 427 fiches hors échantillon.
- Synthétique. REDACT est fait de documents générés. Ce n'est pas une promesse sur vos fichiers ; c'est pourquoi Hidden Tokens montre un plan avant de coder et garde un journal local de tout ce que l'IA a reçu.
Reproduire
Résultats bruts : redact-2.57.0.json, redact-2.63.0.json, redact-2.64.0.json, redact-2.77.0.json, redact-2.77.0-dv.json, redact-2.85.1.json, redact-2.85.1-dv.json (toutes les tables, par type, par langue, F5 et F6). Prédictions (predictions-2.85.1.jsonl.gz, predictions-2.85.1-dv.jsonl.gz) : positions et préfixes de code de chaque fiche, sans aucun texte du jeu : avec REDACT et noter.mjs, chaque score de cette page se recalcule. Harnais : README, passer.mjs, noter.mjs, comparer.mjs, types.mjs, alignement.mjs. Rejouer le moteur demande le code du connecteur, qui sera public avec le noyau ouvert.
Citer REDACT : Guneesh Vats, Anubha Agrawal, Shikha Singhal, Ajita Dash, Praison Selvaraj, Vidhan Jhawar, Ranga Prasad Chenna, Bharadwaj Y M G, « REDACT: A Systematically Controlled Multilingual Benchmark for Personal Information Detection », EMNLP 2026 Industry Track, arXiv 2606.19881.