anonimizer-local
De anonimizer als CLI: documenten in batch anonimiseren, met hergebruik van eerdere keuzes.
Status: in gebruik. Draait en wordt gebruikt; installatie via pip.
Verwijder persoonsgegevens en organisatiespecifieke informatie uit documenten - interactief, transparant, EU-soeverein.
👉 Iets delen, feedback geven of een vraag stellen? Klik op een van de knoppen hierboven - geen Git-ervaring nodig. Zie CONTRIBUTING.md voor meer opties.
Gebouwd zodat CISO's en ISO's interne kennis kunnen delen via de kennisbank zonder privacyrisico's.
Nieuw hier? Lees de handleiding - stap-voor-stap gids met voorbeelden, redactionele keuzes en troubleshooting.
Voor wie
Power users die regelmatig documenten anonimiseren.
Snel starten
1. Vereisten
- Python 3.11 of nieuwer - python.org/downloads
- Git - git-scm.com
2. Haal de code op
git clone https://github.com/security-commons-nl/anonimizer.git
cd anonimizer
pip install -r requirements.txt
3. Maak een API-sleutel aan
De tool gebruikt een taalmodel (Mistral) om namen en organisaties te herkennen. Je hebt hiervoor een gratis account nodig:
- Ga naar console.mistral.ai
- Maak een account aan
- Ga naar API Keys en klik Create new key
- Kopieer de sleutel
4. Stel de sleutel in
cp .env.example .env
Open .env in een teksteditor en vul je sleutel in:
AI_API_KEY=jouw-sleutel-hier
5. Stel standaard-vervangingen in (optioneel maar aanbevolen)
cp standaard.yaml.example standaard.yaml
Open standaard.yaml en pas de namen aan voor jouw organisatie. Alles wat hier staat wordt automatisch vervangen zonder dat je er per keer naar gevraagd wordt.
Bijdragen
Zie de CONTRIBUTING van de organisatie: daar staat per project een formulier, ook zonder Git-ervaring.
Licentie
EUPL-1.2, zie LICENSE.
Wat het doet
Je geeft een document op (PDF, Word, PowerPoint, Excel, Markdown, HTML). De tool:
- Haalt de tekst eruit en verwijdert afbeeldingen
- Past automatisch bekende vervangingen toe (bijv. jouw gemeentenaam →
VOORBEELDGEMEENTE) - Laat je per nieuw gevonden naam, e-mailadres of interne term zelf kiezen wat ermee gebeurt
- Onthoudt jouw keuzes voor de volgende keer
- Slaat het resultaat op als
.mdén.html
Gebruik
# Eén document
python anonimizer.py verwerk document.pdf
# Word-bestand
python anonimizer.py verwerk beleid.docx
# Hele map
python anonimizer.py verwerk map/ --batch
# Met opgegeven uitvoernaam
python anonimizer.py verwerk document.pdf --output schoon.md
Ondersteunde formaten
| Formaat | Extensie |
|---|---|
.pdf |
|
| Word | .docx |
| PowerPoint | .pptx |
| Excel | .xlsx |
| Markdown | .md |
| Platte tekst | .txt |
| HTML | .html, .htm |
Interactie
Per nieuw gevonden element kies je wat er mee gebeurt:
[1/8] Persoon: "Jan de Vries"
Suggestie: "de CISO"
> (Enter = akkoord, eigen tekst = jouw vervanging, s = overslaan, q = stop)
Bevestigde keuzes worden onthouden in memory.json. De volgende keer dat je een document verwerkt worden ze automatisch toegepast.
Configuratie
.env - API-instellingen
| Variabele | Standaard | Beschrijving |
|---|---|---|
AI_API_BASE |
https://api.mistral.ai/v1 |
LLM API-endpoint |
AI_API_KEY |
- | API-sleutel (verplicht) |
AI_MODEL_NAME |
mistral-small-latest |
Taalmodel |
Volledig lokaal draaien via Ollama: stel AI_API_BASE=http://localhost:11434/v1 en AI_API_KEY=ollama in.
standaard.yaml - altijd-toepassen vervangingen
Vervangingen die je hier opneemt worden zonder prompt toegepast op elk document. Zie standaard.yaml.example voor een startpunt met gangbare gemeente- en regionamen.
memory.json - geleerd geheugen
Wordt automatisch aangemaakt. Bevat alle eerder bevestigde vervangingen. Niet in git - lokaal per gebruiker.
Meer documentatie
- Handleiding - stap-voor-stap gids voor CISO's en ISO's
- Concept en ontwerp
- Bijdragen
Principes
Dit project volgt de architectuur- en communityprincipes van security-commons-nl: EU-soevereiniteit, AI altijd adviserend, auditbaarheid by design, least privilege en open source als standaard.
anonimizer — Roadmap
CLI-tool om documenten te anonimiseren voor publicatie in de commons.
Huidige staat
De anonimizer is functioneel als CLI-tool met aangescherpte detectiekwaliteit.
Basis (oorspronkelijke release):
- Conversie van .pdf, .docx, .pptx, .xlsx, .md, .txt, .html naar markdown
- Drie-laagse detectie: standaard-vervangingen → geheugen → LLM NER (Mistral EU)
- Interactieve bevestigingsloop per entiteit
- Zelf-lerend geheugen (memory.json)
- Dual output:
.mdén.htmlmet gestileerde placeholders - CI-scanner voor GitHub Actions
Detectiekwaliteit (uitgewerkt in docs/plan-aanscherping.md):
- Deterministische regex-laag voor e-mail, telefoon, postcode, IP, KVK, FG-nummer, IBAN, BSN (11-proef)
- LLM-prompt met expliciete niet-detecteren-lijst (formulierlabels, publieke organisaties) en few-shot voorbeelden
- Allowlist-postfilter voor hardnekkige LLM-FPs (CISO/ISO/AVG/IBD/VNG)
- Chunking voor lange documenten (8k tekens, 400 overlap)
- Anafoor-linking: losse voornamen worden gekoppeld aan reeds gedetecteerde volle namen
- DOCX text frames, headers en footers worden nu ook geëxtraheerd
Robuustheid:
- Word-boundary voor korte keys (BIO matcht niet in "biografie")
- PDF-mojibake-waarschuwing bij encoding-problemen
- Audit-trail via
--audit output.jsonl - Conflict-detectie tussen memory en standaard (dubbele keys, substring, mojibake)
- Memory-sanering via
saneer_memory.py
Kwaliteitsborging:
- 90 unit tests (patronen, replacer, memory, audit, anafoor)
evalueer.pymet precision/recall/F1 per document tegen ground-truth--dry-runflag voor niet-destructieve detectie- GitHub Actions CI met
--min-precision 1.0regressie-gate
Eindmetingen op testset (8 documenten, Leidse regio + synthetisch):
- offline (regex + standaard): P=1.000 R=0.487 F1=0.655
- met LLM + chunking + anafoor: P=0.970 R=0.821 F1=0.889
Openstaand werk
Fase 2 — Uitbreidingen en integratie
- CI-scanner stabiliseren — robuustere foutafhandeling, betere output bij geen bevindingen
- Batch-verwerking verbeteren — voortgangsindicator bij grote mappen
- Ondersteuning voor .odt en .rtf bestanden
- Integratie met kennisbank-workflow: directe upload na anonimisering
Fase 3 — Afbeeldingen anonimiseren in plaats van verwijderen
Huidige gedrag: alle afbeeldingen worden uit het document gestript en vervangen door [AFBEELDING VERWIJDERD]. Daarmee verdwijnt essentiële context — architectuurplaten, processchema's, screenshots die het verhaal dragen zijn onvervangbaar als tekst.
Doel: afbeeldingen behouden in de output, maar inhoudelijk geanonimiseerd.
- OCR-laag toevoegen (bv. Tesseract of een EU-gehoste vision-LLM) om tekst uit afbeeldingen te extraheren
- Geëxtraheerde tekst door dezelfde anonimizer-pipeline als documenttekst (standaard.yaml → patronen → memory → LLM NER)
- Afbeelding her-renderen zonder originele inhoud:
- Diagrammen / flowcharts → Mermaid (structuur behouden, tekst vervangen)
- Eenvoudige schema's en tabellen → SVG met geanonimiseerde labels
- Screenshots van UI's → SVG-mockup of wireframe met generieke labels
- Foto's van personen → blur of symbolische vervanging (geen rendering)
- Fallback: als her-rendering niet betrouwbaar kan, val terug op huidige gedrag (strippen) + duidelijke waarschuwing in de output
- Interactieve review: per afbeelding toont de tool het origineel + de voorgestelde vervanging, gebruiker keurt goed of slaat over
Dit is de grootste waarde-toevoeging voor de kennisbank: documenten met behouden visuele structuur zonder PII-risico.
Fase 4 — anonimizer-browser
Browser-gebaseerde UI zodat CISO's zonder Python-kennis documenten kunnen anonimiseren.
Zie anonimizer-browser voor de browser-versie. (De eerdere Flask-app anonimizer-web is gearchiveerd en vervangen door anonimizer-browser.)
Bijdragen
Heb je ideeën of wil je bijdragen? Open een issue of zie CONTRIBUTING.md.