Parce qu'une bibliothèque de détection et un outil de caviardage ne font pas le même travail. Une bibliothèque renvoie des positions dans un texte. Un outil de caviardage, lui, doit retirer une zone d'une page, lire un scan et ne pas prendre « Directeur » pour une personne. L'essentiel de ce travail consiste à filtrer.
Une bonne bibliothèque, qui fait son travail
Presidio est un outil sérieux. Conçu chez Microsoft, le projet est passé sous une gouvernance communautaire. Ce changement ne dit rien de sa qualité.
Son analyseur reçoit une chaîne de caractères. Pour chaque élément reconnu, il rend un type, deux positions et un score. Son module d'anonymisation remplace ensuite ces segments, et il le fait bien.
La suite de cet article décrit ce qui sépare une bibliothèque d'un outil de caviardage, quel que soit le moteur choisi.
Deux questions différentes
Une bibliothèque répond à une question : où, dans ce texte, un motif ou un modèle a-t-il reconnu quelque chose ? L'utilisateur, lui, en pose une autre : que dois-je faire disparaître de cette page ? La réponse à la première est juste, mais elle ne règle pas la seconde.
Entre les deux se trouve presque tout le travail. Pour l'essentiel, il consiste à décider de ce qu'il ne faut pas signaler. En effet, ce que le moteur refuse de signaler pèse plus sur le résultat que le choix du modèle.
Des positions aux zones d'une page
Un PDF est une mise en page avant d'être un texte. Chaque mot y occupe une boîte, et un nom peut se couper en fin de ligne. Une position comme « caractères 412 à 427 » doit donc être reportée sur ces boîtes, puis convertie en rectangles vérifiables.
La détection elle-même se fait en couches. D'abord, des motifs traitent les valeurs au format fixe : NIR, IBAN, numéro de TVA intracommunautaire, adresse électronique. Ensuite, la reconnaissance d'entités repère les noms, les employeurs et les adresses, avec spaCy, BERT ou GLiNER selon la configuration.
Enfin, l'Analyse approfondie, facultative et désactivée par défaut, traite les cas limites avec un modèle local ou, si vous l'activez, une API distante. Les résultats sont fusionnés, dédoublonnés, puis propagés : un nom repéré en page 1 est aussi étiqueté en page 4. Le filtrage du bruit vient en dernier.
Les pages numérisées
Une page numérisée est une image, et une bibliothèque d'analyse de texte n'y trouve donc rien. Le moteur convertit la page en image à 300 dpi et la confie à Tesseract, avec le module de la langue du document et celui de l'anglais. Il repère les données personnelles dans l'image, en recouvre les pixels, puis reconstruit dessous une couche de texte consultable.
Huit packs de langue sont livrés : anglais, français, allemand, espagnol, italien, néerlandais, portugais et polonais. Or un scan traité avec le mauvais module se lit mal, sans aucun avertissement. C'est une raison de plus de ne pas prendre l'étape Réviser pour une formalité.
Ce qu'il ne faut pas signaler
Dans un bloc de signatures, un modèle d'entités a de bonnes raisons de voir une personne dans « Directeur juridique » ou « CEO ». C'est pourquoi le moteur consulte une liste multilingue de fonctions et de titres qu'il n'étiquette jamais seuls comme des personnes. Elle compte 195 entrées, un chiffre relevé dans le code source.
Chaque faux positif doit en effet être écarté à la main. Un relevé encombré finit par être lu en diagonale, et c'est alors qu'une vraie donnée sensible passe inaperçue. Aucun moteur local, le nôtre compris, ne dispense donc de la révision.
Dans la publication qui a mis les deux moteurs face à face, Presidio en configuration par défaut a produit 666 segments, et promptShield 252. C'est une mesure datée : le banc d'essai n'a pas été rejoué sur la version actuelle du moteur.
Ces nombres décrivent ce test, sur ce corpus, à cette date. Un décompte seul ne dit pas non plus quels segments méritaient d'être masqués.
Retirer le contenu sous le rectangle
Un rectangle noir dessiné sur un texte n'efface rien : le texte reste sélectionnable et copiable. Caviarder consiste donc à retirer le contenu sous-jacent, puis à vérifier qu'il ne subsiste nulle part ailleurs.
Or un PDF conserve aussi du texte hors de la page visible : ActualText et texte alternatif d'un PDF balisé, métadonnées XMP, PieceInfo, destinations nommées, champs de formulaire et leurs flux d'apparence. À l'export, la valeur y devient son code si vous l'avez encodée, ou un marqueur neutre si vous l'avez caviardée.
Reste la vignette d'une page. Générée avant le caviardage, c'est une image, où rien ne peut être remplacé. Elle est donc supprimée.
L'enjeu est aussi juridique. L'article 226-13 du code pénal réprime la révélation d'une information à caractère secret, et un nom resté lisible dans les métadonnées est bel et bien révélé. Pour l'avocat, l'expert-comptable ou le médecin, le secret professionnel pèse ici au moins autant que le RGPD.
Pourquoi tout se passe sur le poste
Une API de détection hébergée fait de son fournisseur un sous-traitant au sens de l'article 28 du RGPD. Il faut alors un contrat et des garanties, dont le responsable du traitement répond devant la CNIL.
En revanche, une détection effectuée sur la machine où se trouve déjà le fichier ne crée aucun sous-traitant. Il en va de même d'une bibliothèque installée sur vos propres serveurs. Seule l'architecture compte, quel que soit l'outil.
Le badge « 100 % hors ligne » ne s'applique qu'à l'application de bureau, et l'offre Pro y ajoute un mode isolé, sans appel de licence ni rapport de plantage. L'application web gratuite envoie, elle, un signal anonyme au lancement. Dans les deux cas, le document ne quitte jamais la machine.
Les codes, et une erreur que nous avons publiée
Encoder remplace une valeur par un code réversible, et Décoder la restitue grâce au Registre de codes, sur votre machine. La longueur du code suit celle de la valeur remplacée. Seule sa forme est fixe : la lettre du type suivie de caractères de remplissage, entre crochets.
Un code ne vaut que dans son dossier, car les dossiers sont cloisonnés. Seul un code épinglé à la main vaut dans toute la Bibliothèque.
Nous avons pourtant publié, en sept langues, qu'une valeur gardait un code identique dans toute la Bibliothèque. C'était plus simple à vendre, et c'était faux. Le moteur, lui, appliquait la bonne règle depuis le début.
L'application gratuite dans le navigateur fabrique les codes comme la version de bureau, avec sa propre clé. Un code vu dans la démonstration a donc la forme réelle des codes du produit.
Un week-end ou une année
Selon notre estimation, brancher une bibliothèque sur un lecteur de PDF prend un week-end. Le report sur les boîtes de mots, les scans, la propagation et le retrait du texte dans tout le fichier demandent bien davantage.
Quant à la liste de ce qu'il ne faut pas signaler, elle n'est jamais tout à fait finie. Maîtriser toute la chaîne nous a par ailleurs permis d'alléger le modèle pour le faire tenir dans un navigateur.
Pour un flux de texte, une chaîne de traitement de données ou un prototype, Presidio reste le bon outil. Notre problème à nous était différent : transmettre une page sans rien en révéler.
Questions fréquentes
Pourquoi ne pas utiliser une bibliothèque existante ?
Parce qu'elle ne résout qu'une partie du problème. Presidio repère des entités dans du texte et reste un excellent choix pour des chaînes de caractères. Un outil de caviardage doit en plus reporter les positions sur la page, lire les scans et retirer le texte de tout le fichier.
Que ne fournit pas une bibliothèque de détection ?
La géométrie de la page, la lecture des scans, le traitement des métadonnées et la propagation entre pages. Elle n'apporte pas non plus l'essentiel du filtrage métier, comme la liste de 195 fonctions et titres. Ce n'est d'ailleurs pas sa vocation.
La différence vient-elle du modèle ou du filtrage ?
Surtout du filtrage : le choix entre spaCy, BERT et GLiNER compte moins qu'on ne l'imagine. Les motifs, la propagation et les filtres modifient davantage le résultat. Aucun moteur local ne repère toutes les données, d'où l'étape Réviser, exigée par défaut avant le téléchargement.
L'application web gratuite fonctionne-t-elle hors ligne ?
Pas au sens strict : elle envoie un signal anonyme au lancement, et la mention « 100 % hors ligne » est réservée à l'application de bureau. Le document que vous y ouvrez ne quitte jamais votre machine.