CoolFace
Modelpublic

hiteshwadhwani/pii-model-indicv2

sourceHugging Faceapache-2.0updated 6mo agoView on Hugging Face
0likes162downloads
Model Card

PII Detection Model — IndicBERTv2

A token classification model for detecting and redacting Personally Identifiable Information (PII) in English, Hindi, Hinglish, and Devanagari text.

Built on ai4bharat/IndicBERTv2-MLM-only — a 278M parameter BERT model pretrained on 20.9B tokens across 24 Indian languages.

Supported Languages

  • —English — names, addresses, phone numbers, SSN, etc.
  • —Hindi (Devanagari) — राजेश कुमार, मुंबई, बीस हज़ार रुपये, पंद्रह मार्च
  • —Hinglish — "Mera naam Rajesh hai aur main Mumbai mein rehta hoon"
  • —Mixed Devanagari + English — "मेरा phone number 9876543210 है"

Entity Types (31)

EntityDescriptionExample
FIRSTNAMEFirst nameRajesh, राजेश, John
LASTNAMELast nameKumar, कुमार, Smith
MIDDLENAMEMiddle nameKumar
PREFIXTitle/prefixMr, श्री, Dr, श्रीमती
GENDERGendermale, female
SEXSexM, F
AGEAge35
DOBDate of birth15/03/1990
DATEGeneral dateपंद्रह मार्च, March fifteenth
EMAILEmail addresspriya@gmail.com
PHONENUMBERPhone number+91 98765 43210
CITYCityMumbai, मुंबई, Boston
STATEStateMaharashtra, महाराष्ट्र
COUNTYCountyCook County
ZIPCODEZIP/PIN code400001, 02101
STREETStreet nameMG Road, Oak Avenue
BUILDINGNUMBERBuilding number42
SECONDARYADDRESSApt/SuiteFlat 301
COMPANYNAMECompanyInfosys, टाटा कंसल्टेंसी
ACCOUNTNUMBERAccount number9876543210
ACCOUNTNAMEAccount nameTata Consultancy
CREDITCARDNUMBERCredit card4111-1111-1111-1111
CREDITCARDCVVCVV123
CREDITCARDISSUERCard issuerVisa, HDFC
SSNSSN/PAN/Aadhaar123-45-6789, ABCDE1234F
IBANIBANIN89UTIB00001234567890
PINATM/Security PIN4098
PASSWORDPasswordS3cur3P@ss!
USERNAMEUsernamemdavis
URLURLwww.example.com
AMOUNTMoney amount50000, बीस हज़ार रुपये

Usage

python
from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline

model = AutoModelForTokenClassification.from_pretrained("hiteshwadhwani/pii-model-indicv2")
tokenizer = AutoTokenizer.from_pretrained("hiteshwadhwani/pii-model-indicv2")

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("मेरा नाम राजेश कुमार है और मैं मुंबई में रहता हूं")

# Hindi amounts and dates in words
results = ner("आपके क्रेडिट कार्ड के बीस हज़ार रूपये शुल्क लंबित हैं, जो पंद्रह मार्च को देना था।")

for entity in results:
    if entity["entity_group"] != "O":
        print(f"{entity['word']} → {entity['entity_group']} ({entity['score']:.2f})")

Redaction Example

python
def redact_pii(text, ner_pipeline, threshold=0.5):
    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]

print(redact_pii("आपके बीस हज़ार रूपये शुल्क लंबित हैं, जो पंद्रह मार्च को देना था।", ner))
# आपके [AMOUNT] शुल्क लंबित हैं, जो [DATE] को देना था।

Evaluation Results

MetricScore
Overall F10.9497
Precision0.9464
Recall0.9530

Per-Entity F1

EntityF1EntityF1
FIRSTNAME0.99LASTNAME0.99
CITY0.99STATE0.99
PHONENUMBER0.98EMAIL0.93
DOB0.96DATE0.95
COMPANYNAME0.97PREFIX0.98
CREDITCARDNUMBER0.95CREDITCARDISSUER0.95
URL0.99USERNAME0.99
MIDDLENAME1.00ACCOUNTNUMBER0.91
PASSWORD0.91ZIPCODE0.95
AMOUNT0.86STREET0.91

Why IndicBERTv2?

indic-bert (v1)IndicBERTv2 (this model)
Parameters32M278M
ArchitectureALBERT (shared layers)BERT (unique layers)
Languages1224
Training corpus~9B tokens20.9B tokens
Devanagari namesPartial subword issuesClean detection
Hindi amounts (बीस हज़ार)Not detectedDetected
Hindi dates (पंद्रह मार्च)Not detectedDetected
Unusual names (Viteshwar)Broken subword alignmentClean detection

Training Details

  • —Base model: ai4bharat/IndicBERTv2-MLM-only (278M params, 24 languages)
  • —Task: Token Classification (NER with BIO tagging)
  • —Epochs: 10
  • —Learning rate: 2e-5
  • —Batch size: 16
  • —Optimizer: AdamW

Limitations

  • —SEX entity has low F1 — overlaps with GENDER
  • —SECONDARYADDRESS detection is weak
  • —Latency is higher than v1 (~25-40ms vs ~8ms) due to larger model size
  • —Best suited for Indian and US PII patterns

License

Apache 2.0