ko-pii-detector-ax-tokenclf

Korean PII (Personally Identifiable Information) span detector โ€” token classification (BIO tagging) head on top of skt/A.X-Encoder-base.

Performance

Entity-level (exact span match) on held-out test set (14,294 examples):

metric precision recall f1
micro avg 0.9634 0.9779 0.9706
macro avg 0.9595 0.9746 0.9669

Per label (f1, entity-level exact match):

label f1 label f1
EMAIL 0.9984 RRN 0.9723
DATE 0.9955 ADDRESS 0.9714
CARD_EXPIRY 0.9954 PASSPORT 0.9700
ACCOUNT_NUMBER 0.9939 USER_ID 0.9575
CARD_NUMBER 0.9934 PHONE 0.9447
SECRET 0.9908 FRN 0.9306
IPIN 0.9870 GENERIC_ID 0.9161
PERSON 0.9849 DRIVER_LICENSE 0.8343
ZIPCODE 0.9838
CVC 0.9838

DRIVER_LICENSE/GENERIC_ID are the weakest labels (high format variance, no fixed pattern to key on).

Full precision/recall per label, CRF-head comparison: ko-pii-detector docs/performance.md

Dataset

Trained on BCCard/pii-masking-openpii-finance with additional noise injection (typos, spacing/format variants, obfuscation, partial-value references, distractor IDs, etc. โ€” see docs/noise.md) to make the model robust to real-world noisy input.

18 span labels:

label description
PERSON full name
RRN resident registration number (Korea)
FRN foreign registration number
CARD_NUMBER credit/debit card PAN
ACCOUNT_NUMBER bank account number
SECRET auth secret (password / API key / token)
USER_ID online member ID
EMAIL email address
PHONE phone number (mobile / landline)
PASSPORT passport number
DRIVER_LICENSE driver's license number
GENERIC_ID generic identifier (no KO counterpart)
ADDRESS address (city / street / building)
ZIPCODE postal code
DATE date / time
CARD_EXPIRY card expiry date
CVC card verification code
IPIN I-PIN number

Usage Example

import torch
from transformers import AutoModelForTokenClassification, AutoTokenizer

# Load tokenizer, model
tokenizer = AutoTokenizer.from_pretrained("id4thomas/ko-pii-detector-ax-tokenclf", use_fast=True)
model = AutoModelForTokenClassification.from_pretrained("id4thomas/ko-pii-detector-ax-tokenclf")
model.eval()

id2label = model.config.id2label

# predict
text = "๋ฌธ์˜์‚ฌํ•ญ์€ 010-1234-5678 ๋˜๋Š” hong@example.com ์œผ๋กœ ์—ฐ๋ฝ ์ฃผ์„ธ์š”."
enc = tokenizer(text, return_tensors="pt", return_offsets_mapping=True)
offsets = enc.pop("offset_mapping")[0].tolist()

with torch.no_grad():
    pred_ids = model(**enc).logits.argmax(dim=-1)[0].tolist()

# merge BIO-tagged tokens into entity spans
entities, cur = [], None
for pred_id, (start, end) in zip(pred_ids, offsets):
    if start == end:
        continue
    tag = id2label[pred_id]
    if tag == "O":
        cur = None
        continue
    prefix, _, label = tag.partition("-")
    if prefix == "B" or cur is None or cur["label"] != label:
        cur = {"label": label, "start": start, "end": end}
        entities.append(cur)
    else:
        cur["end"] = end

for ent in entities:
    ent["value"] = text[ent["start"]:ent["end"]]
    print(ent)
# {'label': 'PHONE', 'start': 6, 'end': 19, 'value': '010-1234-5678'}
# {'label': 'EMAIL', 'start': 23, 'end': 39, 'value': 'hong@example.com'}

More Examples (per label)

One example per label from dataset's held-out validataion

label text predicted entities
PERSON ์ค‘๊ณ ์ฐจ ํ• ๋ถ€ ๊ธˆ๋ฆฌ ์ธํ•˜ ์š”๊ตฌ๊ถŒ ์‹ ์ฒญ - ์‹ ์ฒญ์ธ ์„œ์€์šฐ, ๋ฉดํ—ˆ๋ฒˆํ˜ธ 64-23-318617-41, ์‚ฌ์œ  ์‹ ์šฉ๋“ฑ๊ธ‰ ์ƒ์Šน. PERSON: ์„œ์€์šฐ ยท DRIVER_LICENSE: 64-23-318617-41
RRN ๊ฐ€์กฑ ํ•ฉ์‚ฐ ์‹ค์  ๋“ฑ๋ก ์š”์ฒญ: ๋ณธ์ธ 670827-1922483, ๋ฐฐ์šฐ์ž 930826-6089963, ํ•ฉ์‚ฐ ๊ธฐ์ค€์ผ 2023๋…„ 6์›” 18์ผ, ํ•ฉ์‚ฐ ์‹ค์  3,400,000์›. RRN: 670827-1922483 ยท FRN: 930826-6089963 ยท DATE: 2023๋…„ 6์›” 18์ผ
FRN ์ด์ฒด ํ•œ๋„ ์ƒํ–ฅ ์‹ฌ์‚ฌ์— ์‹ ๋ถ„ ํ™•์ธ์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๊ตญ์ธ๋“ฑ๋ก๋ฒˆํ˜ธ 000609-8628264์™€ ์žฌ์ง์ฆ๋ช…์„œ๋ฅผ ์•ฑ์œผ๋กœ ์ œ์ถœํ•ด ์ฃผ์„ธ์š”. ์‹ฌ์‚ฌ๋ฒˆํ˜ธ RV-2210. FRN: 000609-8628264
CARD_NUMBER ์ถ”๊ฐ€ ์„œ๋ฅ˜๋กœ๋Š” 1993HP@tutanota.com์œผ๋กœ ์ „์†ก๋œ AX8F9I3KEY์™€ GMHFUPB2OC ์‚ฌ๋ณธ์ด ํ•„์š”ํ•˜๋ฉฐ, ์ด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์„ธ์•ก๊ณต์ œ ๊ธˆ์•ก์ด 2200047020154130๋งŒํผ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. EMAIL: 1993HP@tutanota.com ยท GENERIC_ID: AX8F9I3KEY ยท DRIVER_LICENSE: GMHFUPB2OC ยท CARD_NUMBER: 2200047020154130
ACCOUNT_NUMBER ์ž๋…€ ํ•™์›๋น„ ์ž๋™์ด์ฒด๋ฅผ ๊ฑธ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๊ธˆ ๊ณ„์ขŒ 247-23-769052, ๋งค์›” 5์ผ, ๊ธˆ์•ก 420,000์›. ACCOUNT_NUMBER: 247-23-769052
SECRET ๋ชจ๋ฐ”์ผ OTP ์žฌ๋“ฑ๋ก ์ค‘์ž…๋‹ˆ๋‹ค. ๊ณ„์ • pzmmgtx, ์ž„์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ QJ#qhsLRko70, ์˜ค๋ฅ˜ ์ฝ”๋“œ AU-77. USER_ID: pzmmgtx ยท SECRET: QJ#qhsLRko70
USER_ID ์—ฐ๊ธˆ ์กฐํšŒ ์„œ๋น„์Šค ๊ฐ€์ž… ํ™•์ธ ๋ฉ”์ผ์ž…๋‹ˆ๋‹ค. ์•„์ด๋”” mbllxmb.4, ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ dZq70t2fmd0H, ๊ฐ€์ž…์ผ 2059-07-07. USER_ID: mbllxmb.4 ยท SECRET: dZq70t2fmd0H ยท DATE: 2059-07-07
EMAIL yang Moheb ๋‹˜๊ป˜, ๊ท€ํ•˜์˜ ํ›„๋ณด์ž ๋ฒค์น˜๋งˆํ‚น ์ ์ˆ˜๋Š” 0 ์ ์ด๋ฉฐ, ์ƒ์„ธ ๋‚ด์šฉ์€ ๋ฌธ์„ธ์—ฐ@gmail.com ๋กœ ์†ก๋ถ€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. PERSON: Moheb ยท EMAIL: ๋ฌธ์„ธ์—ฐ@gmail.com
PHONE ํ–ฅ๋ฏธ ์—ฐ์ž ๋‹˜, ... ๋‹ด๋‹น์ž ์—ฐ๋ฝ์ฒ˜: (88).0410.3736 ... ์Šน์ธ์ž: ๋ผ๋‚˜ ๋ถ€์ž๋„ PERSON: ํ–ฅ๋ฏธ ์—ฐ์ž ยท PHONE: (88).0410.3736 ยท PERSON: ๋ผ๋‚˜ ๋ถ€์ž๋„
PASSPORT ์„ ๋ฐ• ์Šน๋ฌด์› ๊ธ‰์—ฌ ๊ณ„์ขŒ ๊ฐœ์„ค ์„œ๋ฅ˜ - ์Šน๋ฌด์› ๊น€์˜์ฒ , ์—ฌ๊ถŒ๋ฒˆํ˜ธ F818J7636, ์Šน์„  ๊ณ„์•ฝ์„œ ์‚ฌ๋ณธ, ๊ฐœ์„ค ์ง€์  ํ•ญ๋งŒ์ . PERSON: ๊น€์˜์ฒ  ยท PASSPORT: F818J7636 ยท ADDRESS: ํ•ญ๋งŒ์  (false positive)
DRIVER_LICENSE ์‹ ์ฒญ์„œ๋Š” ๊ธฐ@hotmail.com ๋กœ ๋ณด๋‚ด์‹œ๊ณ , ํ•„์š” ์„œ๋ฅ˜๋กœ๋Š” VHIO4UYEIC ๊ณผ 1VHIE1OCT3์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. EMAIL: ๊ธฐ@hotmail.com ยท GENERIC_ID: VHIO4UYEIC ยท DRIVER_LICENSE: 1VHIE1OCT3
GENERIC_ID ๋ฏธ์ฒญ๊ตฌ ๋ณดํ—˜๊ธˆ ์•ˆ๋‚ด๋ฌธ: ๊ณ„์•ฝ ์‹๋ณ„๋ฒˆํ˜ธ FC9XLY8KJ5 ๊ธฐ์ค€ ๋ฏธ์ฒญ๊ตฌ ์‹ค์† ๋ณดํ—˜๊ธˆ 127,400์›์ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์•ฑ์—์„œ ์ฒญ๊ตฌํ•˜์„ธ์š”. GENERIC_ID: FC9XLY8KJ5
ADDRESS ๋ฐฐ์†ก ์˜ค๋ฅ˜ ๋ณด์ƒ ์•ˆ๋‚ด: ์˜ค๋ฐฐ์†ก์ง€ ์ œ์ฃผ๋„ ํ•ด๋‚จ๊ตฐ ๋…ธํ˜•๋™ 519-32 ๊ฐœ๋‚˜๋ฆฌ์•„ํŒŒํŠธ 121๋™ 1364ํ˜ธ (์šฐํŽธ๋ฒˆํ˜ธ 04362)๋กœ ๋ฐœ์†ก๋œ ์นด๋“œ๊ฐ€ ํšŒ์ˆ˜๋˜์—ˆ์œผ๋ฉฐ, ... ADDRESS: ์ œ์ฃผ๋„ ํ•ด๋‚จ๊ตฐ ๋…ธํ˜•๋™ 519-32 ๊ฐœ๋‚˜๋ฆฌ์•„ํŒŒํŠธ 121๋™ 1364ํ˜ธ ยท ZIPCODE: 04362
ZIPCODE ์‹ ๊ทœ ์‹ ์ฒญ ์–‘์‹์—๋Š” ๊ฑฐ์ฃผ ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ์‚ฌํ‰๋กœ 50 ๋ฒˆ์ง€, 30140 ์šฐํŽธ๋ฒˆํ˜ธ, ๋Œ€์ „๊ด‘์—ญ์‹œ ์›”ํ‰1๋™ ์›”ํ‰1๋™ ์‹œ. ADDRESS: ์‚ฌํ‰๋กœ 50 ยท ZIPCODE: 30140 ยท ADDRESS: ๋Œ€์ „๊ด‘์—ญ์‹œ ์›”ํ‰1๋™ ์›”ํ‰1๋™
DATE ์•ˆ๋…•ํ•˜์„ธ์š” ๊ตฐ ๋ฆผ๋‹˜, ... ๋‚ ์งœ: 25/12/1998, ์žฅ์†Œ: 40th Division Road 482, ์—ฐ๋ฝ์ฒ˜: 003-556 3130. PERSON: ๋ฆผ ยท PERSON: ์€์ฑ„ ยท DATE: 25/12/1998 ยท ADDRESS: 40th Division Road 482 ยท PHONE: 003-556 3130
CARD_EXPIRY ๋ฉค๋ฒ„์‹ญ ์ž๋™ ๊ฐฑ์‹ ์„ ํ•ด์ง€ํ•ด ์ฃผ์„ธ์š”. ๋“ฑ๋ก ์นด๋“œ๋Š” 4395952462642202์ด๊ณ  ์œ ํšจ๊ธฐ๊ฐ„ 05/30, CVC 461๊นŒ์ง€ ํ™•์ธํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. CARD_NUMBER: 4395952462642202 ยท CARD_EXPIRY: 05/30 ยท CVC: 461
CVC ๊ธด๊ธ‰ ์ •์ง€ ์š”์ฒญ! ๋ฐฉ๊ธˆ ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ์— ์นด๋“œ๋ฒˆํ˜ธ 5126587179360798์™€ ์œ ํšจ๊ธฐ๊ฐ„ 03/26, CVC 704๊นŒ์ง€ ์ž…๋ ฅํ•ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. CARD_NUMBER: 5126587179360798 ยท CARD_EXPIRY: 03/26 ยท CVC: 704
IPIN ๊ตฌ์ธ ์‚ฌ์ดํŠธ ์ด๋ ฅ์„œ ๊ณต๊ฐœ ์„ค์ • ๋ณ€๊ฒฝ์€ ์•„์ดํ•€ 2938510213123 ์žฌ์ธ์ฆ ํ›„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. IPIN: 2938510213123

Predictions match gold labels exactly for all rows except PASSPORT, where the model adds one false-positive ADDRESS span (ํ•ญ๋งŒ์ , a bank-branch name suffix).

Downloads last month
25
Safetensors
Model size
0.1B params
Tensor type
F32
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for id4thomas/ko-pii-detector-ax-tokenclf

Finetuned
(8)
this model

Dataset used to train id4thomas/ko-pii-detector-ax-tokenclf

Collection including id4thomas/ko-pii-detector-ax-tokenclf