ossredact-pii-large / README.md
Skiipy's picture
Add OSSRedact PII NER v11r9c weights + model card (bilingual FR/EN, MIT)
1341549 verified
|
Raw
History Blame Contribute Delete
6.55 kB
---
license: mit
language:
- fr
- en
library_name: transformers
pipeline_tag: token-classification
base_model: FacebookAI/xlm-roberta-large
tags:
- pii
- redaction
- privacy
- ner
- token-classification
- french
- quebec
- gdpr
- law-25
---
# OSSRedact PII NER -- xlm-roberta-large (GPU tier)
![OSSRedact PII (large) -- bilingual FR/EN PII + secrets detection, on-device](banner.png)
**A bilingual (French-Québec + English) PII / secrets token-classifier** -- the high-capacity detection model
behind [OSSRedact](https://github.com/ZenSystemAI/OSSRedact), a local privacy gateway that redacts private data
before it reaches a cloud LLM and rehydrates it on the reply.
Shipping revision: **`v11r9c`**. The smaller always-on tier is
[`ZenSystemAI/ossredact-pii-base`](https://huggingface.co/ZenSystemAI/ossredact-pii-base) (dynamic-INT8 ONNX, also the
in-browser tier).
![v11r9c closes the organization + address leak](fig_v11r9c_org_address.png)
![OSSRedact vs Microsoft Presidio on Québec FR/EN PII](fig5_vs_presidio.png)
*Top: the v11r9c gain on the synthetic held-out corpus. Bottom: a historical (v6/v7) recall comparison vs
Microsoft Presidio on Québec FR/EN PII -- OSSRedact wins recall by 17-23 points with far fewer false positives.*
## What it is
A `xlm-roberta-large` token classifier fine-tuned to tag **20 PII / secret entity types** in realistic French-
Québec and English documents. It is the GPU/large detection tier of OSSRedact; in production it runs **inside**
the OSSRedact gateway, which pairs it with a deterministic Tier-0 floor (regex + Luhn + entropy) and AES-GCM
session rehydration. The model runs **locally on-device** -- no detection call leaves the machine.
The bilingual Québec-French focus is the differentiator: general English-first PII detectors miss FR structure
(NEQ, RAMQ, SIN, FR letterhead, accented ALL-CAPS names).
## Labels (20)
`account_number`, `address`, `card_cvv`, `card_expiry`, `date_of_birth`, `email`, `file_path`, `government_id`,
`iban`, `ip_address`, `organization`, `password`, `payment_card`, `person`, `phone_number`, `postal_code`,
`secret`, `sensitive_account_id`, `tax_id`, `username` (41 BIO label ids).
## Intended use
- **Primary:** the detection tier inside the OSSRedact gateway (redact-on-egress / rehydrate-on-response for
cloud LLM traffic), or any local PII-redaction pipeline.
- **Also:** document de-identification, DLP, privacy review of FR/EN text.
> **Use it with a deterministic floor.** As a standalone NER model, recall is below 100% and `organization`
> and `address` have **no** fallback. OSSRedact gets its hard guarantee from a Tier-0 floor (secrets, payment
> cards via Luhn, IBANs, government IDs, emails, IPs, file paths) that runs *independently* of this model. Do
> not rely on the model alone for the catastrophic categories.
### Quick start
```python
from transformers import AutoTokenizer, AutoModelForTokenClassification
import torch
tok = AutoTokenizer.from_pretrained("ZenSystemAI/ossredact-pii-large", revision="v11r9c")
model = AutoModelForTokenClassification.from_pretrained("ZenSystemAI/ossredact-pii-large", revision="v11r9c").eval()
text = "Contactez Marie-Eve Tremblay au 514-555-0188; NAS 046 454 286."
enc = tok(text, return_offsets_mapping=True, return_tensors="pt")
offsets = enc.pop("offset_mapping")[0].tolist()
with torch.no_grad():
pred = model(**enc).logits[0].argmax(-1).tolist()
for (s, e), p in zip(offsets, pred):
lab = model.config.id2label[p]
if s != e and lab != "O":
print(f"{text[s:e]!r:24} -> {lab}")
```
## Training data
A **100% synthetic** French-Québec + English corpus (bank statements, financing forms, email threads, CSV
exports, `.env` files, code, KYC/tax/SAAQ/RAMQ documents). Every name, SIN, account, card, and secret is
fabricated, so the corpus can be regenerated and re-run anywhere with no real-data exposure. It deliberately
includes adversarial cases (ALL-CAPS, NBSP-separated IDs, mixed FR/EN, long unbroken lines, look-alike decoys,
names glued into code identifiers). The corpus is cumulative across the v11 error-mining rounds (base + the
structural-name and organization/address augmentations).
## Evaluation
Measured on a synthetic held-out corpus (7,498 rows, 0 train overlap, unseen document structures). The privacy
metric is **full-stack catastrophic DETECTION recall** -- any detected span is redacted regardless of which
label it gets, so an intra-catastrophic mislabel is a redaction, not a leak. `clean_fp` is over-redaction count
on no-PII rows.
| tier | catastrophic full-stack DETECTION | all-label recall | precision | clean_fp |
|------|-----------------------------------|------------------|-----------|----------|
| **GPU / large (v11r9c)** | **0.9954** | 0.9882 | 0.9615 | 34 / 7498 |
All-label F1 0.9742. Of the 13 catastrophic categories, email / iban / secret / password / file_path / tax_id /
card_expiry / card_cvv / government_id / postal_code / date_of_birth / ip_address / payment_card all detect at
**1.000**; `person` 0.9946 (precision 0.9999), `sensitive_account_id` 0.9993. **Organization 1.00, address
0.95** (v11r9c closed the structural-form leak the prior revision had: organization ~0.10 -> 1.00, address
~0.60 -> 0.95). FR is not weaker than EN. The cost of the org/address fix is more over-redaction on digit-ID-
shaped tokens (clean_fp 12 -> 34) -- the safe failure direction (over-redaction never leaks).
Training recipe: batch size 8, learning rate 2e-5, max length 512, 3 epochs, `metric_for_best_model=cat_f1`
(checkpoint maximizes recall on the catastrophic-leak labels). 559 M params.
## Limitations
- Trained and validated entirely on **synthetic Québec** data; broader real-world domains are future work.
- **French and English only** by design.
- `organization` and `address` have **no deterministic floor** -- they rely entirely on this model (well-covered
on the synthetic corpus, but model-dependent, not a hard guarantee).
- Identifier coverage targets **Canadian / Québec** formats (SIN, RAMQ, NEQ, postal codes). Foreign formats
(US ZIP, Brazilian CPF) are not specifically targeted.
- Full names glued into code identifiers (camelCase / snake_case) are under-detected.
- Recall is below 100%; use within OSSRedact's deterministic floor for the catastrophic categories.
## License & links
MIT. Part of [OSSRedact](https://github.com/ZenSystemAI/OSSRedact) by ZenSystemAI. The version label `v11rN`
is the weight revision (an HF revision tag), not part of the repo id.