seongyeon1/ko-pii-ner-100k
한국 PII 특화 학습용 데이터셋 (ko_pii_v1) 한국 고유 식별자와 조사 결합 경계를 정면으로 다루는 한국어 PII NER 학습 데이터셋. 1. 개요 학습용 98,845건 + 외부 평가용 홀드아웃 2,006건 라벨 20종 3티어 / BIO 41 클래스 시드 42, 검증자릿수 정책 invalid, 사용 티어 [1, 2, 3] 포맷: JSONL. {id, text, spans:[{start,end,label,value}], meta} 이 레포의 NERPreprocessor span 포맷과 동일해 학습 경로 수정 없이 사용 가능 1-1. 이 데이터셋으로 학습한 모델 seongyeon1/ko-pii-ner-roberta-base (klue/roberta-base 파인튜닝, CC-BY-SA-4.0) 학습에 한 번도 쓰이지 않은 KDPII 공식 test split 기준 F5 0.9344. 내부… See the full description on the dataset page: https://huggingface.co/datasets/seongyeon1/ko-pii-ner-100k.
한국 PII 특화 학습용 데이터셋 (kopiiv1)
한국 고유 식별자와 조사 결합 경계를 정면으로 다루는 한국어 PII NER 학습 데이터셋.
1. 개요
- 학습용 98,845건 + 외부 평가용 홀드아웃 2,006건
- 라벨 20종 3티어 / BIO 41 클래스
- 시드
42, 검증자릿수 정책invalid, 사용 티어[1, 2, 3] - 포맷: JSONL.
{id, text, spans:[{start,end,label,value}], meta} - 이 레포의
NERPreprocessorspan 포맷과 동일해 학습 경로 수정 없이 사용 가능
1-1. 이 데이터셋으로 학습한 모델
`seongyeon1/ko-pii-ner-roberta-base` (klue/roberta-base 파인튜닝, CC-BY-SA-4.0)
학습에 한 번도 쓰이지 않은 KDPII 공식 test split 기준 F5 0.9344. 내부 test 전체 F5는 0.9937이지만 그 절반 이상이 합성 구간이고 거기서 F1이 0.9994라, 그 수치는 실제 성능이 아니다. 자세한 내용은 모델 카드를 참고할 것.
1-2. 불러오기
from datasets import load_dataset
ds = load_dataset("seongyeon1/ko-pii-ner-100k")
print(ds["train"][0])
# {"id": "kopii-l3c-000123",
# "text": "...",
# "spans": [{"start": 12, "end": 26, "label": "RRN", "value": "900101-1234567"}],
# "meta": {"layer": "L3", "domain": "medical", ...}}span은 문자 offset 기준이며 text[start:end] == value가 전체 레코드에서 100% 성립한다.
1-3. 평가용 split — test_kdpii
KDPII가 공식 지정한 test split을 그대로 뺀 2,006건(span 3,895개)이다. 학습·검증·내부 test 어디에도 들어가지 않으며, 빌드 시 본 split과의 텍스트 해시 교집합이 0인지 검사한다.
KDPII를 쓰는 다른 연구와 같은 평가셋에서 비교하려면 이 split을 쓸 것. test.jsonl은 합성 레이어가 절반을 넘어 실제 성능을 과대평가한다.
2. 구성
레이어별 분포
도메인별 분포 (train)
3. 라벨 분포
티어별 합계
4. 생성 방법
python script/build_ko_pii_dataset.py --config configs/ko_pii_dataset.yaml시드 42 고정으로 완전히 재현된다. 레이어별 목표 수량:
l1: 4,500
l1b: 15,000
l2: 21,000
l3_composed: 51,500
l3_template: 2,000
l4: 6,000빌드는 다음 검증 게이트를 모두 통과해야만 파일을 쓴다.
- offset 무결성
text[start:end] == value— 100% (PiiRecord생성 시 강제) - span 겹침 0건 (
PiiRecord생성 시 강제) - 라벨 화이트리스트 (
KoPiiLabel타입으로 구조적 보장) - split 간 텍스트 누수 0건 — 대화 ID·조합 ID 단위 분리
- 근접중복률 ≤ 5%
- Tier 1 각 엔티티 train ≥ 3,000 / test ≥ 300
- 무-PII 문서 비율 5~10%
5. 라이선스와 귀속
본 데이터셋은 CC-BY-4.0을 따른다. 원본 두 소스가 모두 CC-BY-4.0이므로 파생물도 동일하며, 원저작자 귀속 표기가 의무다.
- KDPII — KDPII: A New Korean Dialogic Dataset for the Deidentification of Personally Identifiable Information, IEEE Access, 2024. Zenodo DOI 10.5281/zenodo.10968609. CC-BY-4.0
- ai4privacy — `pii-masking-openpii-1.5m`, Copyright (c) 2026 Ai Suisse SA. CC-BY-4.0
6. 안전 고지
- 모든 PII 값은 합성이다. 실제 개인정보는 어떤 경로로도 포함되지 않는다.
- 주민등록번호·사업자등록번호·카드번호는 검증자릿수가 의도적으로 틀리다 (
checksum: invalid). 자릿수·구분자·앞자리 규칙은 실제와 같지만 실제 번호로는 사용할 수 없다. 검증식까지 유효한 값을 대량 생성하면 실존 인물의 번호와 구조적으로 구분되지 않기 때문이다. - 주소는 시·도·시군구까지만 실제 지명이고 도로명·건물번호·상세주소는 조합 생성이다. 시·도와 시군구는 실제 행정구역 관계로 묶여 있어 '충청북도 종로구' 같은 조합이 나오지 않는다.
- L2의 원본 PII 값(기계번역 산물)은 전부 폐기되고 한국 포맷으로 새로 생성된 값으로 대체되었다.
7. 한계
- 합성 구간과 실제 발화의 성능 격차가 크다. 이 데이터로 학습한 모델을
test.jsonl로 재면 합성 구간 F5가 0.999에 붙지만, 실제 발화(test_kdpii)에서는 0.93 수준이다. 서로 다른 베이스 모델 두 종에서 동일하게 재현됐다. `test.jsonl` 전체 수치를 실제 성능으로 인용하지 말 것. - ai4privacy 한국어는 21,225건이 상한이다. train split 1,309,912행을 전수 스캔한 결과 정확히 21,225건이었고, 20만 행 지점 이후로는 한 건도 늘지 않았다. 데이터셋이 언어별로 블록 정렬되어 있어 한국어가 앞쪽에 몰려 있다. L2를 21,000건으로 맞추고 부족분은 합성으로 채웠다.
- L2는 기계번역 기반 문맥이라 문체가 다소 정형적이다. 문장 구조는 원본을 따르고 PII 값만 한국화했다.
- 템플릿형 합성(L3 템플릿)은 고유 문맥이 82개뿐이다. 손으로 쓴 템플릿 50종은 PII 값만 바뀌므로 소량(2,000건)만 섞었고, 주력은 문장 조각 조합형(51,500건)이다. 조합형은 도메인당 1억 7천만 조합을 갖는다.
- Tier 3(준식별자)은 문맥 의존적이라 라벨 경계가 Tier 1·2보다 모호하다.
configs/ko_pii_dataset.yaml의tiers: [1, 2]로 제외할 수 있다. - 512 토큰 초과로 잘리는 span 비율: 0.019% (train 20% 표본, klue/roberta-large, max_length=512).
- KDPII는 대화체라 문체 폭이 좁고, 합성 레이어는 문서·서식 위주다. 실사용 분포와 완전히 같지는 않다.
