Pseudonimización local de documentos jurídicos en español. No envía nada por red.
Project description
pseudonimizar
Pseudonimización local de documentos jurídicos en español. Sustituye los
identificadores reales de un .docx o .pdf (nombres, DNI/NIE/CIF, IBAN,
teléfonos, direcciones, sociedades…) por etiquetas ficticias consistentes,
de modo que el documento sea seguro para subir a un LLM de consumo sin exponer
datos de cliente.
El contenido del documento NUNCA sale de tu máquina por red. La única conexión admitida es la descarga del modelo de lenguaje la primera vez. No se guarda ninguna tabla de correspondencia real↔ficticio en disco (solo ida, sin mapa).
Uso en un paso
uvx --with pip pseudonimizar contrato.docx
Esto descarga y ejecuta la herramienta al vuelo (necesitas solo
uv, un único binario que instala Python por ti).
¿Por qué
--with pip? El modelo de lenguaje (~0,5 GB) no es una dependencia de PyPI (límites de tamaño): se instala en runtime la primera vez, y para eso el entorno efímero deuvxnecesitapip. Con--with pipel modelo se instala en el entorno cacheado y persiste: las siguientes ejecuciones van directas (~1 s). El slash command/pseudonimizarya añade--with pippor ti.
Produce una copia segura junto al original:
contrato.docx → contrato.anon.docx
escritura.pdf → escritura.anon.txt
y un resumen de lo sustituido:
✓ Pseudonimizado en local. Nada se ha enviado por red.
Personas ................... 4
Sociedades / orgs .......... 2
DNI ........................ 3
IBAN / cuentas ............. 1
Teléfonos .................. 2
Emails ..................... 1
Direcciones ................ 2
Copia segura: contrato.anon.docx
Recuerda: revisa 10 s lo indirecto (fechas señaladas, importes singulares, fincas).
Primera vez: se descarga el modelo es_core_news_lg (~0,5 GB, una sola vez,
queda cacheado). Para dejarlo listo en un setup (p. ej. de un aula) sin esperar
en directo:
uvx --with pip pseudonimizar preparar
A partir de ahí funciona sin conexión.
Opciones
pseudonimizar <archivo> [opciones]
pseudonimizar preparar # descarga/cachea el modelo, sin tocar documentos
| Opción | Efecto | Defecto |
|---|---|---|
<archivo> |
Documento de entrada (.docx o .pdf). |
— (obligatorio) |
--salida, -s RUTA |
Ruta de salida. | junto al original |
--idioma, -i CODE |
Idioma del documento. | es |
--umbral, -u FLOAT |
Umbral de confianza mínimo (bajo a propósito: mejor sobre-redactar). | 0.35 |
--silencioso, -q |
No imprime el resumen. | desactivado |
--version / --help |
Versión / ayuda. | — |
Códigos de salida: 0 ok · 1 error de uso (archivo inexistente, formato no
soportado, PDF escaneado sin texto) · 2 error interno.
Qué detecta
Identificadores directos (se redactan automáticamente):
- Nombres de personas y sociedades / organizaciones (incl. razón social con forma jurídica: S.L., S.A., S.L.U., S.Coop., A.I.E.…).
- DNI, NIE, CIF/NIF (con validación de letra/dígito de control).
- IBAN / cuentas (con validación módulo 97).
- Teléfonos, emails, matrículas de vehículo.
- Direcciones postales, nº de expediente/procedimiento, nº de protocolo.
- Topónimos (ciudades, provincias) → etiqueta
Lugar N.
Los organismos públicos (juzgados, AEAT, registros, notarías, colegios…) se mantienen visibles a propósito: no son datos confidenciales del cliente y dan contexto.
Identificadores indirectos (NO se redactan; los cubre el vistazo humano de 10 s): fechas muy señaladas, importes singulares, datos registrales de finca, cargos poco comunes.
Garantías de privacidad
- Sin red durante el procesado. Verificado por test (
test_sin_red): con la red bloqueada y el modelo cacheado, pseudonimizar un documento completa con éxito. - Sin mapa en disco. El mapeo real↔ficticio vive en memoria y se descarta al terminar. No hay comando de «rehidratar» (decisión de diseño: solo ida).
- Sin telemetría. El paquete no llama a casa ni registra uso.
- Consistencia por archivo. Dentro de un documento, el mismo valor recibe siempre la misma etiqueta; cada documento tiene su mapeo independiente.
Limitaciones conocidas (v1)
- DOCX: al modificar un párrafo se colapsa su formato inline (negritas/ cursivas parciales se pierden en ESE párrafo; los párrafos sin cambios se conservan intactos). Cuadros de texto y SmartArt quedan fuera de alcance.
- PDF: se extrae el texto a
.anon.txt(no se conserva maquetación). Un PDF escaneado (sin texto) se detecta y se avisa; OCR fuera de alcance. - Variantes de un mismo nombre: «María González García» y «Sra. González» pueden recibir etiquetas distintas (no hay correferencia en v1).
- Idioma: español. Catalán/euskera/gallego fuera de alcance en v1.
- Detección por modelo: los nombres/organizaciones dependen de
es_core_news_lg; el recall es muy alto pero no perfecto. De ahí el principio «mejor sobre-redactar» y el vistazo humano de 10 s antes de subir.
Desarrollo
uv venv --python 3.11
uv pip install -e ".[dev]"
python -m spacy download es_core_news_lg # o: pseudonimizar preparar
python scripts/crear_gold.py # genera el gold-set anotado
pytest # 157 pruebas
python scripts/medir.py # tabla de precision/recall vs gold
ruff check src tests scripts
Arquitectura (módulos en src/pseudonimizar/): cli (typer) · engine
(análisis → solapes → sustitución) · recognizers_es (regex deterministas) ·
nlp (spaCy + Presidio) · mapping (etiquetas consistentes) · docx_io /
pdf_io (E/S) · modelo (bootstrap del modelo).
Licencia
MIT · © 2026 Triari Partners
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pseudonimizar-0.1.0.tar.gz.
File metadata
- Download URL: pseudonimizar-0.1.0.tar.gz
- Upload date:
- Size: 476.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9d4326f8669be2702b558f63ed6c22a2e9779a3925ed53b6f1d1d0ab705f365
|
|
| MD5 |
09851dd219318d02956ca0229d34879c
|
|
| BLAKE2b-256 |
6478ae321b60a3a3f5af11f2ac20cdd17f935d21186a0db60ca75edb90f8b591
|
Provenance
The following attestation bundles were made for pseudonimizar-0.1.0.tar.gz:
Publisher:
ci.yml on triari-partners/pseudonimizar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pseudonimizar-0.1.0.tar.gz -
Subject digest:
e9d4326f8669be2702b558f63ed6c22a2e9779a3925ed53b6f1d1d0ab705f365 - Sigstore transparency entry: 1996524337
- Sigstore integration time:
-
Permalink:
triari-partners/pseudonimizar@2ceb2685c56fb3c4c6ae49364e3aba4645b1487c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/triari-partners
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@2ceb2685c56fb3c4c6ae49364e3aba4645b1487c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pseudonimizar-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pseudonimizar-0.1.0-py3-none-any.whl
- Upload date:
- Size: 33.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8522fc1b33081bcb5de76d546724af0d2e8b4006466c81a0219f2ab35b20f981
|
|
| MD5 |
0f3926882e54573223f08446f5dbdb7f
|
|
| BLAKE2b-256 |
f86c3cd893a44e3c51452e4f119da26719aa2484a03cee35399688fd08dae7fc
|
Provenance
The following attestation bundles were made for pseudonimizar-0.1.0-py3-none-any.whl:
Publisher:
ci.yml on triari-partners/pseudonimizar
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pseudonimizar-0.1.0-py3-none-any.whl -
Subject digest:
8522fc1b33081bcb5de76d546724af0d2e8b4006466c81a0219f2ab35b20f981 - Sigstore transparency entry: 1996524535
- Sigstore integration time:
-
Permalink:
triari-partners/pseudonimizar@2ceb2685c56fb3c4c6ae49364e3aba4645b1487c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/triari-partners
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@2ceb2685c56fb3c4c6ae49364e3aba4645b1487c -
Trigger Event:
push
-
Statement type: