Eén script is niet genoeg
Elk datawetenschapsteam heeft iets geschreven als dit:
import re
def anonymize_email(text):
return re.sub(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', '[EMAIL]', text)
Dit vervangt e-mailadressen. Meer doet het niet. De dataset bevat nog steeds namen, telefoonnummers en medische ID's. Ze faalt nog steeds bij een GDPR-audit.
De kloof tussen "ik heb de e-mails geanonimiseerd" en "deze dataset is GDPR-compliant" is groot. Teams onderschatten het constant.
Wat GDPR van ML-training vereist
GDPR Artikel 5(1)(b) beperkt doelverschuiving. Als gegevens zijn verzameld voor één doel, is het gebruik voor een ander doel — zoals ML-training — een aparte verwerkingsactiviteit die zijn eigen rechtsgrondslag vereist.
Recital 50 laat enige ruimte voor verenigbare doelen. Maar ML-training op klantgegevens die zijn verzameld voor dienstverlening valt zelden in die categorie. GDPR vereist gewoonlijk:
- Expliciete toestemming voor ML-training, of
- Ware anonimisering vóór training, zodat de gegevens buiten GDPR-bereik vallen
Wat ware anonimisering vereist
Voor ML-trainingsdata moet anonimisering:
- Alle directe identifiers verwijderen: namen, e-mails, telefoonnummers, ID-nummers, adressen
- Quasi-identifiers behandelen: leeftijd + functietitel + locatie kunnen samen identificeren
- k-anonimiteit overwegen: elke record moet overeenkomen met ten minste k-1 andere records op alle attributen
- Reproduceerbaar zijn: dezelfde input produceert dezelfde gemaskeerde output voor consistency van de dataset
Het ad-hoc script-probleem
Ad-hoc Python-scripts creëren audithiaten:
- Inconsistentie: datawetenschapper A en B schrijven verschillende scripts, produceren inconsistente outputs
- Geen auditlogboek: er is geen record van wat werd geanonimiseerd en wanneer
- Onderhoud: scripts breken wanneer dataformaten veranderen
- Dekking: scripts missen onbekende PII-types
De CNIL controleerde meerdere AI-bedrijven in 2024. Ze vonden ad-hoc anonimiseringsscripts die e-mails misten in gecombineerde velden, namen misten in niet-gestructureerde tekst en geen audittrail hadden. De bevinding: de anonimisering was onvoldoende.
Systeembenadering
anonym.legal's API integreert in ML-datapijplijnen:
from anonym_legal import AnonymClient
client = AnonymClient(api_key="...")
result = client.anonymize(text=record, entities=["PERSON", "EMAIL", "PHONE", "ID_NUMBER"])
anonymized_record = result.anonymized_text
Het auditlogboek per record documenteert welke entiteiten werden gevonden en vervangen. Dit is de GDPR-documentatie die een DPO of CNIL-auditor nodig heeft.