# corpus-scrub 0.1.0: detecta y redacta PII y secretos en corpus de entrenamiento antes del entrenamiento LLM

> Source: <https://dev.to/magopredator/corpus-scrub-010-detecta-y-redacta-pii-y-secretos-en-corpus-de-entrenamiento-antes-del-432h>
> Published: 2026-07-17 01:21:29+00:00

Los modelos memorizan y filtran lo que hay en los datos de entrenamiento.

`corpus-scrub`

los 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.

Los corpus raspados de la web contienen rutinariamente datos personales y credenciales. La literatura lo deja claro:

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.

`corpus-scrub`

es una CLI local-first (AGPL-3.0-or-later) que escanea JSONL/TXT/Parquet y:

`en_core_web_lg`

para PERSON) + regex propios para EMAIL / IBAN / CARD / PHONE que no dependen de modelo y funcionan en cualquier idioma.`4c232b5`

), verificadas regla por regla contra el `gitleaks.toml`

original en los tests.`mask`

(`<TYPE>`

), `hash`

(sha256 truncado) o `drop`

.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.

```
# 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.

No todo está garantizado, y está documentado:

`_lg`

descargados; si faltan, los tests de precisión fallan en vez de pasar silenciosamente contra el fallback.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`

).

| 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 |

```
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](https://github.com/amurlaniakea/corpus-scrub)

*Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez — amurlaniakea@gmail.com*
