| --- |
| language: |
| - ko |
| pipeline_tag: token-classification |
| tags: |
| - korean |
| - ner |
| - pii |
| - kpfbert |
| license: mit |
| base_model: KPF/KPF-bert-ner |
| datasets: |
| - townboy/korean-pii-dataset |
| metrics: |
| - precision |
| - recall |
| - f1 |
| model-index: |
| - name: KPF-BERT Korean PII NER |
| results: |
| - task: |
| type: token-classification |
| name: Korean PII NER |
| dataset: |
| name: Private synthetic final holdout |
| type: synthetic |
| metrics: |
| - type: f1 |
| value: 0.8642728407 |
| name: Micro F1 |
| - type: precision |
| value: 0.7965755175 |
| name: Micro precision |
| - type: recall |
| value: 0.9445454545 |
| name: Micro recall |
| --- |
| |
| # KPF-BERT Korean PII NER |
|
|
| ํ๊ตญ์ด ๋ฌธ์ฅ์์ 33์ข
์ ๊ฐ์ธ์ ๋ณด(PII)๋ฅผ ๋ฌธ์ span ๋จ์๋ก ํ์งํ๋๋ก `KPF/KPF-bert-ner`๋ฅผ ํ์ธํ๋ํ BERT ํ ํฐ ๋ถ๋ฅ ๋ชจ๋ธ์
๋๋ค. |
|
|
| ## ๋ชจ๋ธ ๊ฐ์ |
|
|
| | ํญ๋ชฉ | ๊ฐ | |
| |---|---| |
| | ๊ธฐ๋ฐ ๋ชจ๋ธ | `KPF/KPF-bert-ner` | |
| | ๊ตฌ์กฐ | BERT token classification | |
| | ์ถ๋ ฅ | BIO ํ๊น
| |
| | PII ์ ํ | 33 | |
| | BIO ๋ผ๋ฒจ | 67 (`O` ํฌํจ) | |
| | ์ต๋ ์
๋ ฅ ๊ธธ์ด | 512 ํ ํฐ | |
| | ํ์ต ๋ฐ์ดํฐ | `townboy/korean-pii-dataset` | |
|
|
| ์ ์ฒด ๋ผ๋ฒจ ๋งคํ์ `config.json`๊ณผ `label_map.json`์์ ํ์ธํ ์ ์์ต๋๋ค. ์ค์ ํ์ต๋ ํ๋ผ๋ฏธํฐ๋ `model.safetensors`์ ๋ค์ด ์์ต๋๋ค. |
|
|
| ## ๋ผ์ด์ ์ค ๋ฐ ์ถ์ฒ |
|
|
| ์ด ์ ์ฅ์์ ํ์ธํ๋ ๊ฒฐ๊ณผ๋ฌผ๊ณผ ํจ๊ป ์ ๊ณต๋๋ ๋ฉํ๋ฐ์ดํฐยทํ์ฒ๋ฆฌ ์ฝ๋๋ MIT License๋ก ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ธ์ `KPF/KPF-bert-ner`๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ธํ๋ํ์ต๋๋ค. KPF ์๋ณธ ํ๋ก์ ํธ์ ๋ผ์ด์ ์ค์ ์ถ์ฒ๋ฅผ ํจ๊ป ํ์ธํด์ผ ํ๋ฉฐ, ์๋ณธ KPF-BERT ํ๋ก์ ํธ๋ MIT License๋ฅผ ํ์ํ๊ณ ์์ต๋๋ค. |
|
|
| ๋ฐ๋ผ์ ์ด ํ์ธํ๋ ๋ชจ๋ธ์ MIT License ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฌ์ฉยท์์ ยท์ฌ๋ฐฐํฌยท์์
์ ์ด์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฌ๋ฐฐํฌ ์ ์ด ์ ์ฅ์์ `LICENSE`์ `NOTICE`, ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ฐ ํ๋ก์ ํธ์ ์ ์๊ถยท๋ผ์ด์ ์ค ๊ณ ์ง๋ฅผ ํจ๊ป ์ ์งํด์ผ ํฉ๋๋ค. |
|
|
| - ๊ธฐ๋ฐ ๋ชจ๋ธ: [KPF/KPF-bert-ner](https://huggingface.co/KPF/KPF-bert-ner) |
| - ์๋ณธ ํ๋ก์ ํธ ๋ฐ ๋ผ์ด์ ์ค: [KPF-bigkinds/BIGKINDS-LAB](https://github.com/KPF-bigkinds/BIGKINDS-LAB) |
| - ์ด ์ ์ฅ์์ ๋ผ์ด์ ์ค ์ ๋ฌธ: `LICENSE` |
|
|
| `KPF/KPF-bert-ner` Hugging Face ์นด๋์๋ ๋ณ๋์ ๋ผ์ด์ ์ค ๋ฉํ๋ฐ์ดํฐ๊ฐ ํ์๋์ง ์์ผ๋ฏ๋ก, ๋ฐฐํฌยท์์
์ ์ด์ฉ ์ ์๋ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์ต์ ์กฐ๊ฑด์ ์ง์ ํ์ธํด์ผ ํฉ๋๋ค. ์ด ์ ์ฅ์์ ๋ผ์ด์ ์ค ํ์๋ ์ ๊ฐ ์ถ๊ฐํ ํ์ธํ๋ ์ฐ์ถ๋ฌผ์ ๋ํ ๊ฒ์ด๋ฉฐ, ๊ธฐ๋ฐ ๋ชจ๋ธ์ ๊ถ๋ฆฌ๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. |
|
|
| ## License |
|
|
| The original fine-tuning artifacts, metadata, and auxiliary code in this repository are released under the MIT License. See [`LICENSE`](./LICENSE) and [`NOTICE`](./NOTICE). This model is a derivative of `KPF/KPF-bert-ner`; users must also comply with the applicable terms of the upstream model. |
|
|
| Accordingly, this fine-tuned model may be used, modified, redistributed, and used commercially under the MIT License, provided that the copyright and license notices in `LICENSE`, `NOTICE`, and the upstream projects are retained. |
|
|
| ## ์ฌ์ฉ๋ฒ |
|
|
| ```python |
| from transformers import AutoModelForTokenClassification, AutoTokenizer, pipeline |
| |
| model_id = "townboy/kpfbert-ner" |
| tokenizer = AutoTokenizer.from_pretrained(model_id) |
| model = AutoModelForTokenClassification.from_pretrained(model_id) |
| |
| ner = pipeline( |
| "token-classification", |
| model=model, |
| tokenizer=tokenizer, |
| aggregation_strategy="simple", |
| ) |
| |
| text = "ํ์ ์ด๋ฆ์ ํ๊ธธ๋์ด๊ณ ์ด๋ฉ์ผ์ hong@example.com์
๋๋ค." |
| print(ner(text)) |
| ``` |
|
|
| 512 ํ ํฐ์ ๋๋ ์
๋ ฅ์ ๋ฌธ์ฅ ๊ฒฝ๊ณ๋ ๊ฒน์น๋ window ๋จ์๋ก ๋๋ ์ถ๋ก ํ ๋ค ์๋ฌธ ์์น๋ก ํฉ์ณ์ผ ํฉ๋๋ค. ๋จ์ํ ๋ท๋ถ๋ถ์ ์๋ผ๋ด๋ฉด ํด๋น ๋ถ๋ถ์ PII๋ฅผ ํ์งํ ์ ์์ต๋๋ค. |
|
|
| ### ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ์ ์ธ๊ตญ์ธ๋ฑ๋ก๋ฒํธ ์ ๊ทํ |
|
|
| ๋ชจ๋ธ์ ์ฑ๋ณยท์ธ๊ธฐ ์ฝ๋๊ฐ ๋ฌธ๋งฅ ๋จ์ด์ ์ถฉ๋ํ๋ counterfactual ์์๋ ํ์ตํ์ต๋๋ค. ๊ทธ๋๋ ๊ตฌ์กฐ๊ฐ ๋ช
ํํ 13์๋ฆฌ ๋ฒํธ๋ ํ๋ฅ ๋ชจ๋ธ์๋ง ๋งก๊ธฐ์ง ์๊ณ 7๋ฒ์งธ ์ซ์๋ก ์ต์ข
๋ผ๋ฒจ์ ์ ๊ทํํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. `korean_id_postprocess.py`๊ฐ ์ ์ฒด span์ ํฉ์น๊ณ ์ฝ๋ `1`~`4`๋ฅผ `RRN`, `5`~`8`์ `ALIEN_NUMBER`๋ก ๋ณด์ ํฉ๋๋ค. |
|
|
| ```python |
| from korean_id_postprocess import normalize_korean_id_entities |
| |
| raw_entities = ner(text) |
| entities = normalize_korean_id_entities(text, raw_entities) |
| ``` |
|
|
| ์ด ์ ๊ทํ๋ ๋ฒํธ ์ข
๋ฅ๋ง ํ๋ณํฉ๋๋ค. ์ค์ ์ ํจ์ฑ์ ๋ณ๋์ ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธยท์ธ๊ตญ์ธ๋ฑ๋ก๋ฒํธ ์ฒดํฌ์ฌ ๊ฒ์ฆ์ ํจ๊ป ์ ์ฉํด์ผ ํฉ๋๋ค. |
|
|
| ์ง์ ๋ชจ๋ธ ํ๊ท ํ
์คํธ์์๋ ๋ฌธ๋งฅ ๋จ์ด๊ฐ ๋ฒํธ ์ฝ๋์ ์ถฉ๋ํ๋ 4๊ฐ ์ฌ๋ก๋ฅผ ๋ชจ๋ ํต๊ณผํ๊ณ , ์ฒดํฌ์ฌ์ด ์ ํจํ ๋ฌด๋ผ๋ฒจ ๋ช
๋จ์ ์ด๋ฆยท๋ฒํธ 8๊ฐ๋ ๋ชจ๋ ํ์งํ์ต๋๋ค. 499ํ ํฐ ์
๋ ฅ ๋์ ๋ฒํธ ์ญ์ ํ์งํ์ต๋๋ค. ์์ธ ๊ฒฐ๊ณผ์ ์๋์ ์ผ๋ก ์๋ชป ๋ง๋ ๋ฒํธ์ ๋ํ ํ๊ณ๋ `korean_id_regression_results.json`์ ๊ธฐ๋กํ์ต๋๋ค. |
|
|
| ## ํ์ต |
|
|
| - ํ์ต ๋ฌธ์: 9,227 |
| - Validation ๋ฌธ์: 1,510 |
| - ์ต์ข
counterfactual ์ ์ : 1 epoch, learning rate `5e-6` |
| - ์ผ๋ฐ ๋ผ๋ฒจ ์์ ํ: 1 epoch, learning rate `1e-6` |
| - Effective batch size: 32 |
| - ์ต๋ ๊ธธ์ด: 512 |
| - Loss: standard cross-entropy |
| - Validation micro-F1: `0.996463` |
|
|
| ๋ง์ง๋ง ์ ์ ํ์ต์ class-weighted loss๊ฐ ์๋๋ผ ํ์ค cross-entropy๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์ด๋ ๋ชจ๋ธ ๊ฐ์ค์น๊ฐ ๋น ์ก๋ค๋ ์๋ฏธ๊ฐ ์๋๋๋ค. ํ์ต๋ ๋ชจ๋ธ ๊ฐ์ค์น๋ `model.safetensors`์ ์์ผ๋ฉฐ, class weight๋ ํ์ต ์ค loss์๋ง ์ ์ฉ๋๋ ์ ํ ์ค์ ์
๋๋ค. ์์ธ ๊ฐ์ `training_config.json`๊ณผ `training_provenance.json`์ ์์ต๋๋ค. |
|
|
| ์ ์ฅ์์ `class_weights.json`์ ์ด์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ํผ๋ํ์ง ์๋๋ก ๋จ๊ฒจ ๋ ํธํ์ฑ ์๋ด ํ์ผ์
๋๋ค. ์ต์ข
๋ชจ๋ธ ํ์ต์๋ class weight๋ฅผ ์ ์ฉํ์ง ์์์ต๋๋ค. |
|
|
| ## ์ต์ข
ํ๊ฐ ๋ฐฉ๋ฒ |
|
|
| ๊ณต๊ฐ ํ์ต corpus ๋ฐ ์๊ณ๊ฐ ๋ณด์ ์ธํธ์ ํ
ํ๋ฆฟยท๊ฐ์ด ๊ฒน์น์ง ์๋ ๋ณ๋ ํฉ์ฑ holdout 1,320๋ฌธ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค. |
|
|
| - ๋ผ๋ฒจ๋ณ ์ ๋ต PII span: 100๊ฐ |
| - ์ ์ฒด ์ ๋ต span: 3,300๊ฐ |
| - ๋งค์นญ: ๋ผ๋ฒจยท๋ฌธ์ ์์ยท๋ฌธ์ ๋์ด ๋ชจ๋ ๊ฐ์ exact span |
| - Confidence: span์ ๊ตฌ์ฑํ๋ ํ ํฐ ํ๋ฅ ์ ์ต์๊ฐ |
| - ํ๊ฐ ์
๋ ฅ ์ต๋ ๊ธธ์ด: 512 |
| - ์ด holdout์ ์ต์ข
๋ชจ๋ธ์ ํ ๋ฒ๋ง ์ฌ์ฉํ์ต๋๋ค. |
|
|
| | ์งํ | Precision | Recall | F1 | |
| |---|---:|---:|---:| |
| | Macro | 0.8435 | 0.9445 | 0.8834 | |
| | Micro | 0.7966 | 0.9445 | 0.8643 | |
|
|
| ์ด ์ ์๋ ๋ฌธ์ฅ๋น PII ํ๋์ ์งง์ ์ ํ ๋ฌธ์ฅ ์ค์ฌ์ validation ์ ์๋ณด๋ค ํจ์ฌ ์๊ฒฉํ ์กฐ๊ฑด์์ ์ธก์ ํ์ต๋๋ค. ํยท๋ชฉ๋กยทCSVยทJSON, ๋ผ๋ฒจ ์๋ด์ด๊ฐ ์๋ ๋ฌธ์ฅ, ์ฌ๋ฌ ์ฌ๋๊ณผ ์ฌ๋ฌ PII๊ฐ ํจ๊ป ๋ฑ์ฅํ๋ ๊ธด ๋ฌธ์๋ฅผ ํฌํจํฉ๋๋ค. |
|
|
| ## ๋ผ๋ฒจ๋ณ ์ต์ข
์ฑ๋ฅ |
|
|
| | Label | Precision | Recall | F1 | |
| |---|---:|---:|---:| |
| | ACCOUNT_NUMBER | 0.821 | 0.870 | 0.845 | |
| | ADDRESS | 0.874 | 0.900 | 0.887 | |
| | AGE | 0.893 | 1.000 | 0.943 | |
| | ALIEN_NUMBER | 0.907 | 0.970 | 0.937 | |
| | BIRTHDATE | 0.980 | 1.000 | 0.990 | |
| | BLOOD_TYPE | 0.672 | 0.860 | 0.754 | |
| | CARD_NUMBER | 0.870 | 1.000 | 0.930 | |
| | CITY | 1.000 | 1.000 | 1.000 | |
| | DEPARTMENT | 0.958 | 0.920 | 0.939 | |
| | DRIVER_LICENSE | 0.833 | 0.900 | 0.865 | |
| | EMAIL | 0.926 | 1.000 | 0.962 | |
| | EMPLOYEE_ID | 0.633 | 1.000 | 0.775 | |
| | GENDER | 0.908 | 0.990 | 0.947 | |
| | HEIGHT | 0.882 | 0.970 | 0.924 | |
| | IP_ADDRESS | 0.797 | 0.940 | 0.862 | |
| | MAJOR | 0.893 | 1.000 | 0.943 | |
| | MEMBER_ID | 0.887 | 0.940 | 0.913 | |
| | NAME | 0.798 | 0.990 | 0.884 | |
| | NATIONALITY | 1.000 | 1.000 | 1.000 | |
| | NICKNAME | 0.262 | 0.710 | 0.383 | |
| | PARTICIPANT_ID | 0.405 | 0.980 | 0.573 | |
| | PASSPORTNUM | 0.990 | 0.990 | 0.990 | |
| | PHONE | 0.990 | 1.000 | 0.995 | |
| | POSITION | 0.786 | 0.990 | 0.876 | |
| | RELIGION | 1.000 | 0.800 | 0.889 | |
| | RRN | 0.912 | 0.930 | 0.921 | |
| | SCHOOL | 0.980 | 1.000 | 0.990 | |
| | URL | 0.826 | 0.900 | 0.861 | |
| | USER_ID | 0.715 | 0.880 | 0.789 | |
| | VEHICLE_NUMBER | 0.807 | 0.880 | 0.842 | |
| | WEIGHT | 0.883 | 0.980 | 0.929 | |
| | WORKPLACE | 0.907 | 0.980 | 0.942 | |
| | ZIPCODE | 0.841 | 0.900 | 0.870 | |
| |
| ๊ณ์ฐ์ ์ฌ์ฉํ TP/FP/FN๊ณผ ์ ์ฒด ์์์ ๊ฐ์ `per_label_metrics.json`, ์์ ํ๊ฐ ๊ฒฐ๊ณผ๋ `raw_evaluation_results.json`์ ์์ต๋๋ค. |
| |
| ## Confidence ์๊ณ๊ฐ |
| |
| `label_thresholds.json`๊ณผ `threshold_policy.json`์๋ ๋ณ๋์ ํฉ์ฑ calibration ์ธํธ 3,960๋ฌธ์์์ ๊ณ์ฐํ ๋ผ๋ฒจ๋ณ low/high ๊ฐ์ด ์์ต๋๋ค. ์ด ๊ฐ์ ๋ชจ๋ธ F1 ์์ฒด๊ฐ ์๋๋ผ ์์ธก confidence๋ฅผ ํ์ ์ฒ๋ฆฌํ ๋ ์ฐธ๊ณ ํ๋ ๋ณด์์ ์ ์ฑ
์
๋๋ค. |
| |
| ๊ธฐ์กด ๊ฒฝ๋ก์ธ `label_thresholds_calibration_v1.json`์ ์ญ์ ํ์ง ์๊ณ ์ ํ์ผ ์์น๋ฅผ ์๋ ค ์ฃผ๋ ํธํ์ฑ ์๋ด ํ์ผ๋ก ์ ์งํฉ๋๋ค. ์ค์ ์๊ณ๊ฐ์ ๋ฐ๋์ `label_thresholds.json` ๋๋ `threshold_policy.json`์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. |
|
|
| ์ด๊ธฐ ์ ์ฑ
์์๋ low ๋ฏธ๋ง ํ๋ณด๋ ์๋ ํ๊ธฐํ์ง ์์ต๋๋ค. Calibration์์ ์๊ฒฉํ ์กฐ๊ฑด์ ํต๊ณผํ `EMAIL`, `NATIONALITY`, `SCHOOL`๋ง `0.999` ์ด์์์ ์๋ ์ฑํ ๋์์ผ๋ก ํ์ํ๊ณ , ๋๋จธ์ง๋ ์ถ๊ฐ ๊ฒํ ๊ฐ ํ์ํ ํ๋ณด๋ก ๋ก๋๋ค. ์ ๋
๋ฆฝ ์ต์ข
holdout์์ ์ด ์๋ ์ฑํ ๊ตฌ๊ฐ์ FP๋ 0๊ฑด์ด์์ต๋๋ค. ์ด์ ๋ถํฌ์์ ๋ก๊ทธ์ ์ ๋ต์ด ์ถฉ๋ถํ ์์ด๊ธฐ ์ ๊น์ง low ๊ฐ๋ง ๋ณด๊ณ ํ์ง ํ๋ณด๋ฅผ ํ๊ธฐํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. |
|
|
| ## ํ๊ณ |
|
|
| - ํ์ต ๋ฐ ํ๊ฐ ๋ฐ์ดํฐ๊ฐ ํฉ์ฑ์ด๋ฏ๋ก ์ค์ ๊ฐ์ธ์ ๋ณด, RAG ์๋ต, OCR ๋ฌธ์, ์
๋ฌด ๋๋ฉ์ธ์ ์ฑ๋ฅ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. |
| - `NICKNAME`, `PARTICIPANT_ID`, `BLOOD_TYPE`, `EMPLOYEE_ID`, `USER_ID`๋ ์ต์ข
holdout์์ ์๋์ ์ผ๋ก ๋ฎ์์ต๋๋ค. ํนํ `NICKNAME`์ raw F1์ `0.383`์ด๋ฏ๋ก ์๋ ํ์ ์ ์ฌ์ฉํ๋ฉด ์ ๋ฉ๋๋ค. |
| - ์ด๋ฆยท์์ยท์ง๊ธ์ฒ๋ผ ํํ๊ฐ ๊ณ ์ ๋์ง ์์ PII๋ ๋ฌธ๋งฅ๊ณผ ๋๋ฉ์ธ์ ์ํฅ์ ๋ง์ด ๋ฐ์ต๋๋ค. |
| - ์ ๊ท์ยท์ฒดํฌ์ฌ์ผ๋ก ํ๋ณ ๊ฐ๋ฅํ ๊ตฌ์กฐ์ PII๋ NER ๊ฒฐ๊ณผ์ ๋ณ๋๋ก ๊ฒ์ฆํ๋ ๊ฒ์ด ์ข์ต๋๋ค. |
| - 512 ํ ํฐ๋ณด๋ค ๊ธด ๋ฌธ์๋ window ์ถ๋ก ์ด ํ์ํฉ๋๋ค. |
| - ๋ชจ๋ธ ํ๋๋ง์ผ๋ก ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ ๋ฒ์ ์ค์๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค. |
|
|