privacy-filter-br
BERTimbau fine-tune para detecção de PII (Personally Identifiable Information) em português brasileiro. 22 categorias, BIOES tagging (89 labels).
Latest: v8.1
main aponta sempre pra última versão estável. Hoje: v8.1 (templates derivados de docs públicos BR fecham o gap de detecção de data em real-world — Phase 1 CVM date F1 0 → 0.75 overlap).
Uso
from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline
# Latest (recomendado)
tok = AutoTokenizer.from_pretrained("lucianfialho/privacy-filter-br")
model = AutoModelForTokenClassification.from_pretrained("lucianfialho/privacy-filter-br")
ner = pipeline("token-classification", model=model, tokenizer=tok, aggregation_strategy="simple")
# Pin numa versão específica
model = AutoModelForTokenClassification.from_pretrained(
"lucianfialho/privacy-filter-br",
revision="v8.1", # ou "v3" pra legacy baseline
)
Produção: use junto com br-pii-guardrail que aplica boundary merger no output do modelo — fix crítico pra real-world docs onde sub-token fragmentation derruba exact-match F1 pra zero.
Versões disponíveis
| Tag | F1 sintético (micro) | Phase 1 CVM (overlap, 4 cats macro) | Notas |
|---|---|---|---|
v8.1 (main) |
0.9906 | 0.8536 | + 7 templates derived from CVM/RFB/JUCESP/DOU; date 0→0.75 |
v3 |
0.9900 | 0.6786 | Baseline pre-Phase 2, Haiku-rewritten data |
v4, v5, v6, v7, v8 não estão acessíveis nesse repo — iterações intermediárias com problemas conhecidos. v4 teve distribution-shift catastrófico em cross-holdout. v7 fechou o gap de boundary fragmentation (exact F1 0→0.90) mas date detection ficou em 0/30 no CVM. v8 fixou a instrumentação do labeler (data_nasc registrada) mas modelo overfitou no phrasing do rewriter ("nascido(a) em DATE, filho(a)" vs CVM "nascido em DATE, exerce profissão"). v8.1 fecha esse gap.
Phase 1 CVM real benchmark (30 docs)
Com boundary merger (br-pii-guardrail aplica automaticamente):
| Categoria | overlap F1 | exact F1 | notas |
|---|---|---|---|
private_cpf |
1.0000 | 1.0000 | perfeito |
private_cnpj |
1.0000 | 1.0000 | perfeito |
private_person |
0.7143 | 0.6905 | 30/30 detect, 22 FP (boundary slop em "DA SILVA JR.") |
private_date |
0.7500 | 0.3125 | 24/30 detect, boundary precisa polir |
Sintético per-category (eval holdout pós-treino): todas as 22 cats com F1 entre 0.93 e 1.00. Date sintético: 0.9616, address sintético: 0.9375.
Categorias detectadas (22)
private_person, private_cpf, private_cnpj, private_rg, private_pis, private_cnh, private_titulo_eleitor, private_ie, private_certidao, private_email, private_phone, private_address, private_date, private_url, account_number, private_customer_id, private_order_id, private_invoice_number, private_tracking_code, private_transaction_id, private_client_revenue, secret
Limitações conhecidas
- Date exact F1 ainda baixo (0.31 em CVM): modelo detecta a data mas boundary precisa polir. Overlap F1 0.75 já viável pra redaction.
- Address não mensurável em Phase 1 v1: CVM não tem street addresses nos cadastros. Phase 1 v2 (issue #1) trará fontes com address gold real.
- Schema não cobre identificadores transacionais BR: CMC7, linha digitável de boleto, chave NF-e, chave PIX EVP, agência+conta bancária. Schema expansion tracked em issue #2.
Recursos
- Source: https://github.com/lucianfialho/privacy-filter-br
- Library wrapper:
br-pii-guardrail0.1.6 — adiciona boundary merger + regex/checksum recognizers como complemento ao NER - Demo: Space
- Dataset pipeline + modelo evolution: documentado em
research/wiki/questions/model-evolution.md
Citação
Se usar em pesquisa, cite o repo: github.com/lucianfialho/privacy-filter-br
- Downloads last month
- 69
Model tree for lucianfialho/privacy-filter-br
Base model
neuralmind/bert-base-portuguese-cased