corpus-scrub 0.1.0: detecta y redacta PII y secretos en corpus de entrenamiento antes del entrenamiento
Los modelos memorizan y filtran lo que hay en los datos de entrenamiento.
corpus-scrublos limpia antes de entrenar: detecta PII (email, teléfono, IBAN, tarjeta, nombres) y secretos (API keys, tokens) y los redacta localmente, sin enviar nada a ningún servicio.
El problema
Los corpus raspados de la web contienen rutinariamente datos personales y credenciales. La literatura lo deja claro:
- Modelos de síntesis de imágenes que retroalimentan riesgos de privacidad amplificados en mezclas real-sintético (arXiv 2607.13541)
- Memorización no intencionada de información sensible en fine-tuning (arXiv 2601.17480)
- Direcciones de activación universales para fuga de PII (UniLeak) (arXiv 2602.16980)
GDPR y el art. 10 de la EU AI Act prohíben datos personales no estructurados en conjuntos de entrenamiento sin consentimiento. La solución barata es limpiar el corpus antes de entrenar.
Qué hace
corpus-scrub es una CLI local-first (AGPL-3.0-or-later) que escanea JSONL/TXT/Parquet y:
-
PII: Presidio (NER spaCy
en_core_web_lgpara PERSON) + regex propios para EMAIL / IBAN / CARD / PHONE que no dependen de modelo y funcionan en cualquier idioma. -
Secretos: un ruleset de 16 reglas portadas verbatim de gitleaks (commit fijado
4c232b5), verificadas regla por regla contra elgitleaks.tomloriginal en los tests. -
Redacción:
mask(<TYPE>),hash(sha256 truncado) odrop. - Reporte: JSON de auditoría con conteo por tipo y localizaciones.
Multi-idioma para nombres (ES/DE/FR) vía modelos spaCy _lg dedicados, con fallback multilingüe explícito y tests que fallan si el fallback se usa por accidente.
Cómo funciona
# Instalar
python -m venv .venv && source .venv/bin/activate
pip install -e .
# el primer run descarga spaCy en_core_web_lg (~400 MB)
# Escanear y enmascarar
corpus-scrub scan --input corpus.jsonl --policy mask --out redacted.jsonl --report report.json
# Solo inglés en el MVP; otros idiomas error explícito
corpus-scrub scan --input corpus.jsonl --lang en
Los detectores universales (email/teléfono/IBAN/tarjeta) son regex, así que no necesitan modelo y cubren cualquier idioma. El NER de PERSON usa Presidio para EN y spaCy directo para ES/DE/FR.
Limits honestos
No todo está garantizado, y está documentado:
- AC-1 garantiza recall >= 0.95 para EMAIL, PERSON y CREDIT_CARD. PHONE e IBAN no están garantizados en el MVP: Presidio puntúa el teléfono bajo el umbral y el reconocedor de IBAN falla en algunos formatos EN. Es un KNOWN_ISSUE, no una sorpresa.
- NER multilingüe exige los modelos
_lgdescargados; si faltan, los tests de precisión fallan en vez de pasar silenciosamente contra el fallback.
Auditoría y gobernanza
El ruleset de secretos pasó una auditoría regla-por-regla contra la fuente de gitleaks. Se encontró y corrigió una divergencia real: la regla pypi-upload-token usaba un comodín en vez del prefijo base64 fijo del token real, lo que generaba falsos positivos demostrados. El fix añadió un test que compara cada regla portada contra el gitleaks.toml embebido como fixture, así que futuras derivas se detectan solas.
Cobertura de tests: 82% (fast suite sin descarga de modelos; slow suite con los _lg).
Stack
| Componente | Uso |
|---|---|
| Presidio + spaCy | NER PERSON (EN) |
spaCy es/de/fr_core_news_lg
|
NER PERSON multilingüe |
| regex gitleaks | detección de secretos |
| pytest + CI | fast/slow suites, cobertura |
Pruébalo
git clone https://github.com/amurlaniakea/corpus-scrub
cd corpus-scrub
python -m venv .venv && source .venv/bin/activate
pip install -e .
pytest -m "not slow" # suite rápida, sin descargas
Repo: https://github.com/amurlaniakea/corpus-scrub
Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez — amurlaniakea@gmail.com
Top comments (0)