hiteshwadhwani/pii-model-indic-v1
418
PII Detection Model (Indian + US) — IndicBERT
A token classification model for detecting and redacting Personally Identifiable Information (PII) in English, Hindi, Hinglish, and Devanagari text.
Built on top of ai4bharat/indic-bert — a multilingual ALBERT model pretrained on 12 Indian languages.
Supported Languages
- English — names, addresses, phone numbers, SSN, etc.
- Hindi (Devanagari) — राजेश कुमार, मुंबई, महाराष्ट्र, etc.
- Hinglish — "Mera naam Rajesh hai aur main Mumbai mein rehta hoon"
- Mixed Devanagari + English — "मेरा phone number 9876543210 है"
Entity Types (31)
Usage
from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline
model = AutoModelForTokenClassification.from_pretrained("hiteshwadhwani/pii-model-indic-v1")
tokenizer = AutoTokenizer.from_pretrained("hiteshwadhwani/pii-model-indic-v1")
ner = pipeline("ner", model=model, tokenizer=tokenizer, aggregation_strategy="first")
# English
results = ner("Mr John Smith lives at 456 Oak Avenue Boston")
# Hinglish
results = ner("Mera naam Rajesh Kumar hai aur main Mumbai mein rehta hoon")
# Hindi (Devanagari)
results = ner("कृपया प्रिया शर्मा को +91 98765 43210 पर call करें")
# Devanagari names
results = ner("राजेश कुमार का account number 1234567890 है")
for entity in results:
print(f"{entity['word']} → {entity['entity_group']} ({entity['score']:.2f})")Redaction Example
def redact_pii(text, ner_pipeline, threshold=0.85):
results = ner_pipeline(text)
entities = [r for r in results if r["score"] >= threshold and r["entity_group"] != "O"]
entities.sort(key=lambda x: x["start"])
merged = []
for ent in entities:
label = ent["entity_group"]
if merged and merged[-1]["label"] == label and ent["start"] <= merged[-1]["end"] + 1:
merged[-1]["end"] = max(merged[-1]["end"], ent["end"])
else:
merged.append({"label": label, "start": ent["start"], "end": ent["end"]})
redacted = text
for span in reversed(merged):
redacted = redacted[:span["start"]] + f"[{span['label']}]" + redacted[span["end"]:]
return redacted
print(redact_pii("Shri Rajesh Kumar lives at 42 MG Road Bengaluru Karnataka", ner))
# [PREFIX] [FIRSTNAME] [LASTNAME] lives at [BUILDINGNUMBER] [STREET] [CITY] [STATE]Evaluation Results
Per-Entity F1
Training Details
- Base model: ai4bharat/indic-bert (ALBERT, 12 Indian languages)
- Training data: ~11,800 synthetic samples
- English (Indian + US PII): ~4,700 samples
- Hinglish (Roman script): ~1,000 samples
- Devanagari + English mix: ~1,000 samples
- Pure Devanagari: ~5,000 samples
- Negative samples (no PII): ~3,000 samples
- Epochs: 15
- Learning rate: 3e-5
- Batch size: 32
- Optimizer: AdamW
License
Apache 2.0
