Omdat het model het kleinste deel van de klus is. Presidio meldt waar in een tekst een patroon past. Een programma dat zwartlakt, moet bepalen wat er op een pagina zwart moet, ook op een scan, en vooral wat niet.
Dit stuk is voor de ontwikkelaar die Presidio aan een pdf-pijplijn koppelde en zich afvraagt of de rest een weekend werk is of een jaar.
Presidio doet wat het belooft
Presidio is bij Microsoft ontstaan en wordt inmiddels door een onafhankelijke community beheerd. Het is open, goed gedocumenteerd en draait in productie bij teams die weten wat ze doen. U geeft het een tekenreeks en krijgt een lijst terug: entiteitstype, begin- en eindpositie, score. Wie logregels opschoont of chatberichten filtert, heeft daar genoeg aan.
Een advocaat met een huurovereenkomst op het scherm vraagt iets anders. Hij wil weten wat er op deze pagina zwart moet, en of het bestand dat hij verstuurt niets meer prijsgeeft. Het verschil tussen die twee vragen is vrijwel het hele product.
Van tekenpositie naar rechthoek
Een pdf-pagina is geen tekstbestand. De woorden staan als losse blokjes op vaste coördinaten, regels lopen over kolommen heen, en tabellen worden per cel of per rij uitgelezen. Een positie in de tekst moet dus worden omgezet in een vlak dat precies de juiste woorden afdekt, zonder halve achternaam.
Een gescande pagina is een afbeelding zonder tekst. De pijplijn rendert hem op 300 dpi en laat Tesseract hem lezen in de documenttaal plus Engels. De persoonsgegevens worden als beeldgebieden afgedekt, en onder de pagina komt een nieuwe doorzoekbare tekstlaag.
We leveren acht taalpakketten mee: Engels, Frans, Duits, Spaans, Italiaans, Nederlands, Portugees en Pools. Met het verkeerde pakket is de herkenning slecht, zonder foutmelding. Houd daar rekening mee bij een Tsjechisch dossier.
Dan de export. Echt zwartlakken verwijdert de onderliggende inhoud, want onder een zwart vlak is de tekst nog te kopiëren. Een pdf bewaart tekst ook op onzichtbare plekken: ActualText en Alt van een getagde pdf, XMP-metadata, PieceInfo, benoemde bestemmingen en formuliervelden met hun weergavestromen.
De export vervangt de waarde ook daar: door de code als u codeert, door een neutrale markering als u zwartlakt. Een miniatuur die vóór het zwartlakken is gemaakt, verdwijnt, want in een rasterafbeelding valt niets te vervangen.
Het meeste werk zit in wat u laat staan
Detecteren gebeurt in lagen. Eerst patronen met hoge precisie: een IBAN met een kloppend controlegetal, een BSN dat door de 11-proef komt, een geboortedatum met een label ervoor. Daarna een model voor Entiteiten: spaCy, BERT of GLiNER, per installatie in te stellen. Diepteanalyse is een optionele derde laag en staat standaard uit.
De uitkomsten worden samengevoegd, ontdubbeld en over pagina's doorgezet, zodat een naam van pagina 1 ook op pagina 4 wordt gemarkeerd. Daarna wordt de ruis eruit gefilterd, en dat kost de meeste tijd.
Een model ziet in ‘Directeur’ boven een handtekeningblok al snel een persoon, en in ‘Rechtbank Amsterdam’ een plaatsnaam die weg moet. Op tachtig pagina's levert dat honderden zwarte vlakken op die de gebruiker één voor één weghaalt. Wie dat drie keer heeft gedaan, vertrouwt het hulpmiddel niet meer.
Alleen al de lijst met losse functietitels telt 195 vermeldingen in onze talen. Daarnaast zijn er lijsten met voornamen, generieke organisatienamen en landen. Ook zijn er regels voor kop- en voetteksten en voor wat een tabelkop zegt over de cel eronder.
Geen van die regels is ingewikkeld, maar het zijn er veel en ze verschillen per taal. Elke nieuwe regel kan een echte naam verbergen die op een functietitel lijkt. Een te ruim filter laat persoonsgegevens zichtbaar staan, en dat weegt zwaarder dan een te krap filter. Daarom meten we elke regel op echte documenten.
Ook dan vindt geen lokaal model elk gegeven, het onze evenmin. In promptShield kunt u een beschermd bestand daarom standaard pas downloaden nadat iemand de vondsten in Beoordelen heeft nagekeken.
De vergelijking is niet meer actueel
We hebben promptShield en Presidio ooit op hetzelfde corpus vergeleken en het resultaat gepubliceerd. In die gepubliceerde run gaf Presidio in de standaardinstallatie 666 detecties en promptShield 252. De benchmark is niet opnieuw gedraaid tegen onze huidige motor, dus het blijft een momentopname, zoals het benchmarkstuk ook zegt. Wat de vergelijking wel leert: een score zonder de ruisfilters zegt weinig over wat een gebruiker op zijn scherm ziet.
Waar de tekst blijft
Een bibliotheek draait waar u hem neerzet, meestal op een server. De tekst van het document gaat dan naar die server. Is die van een ander, dan schakelt u een verwerker in en hebt u een verwerkersovereenkomst nodig (artikel 28 AVG). Voor een advocaat of notaris komt het beroepsgeheim erbij.
Of een opzet in uw geval in orde is, beoordeelt uw eigen jurist en uiteindelijk de Autoriteit Persoonsgegevens. Een leverancier hoort die vraag niet voor u te beantwoorden.
promptShield draait op de computer waar het bestand al staat. Detecteren, tekstherkenning, zwartlakken en het Coderegister blijven daar. De desktopapp mag zich ‘100% offline’ noemen, en Pro heeft een volledig afgesloten stand zonder licentiecontrole en crashrapportage.
De gratis browserapp stuurt bij het starten een anoniem gebruiksbericht, dus daar geldt ‘100% offline’ niet. Voor beide geldt wel dat het document zelf de machine niet verlaat. Diepteanalyse op een externe dienst stuurt paginatekst naar buiten, maar staat standaard uit.
Wat een eigen detectie-engine verder mogelijk maakte
Bij Coderen vervangt promptShield een waarde door een code die even breed is als het origineel, zodat de opmaak blijft staan. De koppeling gaat het Coderegister in. Met Decoderen zet u de echte gegevens lokaal terug in het antwoord van een taalmodel.
Codes gelden per map: in een andere map krijgt dezelfde naam een andere code, omdat elke map zijn eigen codes heeft. Alleen een code die u in Instellingen met de hand vastzet, geldt in de hele Bibliotheek.
De gratis browserapp maakt codes op dezelfde manier als de desktop, met een eigen sleutel van de browser. Een code die u daar ziet, heeft dus de echte vorm. Omdat model en regels van ons zijn, konden we het model voor de browser ook kleiner maken. Hoe dat ging, staat elders.
Een weekend of een jaar
Zijn uw documenten tekststromen en uw gebruikers ontwikkelaars, dan is Presidio waarschijnlijk alles wat u nodig hebt. Levert u pagina's aan mensen die er hun naam onder zetten, reken dan op werk naast het model: rechthoeken, scans, verborgen tekst en besluiten over wat niet zwart hoeft. Bij ons duurde dat veel langer dan een weekend, en af is het nog niet.
Veelgestelde vragen
Waarom een eigen detectiemotor bouwen als er goede bibliotheken bestaan?
Een bibliotheek zegt waar in een tekst een patroon past, en voor tekststromen is dat genoeg. Een gebruiker met een pdf wil weten wat er op de pagina zwart moet. Daarvoor zijn rechthoeken, tekstherkenning, een schone export en vooral ruisfilters nodig.
Wat geeft een bibliotheek u niet?
Geen rechthoeken, geen tekstherkenning voor scans en geen schone export van metadata, formuliervelden en miniaturen. Ook geen filters die een losse functietitel laten staan: die schrijft u zelf, per taal.
Zit het verschil in het model of in het filteren?
Vooral in het filteren. De modellen voor Entiteiten kan iedereen gebruiken, en u kiest per installatie tussen spaCy, BERT en GLiNER. Het verschil zit in samenvoegen, doorzetten over pagina's en weghalen wat geen persoonsgegeven is, zoals de 195 functietitels.
Werkt het ook op gescande Nederlandse documenten?
Ja, Nederlands is een van de acht taalpakketten, en de scan wordt gelezen in het Nederlands plus Engels. Kijk de vondsten wel na in Beoordelen, want bij een slechte scan is de herkenning minder betrouwbaar zonder dat het programma dat meldt.