becleverksh commited on
Commit
bf05597
ยท
verified ยท
1 Parent(s): 3fe55d7

Upload MoAI-Privacy-Filter v3 final-bf16

Browse files
README.md CHANGED
@@ -13,63 +13,86 @@ tags:
13
  - privacy
14
  - pii-masking
15
  - korean
 
16
  - finance
 
 
 
17
  - bioes
18
  - viterbi
19
  - mixture-of-experts
20
  datasets:
21
- - BCCard/pii-masking-openpii-finance
22
  metrics:
23
- - f1
24
  - precision
25
  - recall
 
26
  ---
27
 
28
- # 1. Overview
29
- A Korean/English **PII detection model for the finance domain**, built by full fine-tuning [`openai/privacy-filter`](https://huggingface.co/openai/privacy-filter) (1.4B MoE, 50M active) on synthetic finance-domain PII data. It tags **18 PII entity types** (73 BIOES classes) at token level and is intended as the **NER layer of a multi-layer PII-masking gateway** in front of LLM services, as well as a PII detection component for offline privacy review and audit workflows.
30
-
31
- On held-out validation it reaches **strict span-F1 0.956 (ko) / 0.969 (en)**. On an independent, adversarially-hardened Golden Set it holds **0.944 (ko) / 0.907 (en)** with **masking coverage 0.996 (ko) / 0.998 (en)** โ€” i.e. โ‰ฅ99.5% of gold PII characters are covered by predicted spans.
32
-
33
- ## 1.1. TL;DR
34
- * **Base model**: [`openai/privacy-filter`](https://huggingface.co/openai/privacy-filter) โ€” 1.4B-parameter MoE (128 experts, 50M active), 8 layers, hidden 640, bidirectional banded attention (ยฑ128), o200k tokenizer
35
- * **Domain / Language**: Finance (BC Card โ€” cards, accounts, national IDs, customer service text) / Korean + English
36
- * **Task**: Token classification (BIOES) โ†’ character-offset PII spans โ†’ masking
37
- * **Labels (18)**: `PERSON`, `RRN`, `FRN`, `CARD_NUMBER`, `ACCOUNT_NUMBER`, `SECRET`, `USER_ID`, `EMAIL`, `PHONE`, `PASSPORT`, `DRIVER_LICENSE`, `GENERIC_ID`, `ADDRESS`, `ZIPCODE`, `DATE`, `CARD_EXPIRY`, `CVC`, `IPIN`
38
- * **Method**: Full fine-tuning (all parameters incl. experts & router) with a re-initialized 73-class head (rows copied from the base head by taxonomy mapping)
39
- * **Decoding**: constrained BIOES Viterbi (not per-token argmax) + whitespace span refinement โ€” the bundled `viterbi_calibration.json` exposes precisionโ†”recall operating-point biases without retraining
40
- * **Format**: BF16 (attention `sinks` kept FP32), single safetensors + tokenizer + label taxonomy + Viterbi calibration sidecar
41
- * **Sequence length**: trained on sequences โ‰ค 768 tokens โ€” chunk longer inputs
42
- * **Intended use**:
43
- 1. In-house PII masking gateway (detect โ†’ mask before text reaches an LLM)
44
- 2. Offline privacy review and audit support (PII discovery in stored text, logs and documents)
45
-
46
- ## 1.2. Label Taxonomy (N=18)
47
- The 18 labels re-map the upstream ai4privacy source labels to the granularity a Korean financial masking policy needs - merging fragments into single spans (`GIVENNAME`/`SURNAME` โ†’ `PERSON`, `CITY`/`STREET`/`BUILDINGNUM` โ†’ `ADDRESS`) and adding Korea-specific classes absent upstream (`RRN`, `FRN`, `IPIN`, `CARD_EXPIRY`, `CVC`, `SECRET`). `data source` records the row-source buckets in which each label occurs: `ko` means `openpii-1.5m-ko`, `en` means `openpii-1.5m-en`, and `domain` means locally synthesized rows.
48
-
49
- | label | description | data source |
50
- |-------|-------------|-------------|
51
- | `PERSON` | full name (surname + given, single span) | ko, en, domain |
52
- | `RRN` | resident registration number (Korea) | ko, domain |
53
- | `FRN` | foreign registration number (Korea) | domain |
54
- | `CARD_NUMBER` | credit/debit card PAN | ko, en, domain |
55
- | `ACCOUNT_NUMBER` | bank account number | ko, domain |
56
- | `SECRET` | auth secret (password / API key / token) | ko, domain |
57
- | `USER_ID` | online member ID | ko, en, domain |
58
- | `EMAIL` | email address | ko, en, domain |
59
- | `PHONE` | phone number (mobile / landline) | ko, en, domain |
60
- | `PASSPORT` | passport number | ko, en, domain |
61
- | `DRIVER_LICENSE` | driver's license number | ko, en, domain |
62
- | `GENERIC_ID` | generic identifier without a more specific taxonomy class | ko, en, domain |
63
- | `ADDRESS` | address (city / street / building, single span) | ko, en, domain |
64
- | `ZIPCODE` | postal code | ko, en, domain |
65
- | `DATE` | date / time | ko, en, domain |
66
- | `CARD_EXPIRY` | card expiry date | domain |
67
- | `CVC` | card verification code | domain |
68
- | `IPIN` | I-PIN number (Korea only) | domain |
69
-
70
- Each entity type has `B-`, `I-`, `E-` and `S-` boundary classes, plus the background class `O`. This yields 73 output classes.
71
-
72
- ## 1.3. Usage
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
  ```python
75
  import torch
@@ -80,21 +103,26 @@ tokenizer = AutoTokenizer.from_pretrained(model_id)
80
  model = AutoModelForTokenClassification.from_pretrained(model_id)
81
  model.eval()
82
 
83
- text = "๊ณ ๊ฐ ๋ชจ์•„์ด๋‹˜(000000-0000000)๊ป˜์„œ 010-0000-0000๋กœ ์—ฐ๋ฝ ์š”์ฒญํ•˜์…จ์Šต๋‹ˆ๋‹ค."
84
- enc = tokenizer(text, return_offsets_mapping=True, add_special_tokens=False, return_tensors="pt")
85
- offsets = enc.pop("offset_mapping")[0].tolist()
 
 
 
 
 
 
 
86
 
87
  with torch.no_grad():
88
- logits = model(**enc).logits.float() # [B, T, 73]
89
 
90
- # Decode logits[0] with constrained BIOES Viterbi and map token tags through offsets.
91
- print(tuple(logits.shape))
92
  ```
93
 
94
- Raw logits shape and decoded spans:
95
 
96
  ```text
97
- (1, 30, 73)
98
  [
99
  {'start': 3, 'end': 6, 'label': 'PERSON'},
100
  {'start': 8, 'end': 22, 'label': 'RRN'},
@@ -102,135 +130,136 @@ Raw logits shape and decoded spans:
102
  ]
103
  ```
104
 
105
- The offsets use Python's half-open character interval `[start, end)`. Masking is downstream policy logic. For example, the spans above can produce:
106
 
107
  ```text
108
  ๊ณ ๊ฐ [PERSON]๋‹˜([RRN])๊ป˜์„œ [PHONE]๋กœ ์—ฐ๋ฝ ์š”์ฒญํ•˜์…จ์Šต๋‹ˆ๋‹ค.
109
  ```
110
 
111
- For batches, enable right padding and pass only `input_ids` and `attention_mask` to the model. `offset_mapping` stays outside the model and is used only to map decoded token tags back to the original text. Convert logits to FP32 before constrained Viterbi decoding, as shown above.
 
 
 
 
 
 
 
 
112
 
113
- > **Decoding note** - this model, like its base, is trained with a supervised token-level BIOES classification objective and is intended to be decoded with **constrained Viterbi** over the BIOES transition grammar, not independent per-token argmax. Independent argmax can emit invalid BIOES sequences and is not the decoding path used for the reported metrics. The bundled `viterbi_calibration.json` follows the upstream operating-point schema. Its six transition biases allow users to adjust the precision-recall trade-off without retraining. All-zero biases mean no additive operating-point adjustment; BIOES transition constraints remain active.
 
 
114
 
115
- ## 1.4. Training Data
116
  | Dataset | Role | Size |
117
- |---------|------|------|
118
- | (Public) [BCCard/pii-masking-openpii-finance](https://huggingface.co/datasets/BCCard/pii-masking-openpii-finance) (v2) | Training / Validation | ~58.5k train rows ยท ~14.5k validation rows |
119
- | (Private) BCCard/pii-masking-openpii-finance-test (v2) | Golden Set (release evaluation; not used for training/tuning) | 2,000 rows (ko 1,460 / en 540) |
 
120
 
121
- * Sources: curated Korean subset of `ai4privacy/pii-masking-openpii-1.5m` (label taxonomy remapped, name spans merged & naturalized) + finance-domain synthetic templates + **~30% English replay** (catastrophic forgetting guard)
122
- * Hard-example design baked into v2: surface-similar non-PII decoys (FP suppression), label-confusion pairs in one sentence (RRNโ†”FRN, DRIVER_LICENSEโ†”GENERIC_ID), weak-context true PII (FN suppression), long-span address boundary variants
123
- * All values are synthetic; validity-pattern collisions with real identifiers are removed at generation time (e.g. card numbers are forced to fail Luhn)
124
 
125
- ## 1.5. Training Procedure
126
- | Item | Value |
127
- |------|-------|
128
- | Method | Full fine-tuning (1.4B params โ€” experts and router included) |
129
- | Head | 33-class base head โ†’ 73-class head, initialized by copying base rows via taxonomy mapping |
130
- | Loss | Token-level cross-entropy |
131
- | Batch | effective 16 (per-device ร— world ร— accum), fixed across hardware layouts |
132
- | LR / scheduler | 1e-4 / linear decay, warmup 3% |
133
- | Optimizer | AdamW (fused), weight decay 0.0, max_grad_norm 1.0 |
134
- | Epochs | 5 โ€” best checkpoint by validation span micro-F1, decoded with the same constrained Viterbi as deployment |
135
- | Precision | FP32 master weights + BF16 autocast; MoE router/experts explicitly kept FP32 during compute |
136
- | Hardware | 1ร— NVIDIA H100 (~5h) |
137
 
138
  <div align="center">
139
- <img src="figures/evaluation-train-1-1.png" alt="Training loss, learning-rate and gradient-norm curves for the v1 and v2 models" >
140
  </div>
141
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  <div align="center">
143
- <img src="figures/evaluation-test-1-1.png" alt="Training-time validation metric curves for the v1 and v2 models" >
144
  </div>
145
 
146
- <br>
147
-
148
- # 2. Evaluation
149
- ## 2.1. Setup
150
- * **Golden Set**: independently generated 2,000-row test set (ko 1,460 / en 540), **adversarially hardened** โ€” weak-context PII, decoys, confusion pairs and boundary variants are deliberately over-represented, so scores here read *lower* than typical in-distribution synthetic benchmarks
151
- * **Protocol**: strict exact-match span P/R/F1 (CoNLL-style; boundary and label must both match) + **masking coverage** (share of gold PII *characters* covered by predicted spans, label-agnostic โ€” the leakage-oriented metric)
152
- * **Decoding**: constrained Viterbi + whitespace refinement โ€” identical to the deployment chain
153
-
154
- ## 2.2. Results
155
- ### `validation` dataset
156
- | Metric | v2 model / v2 validation |
157
- |---|---:|
158
- | micro F1 | 0.9599 |
159
- | macro F1 | 0.9603 |
160
- | ko strict micro F1 | 0.9562 |
161
- | ko macro F1 | 0.9568 |
162
- | en strict micro F1 | 0.9688 |
163
- | en macro F1 | 0.9631 |
164
- | **masking coverage** | **0.9979** |
165
- | **ko masking coverage** | **0.9987** |
166
- | **en masking coverage** | **0.9965** |
167
-
168
- **Observed masking coverage is 99.8% overall and at least 99.6% in both the Korean and English validation slices.** This leakage-oriented metric is reported as a diagnostic rather than a release gate.
169
-
170
- * These values were measured post-hoc by running the exported `final-bf16` artifact over all 14,543 v2 validation rows (ko 10,460 / en 4,083) through the deployment-equivalent chain: constrained Viterbi, actual tokenizer character offsets and whitespace refinement.
171
- * Overall micro F1 and masking coverage pool all ko/en spans or characters before scoring. Overall macro F1 pools per-label TP/FP/FN across both languages and then averages the 18 label F1 values.
172
- * Character coverage counts are ko **482,861 / 483,488** and en **264,979 / 265,898** gold PII characters.
173
- * The training-time checkpoint-selection metrics remain ko micro F1 **0.9820**, en micro F1 **0.9739** and global macro F1 **0.9764** at epoch 5. They compare entity spans on token indices, so they are not interchangeable with the character-span values above and do not include masking coverage.
174
-
175
- ### `test` dataset
176
- Independently generated Golden Set โ€” deliberately harder than validation: weak-context PII, surface-similar decoys, label-confusion pairs and long-span boundary variants are over-represented.
177
- **ฮ” = vs. the post-hoc validation baseline above** using the same `final-bf16` artifact and character-span evaluation chain. The difference measures test hardening and distribution shift, not model regression.
178
-
179
- | Metric | v2 model / v2 test | ฮ” |
180
- |---|---:|---:|
181
- | micro F1 | 0.9336 | -2.63%p |
182
- | macro F1 | 0.9308 | -2.94%p |
183
- | ko strict micro F1 | 0.9441 | -1.21%p |
184
- | ko macro F1 | 0.9416 | -1.53%p |
185
- | en strict micro F1 | 0.9065 | -6.24%p |
186
- | en macro F1 | 0.9017 | -6.14%p |
187
- | **masking coverage** | **0.9964** | -0.16%p |
188
- | **ko masking coverage** | **0.9956** | -0.31%p |
189
- | **en masking coverage** | **0.9984** | +0.18%p |
190
-
191
- * **Masking coverage stays โ‰ฅ0.9956 on the adversarial set** โ€” only 0.44% (ko) / 0.16% (en) of gold PII characters are uncovered; most strict-F1 losses are boundary or label-name errors, not leaks
192
- * **English ADDRESS holds on hard boundary variants**: strict recall **0.983** on long-span address forms (state suffixes, unit/floor tails) that are heavily represented in this set
193
- * **Weak-context person names are the main remaining leak channel**: ko `PERSON` strict recall 0.875 with 82 full-span misses (see Limitations)
194
- * Label-swap errors (e.g. en `ACCOUNT_NUMBER` predicted as `GENERIC_ID`/`CARD_NUMBER`) keep **coverage 1.0** โ€” the value is still masked; only the label name is wrong
195
-
196
- ## 2.3. Reading the numbers
197
- Strict exact-match span-F1 on an adversarial test is a deliberately harsh score: a one-character boundary miss or a swapped label counts as a full error. For diagnosing character-level exposure, masking coverage is the direct diagnostic metric: **0.44% (ko) / 0.16% (en) of gold PII characters uncovered**, concentrated in weak-context person names.
198
-
199
- <br>
200
-
201
- ## 2.4. Limitations
202
- * **One layer of defense** โ€” inherits the base model's positioning: not an anonymization or compliance guarantee. Deploy behind a regex backstop for fully structured identifiers (RRN patterns, card numbers, phones) and combine with policy-level controls.
203
- * **Weak-context person names** โ€” Korean names without honorifics/particles or list-form values are the main miss channel (ko `PERSON` recall 0.875 on the adversarial set). Consider a recall-leaning Viterbi operating point in high-sensitivity deployments.
204
- * **Alphanumeric ID confusion** โ€” `USER_ID`/`SECRET`/`GENERIC_ID`/`ACCOUNT_NUMBER` share surface forms; without cue words the label may swap (masking still applies โ€” coverage stays ~1.0).
205
- * **Synthetic-only training & evaluation** โ€” no real customer text was used or evaluated. Real-world robustness (typos, slang, OCR noise) is unvalidated; shadow-mode rollout is recommended before enforcement.
206
- * **Fixed label policy** โ€” the 18-label taxonomy is baked in at fine-tuning time; changing masking policy granularity requires re-fine-tuning (runtime keep/mask toggles must operate on these labels).
207
- * **Context window** โ€” banded attention limits each token's context to ยฑ128 tokens; trained sequence regime is โ‰ค768 tokens (chunk longer documents).
208
-
209
- <br>
210
-
211
- # 3. Future Work
212
- * **v3 data enhancements** - weak-context person-name hard positives, more diverse cue words for alphanumeric IDs, and privacy-safe failure collection from shadow-mode operation
213
- * **Operating point** - recall-leaning Viterbi transition biases tuned on validation or a dedicated calibration set without Golden Set feedback
214
- * **Serving** - target-hardware latency, throughput and memory benchmarks for the separately published INT8 weight-only ONNX artifact
215
-
216
- <br>
217
-
218
- # 4. Meta Info
219
- ## 4.1. Citation
220
  ```bibtex
221
- @misc{bccard2026moaiprivacyfilter,
222
- title = {MoAI-Privacy-Filter: A Korean Finance-Domain PII Detection Model},
223
- author = {BC Card AX Team},
224
  year = {2026},
225
  howpublished = {https://huggingface.co/BCCard/MoAI-Privacy-Filter},
226
- note = {Full fine-tune of openai/privacy-filter for Korean/English PII masking in the BC Card domain}
227
  }
228
  ```
229
 
230
- ## 4.2. See Also
231
- * **Base model**: [`openai/privacy-filter`](https://huggingface.co/openai/privacy-filter)
232
- * **INT8 ONNX artifact**: [`BCCard/MoAI-Privacy-Filter-INT8`](https://huggingface.co/BCCard/MoAI-Privacy-Filter-INT8)
233
- * **Training dataset**: [`BCCard/pii-masking-openpii-finance`](https://huggingface.co/datasets/BCCard/pii-masking-openpii-finance)
234
- * **Source data attribution**: `ai4privacy/pii-masking-openpii-1.5m` (CC-BY-4.0)
 
 
235
 
236
- <br>
 
13
  - privacy
14
  - pii-masking
15
  - korean
16
+ - english
17
  - finance
18
+ - customer-service
19
+ - security
20
+ - infrastructure
21
  - bioes
22
  - viterbi
23
  - mixture-of-experts
24
  datasets:
25
+ - BCCard/privacy-filter-openpii-masking
26
  metrics:
 
27
  - precision
28
  - recall
29
+ - f1
30
  ---
31
 
32
+ # MoAI-Privacy-Filter
33
+ `MoAI-Privacy-Filter` is a Korean and English privacy-related entity detection model built by full fine-tuning [`openai/privacy-filter`](https://huggingface.co/openai/privacy-filter). It recognizes 29 entity types and emits 117 BIOES token classes. The training data emphasizes financial services and customer-service/VOC text while also covering identity, security, and infrastructure scenarios.
34
+
35
+ The model detects entity spans but does not decide how they should be masked or retained. Applications can apply their own handling policy to each predicted label. This distinction is especially important for `PORT` and `ORGANIZATION`, which are non-PII disambiguation labels included in the output taxonomy.
36
+
37
+ On held-out validation, strict micro F1 is **0.9824 for ko** and **0.9708 for en**. On an independently generated Golden Set, strict micro F1 is **0.9732 for ko** and **0.9650 for en**.
38
+
39
+ ## 1. Model Summary
40
+
41
+ | Item | Value |
42
+ |---|---|
43
+ | Model version | v3 |
44
+ | Training dataset | [`BCCard/privacy-filter-openpii-masking`](https://huggingface.co/datasets/BCCard/privacy-filter-openpii-masking) v1 |
45
+ | Base model | [`openai/privacy-filter`](https://huggingface.co/openai/privacy-filter) |
46
+ | Architecture | Approximately 1.4B-parameter MoE, 8 layers, hidden size 640, 128 local experts, top-4 expert routing |
47
+ | Task | Token classification with BIOES span boundaries |
48
+ | Languages | Korean and English |
49
+ | Primary domains | Financial services, customer service/VOC, identity, security, and infrastructure |
50
+ | Entity labels | 29 |
51
+ | Output classes | 117 - `O` plus four BIOES classes for each entity label |
52
+ | Training sequence limit | 1024 tokens before special tokens |
53
+ | Artifact format | BF16 safetensors with 8 attention `sinks` tensors retained in FP32 |
54
+ | Tested software | Transformers 5.13.1 and PyTorch 2.13.0 |
55
+ | License | Apache 2.0 |
56
+
57
+ The model version and dataset version use independent version numbers. This model is v3 and was trained on dataset v1.
58
+
59
+ ## 2. Label Taxonomy
60
+
61
+ | Label | Definition |
62
+ |---|---|
63
+ | `PERSON` | Full personal name as one span. |
64
+ | `RRN` | Korean resident registration number. |
65
+ | `FRN` | Korean foreign resident registration number. |
66
+ | `SSN` | Social-security-number family inherited from ai4privacy `SOCIALNUM`; not limited to the US 9-digit form. |
67
+ | `GENERIC_ID` | Identity-card or tax identifier that cannot be assigned to a more specific country-level label. |
68
+ | `CARD_NUMBER` | Credit or debit card PAN. |
69
+ | `ACCOUNT_NUMBER` | Bank account number. |
70
+ | `SECRET` | Password, API key, access token, or similar authentication secret. |
71
+ | `USER_ID` | Online account or member identifier. |
72
+ | `EMAIL` | Email address, including intentionally obfuscated forms represented in the training data. |
73
+ | `PHONE` | Mobile or landline telephone number, including intentionally verbalized forms represented in the training data. |
74
+ | `PASSPORT` | Passport number. |
75
+ | `DRIVER_LICENSE` | Driver's license number. |
76
+ | `ADDRESS` | City, street, and building components represented as one address span. |
77
+ | `ZIPCODE` | Postal code kept separate from `ADDRESS`. |
78
+ | `DATE` | Date or time. Timezone-only strings are not included in this label. |
79
+ | `CARD_EXPIRY` | Payment-card expiration date. |
80
+ | `CVC` | Card verification code. |
81
+ | `IPIN` | Korean I-PIN identifier. |
82
+ | `TRANSACTION_APPROVAL_ID` | Payment authorization or transaction approval identifier. |
83
+ | `BUSINESS_ID` | Business registration number or merchant identifier. |
84
+ | `VIRTUAL_CARD_NUMBER` | Alternate or virtual card number. |
85
+ | `CI` | Korean identity-linkage information value. |
86
+ | `IPADDRESS` | IPv4 network address. |
87
+ | `MACADDRESS` | 48-bit MAC address. |
88
+ | `IMEI` | Mobile-equipment identifier. |
89
+ | `PORT` | Network service port from 0 to 65535; a non-PII disambiguation label. |
90
+ | `ORGANIZATION` | Company, bank, hospital, or other organization name; a non-PII disambiguation label. |
91
+ | `URL` | Full web URL, including path, query, and fragment when present. |
92
+
93
+ Each entity label has `B-`, `I-`, `E-`, and `S-` boundary classes. Together with `O`, the model therefore has `4 x 29 + 1 = 117` output classes. `O` means that the model predicts no taxonomy entity at that token; it does not guarantee that the surrounding text is non-sensitive.
94
+
95
+ ## 3. Usage
96
 
97
  ```python
98
  import torch
 
103
  model = AutoModelForTokenClassification.from_pretrained(model_id)
104
  model.eval()
105
 
106
+ text = "๊ณ ๊ฐ ๋ชจ์•„์ด๋‹˜(900101-1234569)๊ป˜์„œ 010-0000-0000๋กœ ์—ฐ๋ฝ ์š”์ฒญํ•˜์…จ์Šต๋‹ˆ๋‹ค."
107
+ encoded = tokenizer(
108
+ text,
109
+ return_offsets_mapping=True,
110
+ add_special_tokens=False,
111
+ truncation=True,
112
+ max_length=1024,
113
+ return_tensors="pt",
114
+ )
115
+ offsets = encoded.pop("offset_mapping")[0].tolist()
116
 
117
  with torch.no_grad():
118
+ logits = model(**encoded).logits.float()
119
 
120
+ print(tuple(logits.shape)) # (1, sequence_length, 117)
 
121
  ```
122
 
123
+ Apply constrained BIOES Viterbi decoding to `logits[0]`, then map the decoded token spans to the original text with `offsets`. Character-span records can then be represented in the following form.
124
 
125
  ```text
 
126
  [
127
  {'start': 3, 'end': 6, 'label': 'PERSON'},
128
  {'start': 8, 'end': 22, 'label': 'RRN'},
 
130
  ]
131
  ```
132
 
133
+ Character offsets use Python's half-open interval `[start, end)`. A downstream application could render those spans as follows, but this replacement behavior is not part of the model.
134
 
135
  ```text
136
  ๊ณ ๊ฐ [PERSON]๋‹˜([RRN])๊ป˜์„œ [PHONE]๋กœ ์—ฐ๋ฝ ์š”์ฒญํ•˜์…จ์Šต๋‹ˆ๋‹ค.
137
  ```
138
 
139
+ ### 3.1. Decoding
140
+
141
+ The reported metrics use constrained Viterbi decoding over the BIOES transition grammar, followed by whitespace boundary refinement. Independent per-token argmax can emit invalid BIOES sequences and is not the reported decoding path.
142
+
143
+ The bundled `viterbi_calibration.json` contains six transition biases. The default operating point sets all biases to zero, so BIOES transition constraints remain active without an additional precision-recall adjustment. Convert logits to FP32 before decoding.
144
+
145
+ Use a decoder that implements this BIOES constraint contract. The upstream [`openai/privacy-filter`](https://github.com/openai/privacy-filter) project provides the reference implementation and decoding behavior on which this model is based.
146
+
147
+ For batches, use right padding and pass only `input_ids` and `attention_mask` to the model. Keep `offset_mapping` outside the model for character-span reconstruction. Inputs longer than 1024 tokens were not represented in the training regime and should be chunked with enough overlap for the target use case.
148
 
149
+ ## 4. Training
150
+
151
+ ### 4.1. Data
152
 
 
153
  | Dataset | Role | Size |
154
+ |---|---|---:|
155
+ | [`BCCard/privacy-filter-openpii-masking`](https://huggingface.co/datasets/BCCard/privacy-filter-openpii-masking) v1 | Training | 57,851 rows |
156
+ | [`BCCard/privacy-filter-openpii-masking`](https://huggingface.co/datasets/BCCard/privacy-filter-openpii-masking) v1 | Validation and checkpoint selection | 14,524 rows |
157
+ | Independent non-public Golden Set | Final evaluation only | 4,000 rows - ko 2,920 and en 1,080 |
158
 
159
+ The Golden Set was not used for training, checkpoint selection, or calibration. The training and validation data contain all 29 labels in both languages. English represents 25.74% of train and 26.03% of validation.
 
 
160
 
161
+ The dataset combines relabeled rows from [`ai4privacy/pii-masking-openpii-1.5m`](https://huggingface.co/datasets/ai4privacy/pii-masking-openpii-1.5m) with Korean perturbation, English replay, and statically authored synthesis rows. Synthesis covers positive, confusion, hard-negative, weak-cue, long-context, and multi-label scenarios. The dataset is designed as synthetic training data and contains no operational customer records.
162
+
163
+ ### 4.2. Procedure
 
 
 
 
 
 
 
 
 
164
 
165
  <div align="center">
166
+ <img src="figures/model-training-1-1.png" alt="Training loss, learning rate, and gradient norm by training step">
167
  </div>
168
 
169
+ | Item | Value |
170
+ |---|---|
171
+ | Method | Full fine-tuning of all parameters, including experts and router |
172
+ | Classification head | 33 base classes expanded to 117 classes through taxonomy-aware initialization |
173
+ | Loss | Token-level cross-entropy |
174
+ | Sequence length | Maximum 1024 tokens before special tokens |
175
+ | Batch | Per-device 16, effective 16 on one GPU |
176
+ | Learning rate | 1e-4 with linear decay |
177
+ | Warmup | 543 steps, approximately 3% of 18,080 total steps |
178
+ | Optimizer | Fused AdamW, weight decay 0.0, maximum gradient norm 1.0 |
179
+ | Epochs | 5, with the best checkpoint selected by validation strict micro F1 |
180
+ | Precision | FP32 master parameters with BF16 autocast; MoE router and expert compute protected in FP32 |
181
+ | Seed | 42 for training and data sampling |
182
+ | Hardware | 1 NVIDIA H100 80 GB GPU |
183
+
184
+ The selected FP32 checkpoint was exported as a deployment artifact in BF16. Artifact validation found 132 BF16 tensors and 8 FP32 attention `sinks` tensors.
185
+
186
+ ### 4.3. Included Files
187
+
188
+ | File | Purpose |
189
+ |---|---|
190
+ | `model.safetensors` | BF16 deployment weights with FP32 attention `sinks`. |
191
+ | `config.json` | Architecture and 117-class label mapping. |
192
+ | `tokenizer.json` and `tokenizer_config.json` | Tokenizer files associated with the base model. |
193
+ | `label-taxonomy.yaml` | Label definitions and source-to-target mapping used for training. |
194
+ | `viterbi_calibration.json` | Constrained-decoding operating-point biases. |
195
+
196
+ ## 5. Evaluation
197
+
198
+ ### 5.1. Setup
199
+
200
+ The validation split was used for checkpoint selection and experiment comparison. Final generalization was measured on a separately generated Golden Set containing weak-context entities, surface-similar decoys, label-confusion pairs, and boundary variants.
201
+
202
+ The headline metrics are language-slice strict micro Precision, Recall, and F1. A predicted entity is correct only when both its label and complete span boundary match the reference. Golden evaluation uses constrained Viterbi decoding and whitespace boundary refinement.
203
+
204
+ ### 5.2. Results
205
+
206
  <div align="center">
207
+ <img src="figures/model-evaluation-1-1.png" alt="Validation precision, recall, micro F1, and macro F1 by training step">
208
  </div>
209
 
210
+ | Language | Validation P | Validation R | Validation F1 | Golden P | Golden R | Golden F1 | F1 Difference |
211
+ |---|---:|---:|---:|---:|---:|---:|---:|
212
+ | ko | 0.9829 | 0.9819 | 0.9824 | 0.9735 | 0.9729 | 0.9732 | -0.92%p |
213
+ | en | 0.9708 | 0.9708 | 0.9708 | 0.9652 | 0.9649 | 0.9650 | -0.58%p |
214
+
215
+ `F1 Difference` is Golden F1 minus Validation F1. The smaller Golden scores indicate a limited generalization decrease of 0.92 percentage points for Korean and 0.58 percentage points for English.
216
+
217
+ ### 5.3. Error Characteristics
218
+
219
+ The aggregate results do not mean that every label performs equally. Error analysis of the English Golden slice shows the most visible weaknesses in `ACCOUNT_NUMBER`, `ZIPCODE`, `PORT`, and `ORGANIZATION`. Frequent confusion directions include `PORT` versus `ZIPCODE`, `ACCOUNT_NUMBER` versus `BUSINESS_ID` or `IPIN`, and `ORGANIZATION` versus `PERSON`.
220
+
221
+ These patterns are consistent with labels that share numeric shapes or require contextual role information. Downstream systems should evaluate per-label behavior on their own traffic, especially when label identity changes the handling action.
222
+
223
+ ## 6. Intended Use
224
+
225
+ Suitable uses include:
226
+
227
+ * Detecting privacy-related entities before Korean or English text is sent to an LLM or another downstream service.
228
+ * Supporting offline privacy review of customer-service text, documents, email, and logs.
229
+ * Producing typed entity spans for an application-specific masking, routing, retention, or review policy.
230
+
231
+ The model is not a complete anonymization system, a legal-compliance guarantee, or a substitute for domain-specific review. It should not be used as the sole control for high-impact decisions. Applications remain responsible for deciding whether each detected label is masked, transformed, retained, or escalated.
232
+
233
+ ## 7. Limitations
234
+
235
+ * **Synthetic evaluation** - Training, validation, and Golden data are synthetic. Performance on real customer text, OCR noise, slang, novel obfuscation, and unseen document structures has not been established.
236
+ * **Label-specific variation** - High aggregate F1 can hide weaker labels and confusion pairs. `ACCOUNT_NUMBER`, `ZIPCODE`, `PORT`, and `ORGANIZATION` require particular attention based on the current Golden analysis.
237
+ * **Non-PII labels** - `PORT` and `ORGANIZATION` are deliberately predicted even though they are not PII. Consumers must not assume that every non-`O` label requires the same action.
238
+ * **Context and boundary sensitivity** - Weak contextual evidence, shared numeric formats, and long entity boundaries can produce missed entities, boundary errors, or label swaps.
239
+ * **Long inputs** - The base architecture supports a larger context, but training examples were limited to 1024 tokens and the observed dataset maximum was 801 tokens. Longer inputs require separate validation and should normally be chunked.
240
+ * **Registry-backed identifiers** - Synthetic account, telephone, passport, user, and social-security values cannot be exhaustively checked against private issuance registries. Any coincidental match with a real value is unintended.
241
+ * **Language and domain scope** - Evaluation covers Korean and English with emphasis on financial, customer-service/VOC, identity, security, and infrastructure contexts. Other languages and domains are unsupported.
242
+
243
+ ## 8. License, Attribution, and Citation
244
+
245
+ The model is released under the Apache 2.0 license. Its training dataset is released under CC BY 4.0 and is derived from `ai4privacy/pii-masking-openpii-1.5m`; follow the dataset card for its attribution requirements.
246
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
  ```bibtex
248
+ @misc{bccard2026moaiprivacyfilterv3,
249
+ title = {MoAI-Privacy-Filter v3: Korean and English Privacy-Related Entity Detection},
250
+ author = {BC Card},
251
  year = {2026},
252
  howpublished = {https://huggingface.co/BCCard/MoAI-Privacy-Filter},
253
+ note = {Full fine-tune of openai/privacy-filter on BCCard/privacy-filter-openpii-masking v1}
254
  }
255
  ```
256
 
257
+ Related resources:
258
+
259
+ * **Base model**: [`openai/privacy-filter`](https://huggingface.co/openai/privacy-filter).
260
+ * **Training dataset**: [`BCCard/privacy-filter-openpii-masking`](https://huggingface.co/datasets/BCCard/privacy-filter-openpii-masking).
261
+ * **Upstream dataset**: [`ai4privacy/pii-masking-openpii-1.5m`](https://huggingface.co/datasets/ai4privacy/pii-masking-openpii-1.5m).
262
+
263
+ ## 9. Disclaimer
264
 
265
+ This model is provided as is, without warranties of accuracy, completeness, non-infringement, or fitness for a particular purpose. Users are responsible for testing the model in their own environment and ensuring that its use complies with applicable laws, regulations, contractual obligations, and organizational policies.
config.json CHANGED
@@ -26,144 +26,232 @@
26
  "10": "I-FRN",
27
  "11": "E-FRN",
28
  "12": "S-FRN",
29
- "13": "B-CARD_NUMBER",
30
- "14": "I-CARD_NUMBER",
31
- "15": "E-CARD_NUMBER",
32
- "16": "S-CARD_NUMBER",
33
- "17": "B-ACCOUNT_NUMBER",
34
- "18": "I-ACCOUNT_NUMBER",
35
- "19": "E-ACCOUNT_NUMBER",
36
- "20": "S-ACCOUNT_NUMBER",
37
- "21": "B-SECRET",
38
- "22": "I-SECRET",
39
- "23": "E-SECRET",
40
- "24": "S-SECRET",
41
- "25": "B-USER_ID",
42
- "26": "I-USER_ID",
43
- "27": "E-USER_ID",
44
- "28": "S-USER_ID",
45
- "29": "B-EMAIL",
46
- "30": "I-EMAIL",
47
- "31": "E-EMAIL",
48
- "32": "S-EMAIL",
49
- "33": "B-PHONE",
50
- "34": "I-PHONE",
51
- "35": "E-PHONE",
52
- "36": "S-PHONE",
53
- "37": "B-PASSPORT",
54
- "38": "I-PASSPORT",
55
- "39": "E-PASSPORT",
56
- "40": "S-PASSPORT",
57
- "41": "B-DRIVER_LICENSE",
58
- "42": "I-DRIVER_LICENSE",
59
- "43": "E-DRIVER_LICENSE",
60
- "44": "S-DRIVER_LICENSE",
61
- "45": "B-GENERIC_ID",
62
- "46": "I-GENERIC_ID",
63
- "47": "E-GENERIC_ID",
64
- "48": "S-GENERIC_ID",
65
- "49": "B-ADDRESS",
66
- "50": "I-ADDRESS",
67
- "51": "E-ADDRESS",
68
- "52": "S-ADDRESS",
69
- "53": "B-ZIPCODE",
70
- "54": "I-ZIPCODE",
71
- "55": "E-ZIPCODE",
72
- "56": "S-ZIPCODE",
73
- "57": "B-DATE",
74
- "58": "I-DATE",
75
- "59": "E-DATE",
76
- "60": "S-DATE",
77
- "61": "B-CARD_EXPIRY",
78
- "62": "I-CARD_EXPIRY",
79
- "63": "E-CARD_EXPIRY",
80
- "64": "S-CARD_EXPIRY",
81
- "65": "B-CVC",
82
- "66": "I-CVC",
83
- "67": "E-CVC",
84
- "68": "S-CVC",
85
- "69": "B-IPIN",
86
- "70": "I-IPIN",
87
- "71": "E-IPIN",
88
- "72": "S-IPIN"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  },
90
  "initial_context_length": 4096,
91
  "initializer_range": 0.02,
92
  "intermediate_size": 640,
93
  "label2id": {
94
- "B-ACCOUNT_NUMBER": 17,
95
- "B-ADDRESS": 49,
96
- "B-CARD_EXPIRY": 61,
97
- "B-CARD_NUMBER": 13,
98
- "B-CVC": 65,
99
- "B-DATE": 57,
100
- "B-DRIVER_LICENSE": 41,
101
- "B-EMAIL": 29,
 
 
102
  "B-FRN": 9,
103
- "B-GENERIC_ID": 45,
104
- "B-IPIN": 69,
105
- "B-PASSPORT": 37,
 
 
 
 
106
  "B-PERSON": 1,
107
- "B-PHONE": 33,
 
108
  "B-RRN": 5,
109
- "B-SECRET": 21,
110
- "B-USER_ID": 25,
111
- "B-ZIPCODE": 53,
112
- "E-ACCOUNT_NUMBER": 19,
113
- "E-ADDRESS": 51,
114
- "E-CARD_EXPIRY": 63,
115
- "E-CARD_NUMBER": 15,
116
- "E-CVC": 67,
117
- "E-DATE": 59,
118
- "E-DRIVER_LICENSE": 43,
119
- "E-EMAIL": 31,
 
 
 
 
 
 
120
  "E-FRN": 11,
121
- "E-GENERIC_ID": 47,
122
- "E-IPIN": 71,
123
- "E-PASSPORT": 39,
 
 
 
 
124
  "E-PERSON": 3,
125
- "E-PHONE": 35,
 
126
  "E-RRN": 7,
127
- "E-SECRET": 23,
128
- "E-USER_ID": 27,
129
- "E-ZIPCODE": 55,
130
- "I-ACCOUNT_NUMBER": 18,
131
- "I-ADDRESS": 50,
132
- "I-CARD_EXPIRY": 62,
133
- "I-CARD_NUMBER": 14,
134
- "I-CVC": 66,
135
- "I-DATE": 58,
136
- "I-DRIVER_LICENSE": 42,
137
- "I-EMAIL": 30,
 
 
 
 
 
 
138
  "I-FRN": 10,
139
- "I-GENERIC_ID": 46,
140
- "I-IPIN": 70,
141
- "I-PASSPORT": 38,
 
 
 
 
142
  "I-PERSON": 2,
143
- "I-PHONE": 34,
 
144
  "I-RRN": 6,
145
- "I-SECRET": 22,
146
- "I-USER_ID": 26,
147
- "I-ZIPCODE": 54,
 
 
 
 
148
  "O": 0,
149
- "S-ACCOUNT_NUMBER": 20,
150
- "S-ADDRESS": 52,
151
- "S-CARD_EXPIRY": 64,
152
- "S-CARD_NUMBER": 16,
153
- "S-CVC": 68,
154
- "S-DATE": 60,
155
- "S-DRIVER_LICENSE": 44,
156
- "S-EMAIL": 32,
 
 
157
  "S-FRN": 12,
158
- "S-GENERIC_ID": 48,
159
- "S-IPIN": 72,
160
- "S-PASSPORT": 40,
 
 
 
 
161
  "S-PERSON": 4,
162
- "S-PHONE": 36,
 
163
  "S-RRN": 8,
164
- "S-SECRET": 24,
165
- "S-USER_ID": 28,
166
- "S-ZIPCODE": 56
 
 
 
 
167
  },
168
  "max_position_embeddings": 131072,
169
  "model_type": "openai_privacy_filter",
 
26
  "10": "I-FRN",
27
  "11": "E-FRN",
28
  "12": "S-FRN",
29
+ "13": "B-SSN",
30
+ "14": "I-SSN",
31
+ "15": "E-SSN",
32
+ "16": "S-SSN",
33
+ "17": "B-GENERIC_ID",
34
+ "18": "I-GENERIC_ID",
35
+ "19": "E-GENERIC_ID",
36
+ "20": "S-GENERIC_ID",
37
+ "21": "B-CARD_NUMBER",
38
+ "22": "I-CARD_NUMBER",
39
+ "23": "E-CARD_NUMBER",
40
+ "24": "S-CARD_NUMBER",
41
+ "25": "B-ACCOUNT_NUMBER",
42
+ "26": "I-ACCOUNT_NUMBER",
43
+ "27": "E-ACCOUNT_NUMBER",
44
+ "28": "S-ACCOUNT_NUMBER",
45
+ "29": "B-SECRET",
46
+ "30": "I-SECRET",
47
+ "31": "E-SECRET",
48
+ "32": "S-SECRET",
49
+ "33": "B-USER_ID",
50
+ "34": "I-USER_ID",
51
+ "35": "E-USER_ID",
52
+ "36": "S-USER_ID",
53
+ "37": "B-EMAIL",
54
+ "38": "I-EMAIL",
55
+ "39": "E-EMAIL",
56
+ "40": "S-EMAIL",
57
+ "41": "B-PHONE",
58
+ "42": "I-PHONE",
59
+ "43": "E-PHONE",
60
+ "44": "S-PHONE",
61
+ "45": "B-PASSPORT",
62
+ "46": "I-PASSPORT",
63
+ "47": "E-PASSPORT",
64
+ "48": "S-PASSPORT",
65
+ "49": "B-DRIVER_LICENSE",
66
+ "50": "I-DRIVER_LICENSE",
67
+ "51": "E-DRIVER_LICENSE",
68
+ "52": "S-DRIVER_LICENSE",
69
+ "53": "B-ADDRESS",
70
+ "54": "I-ADDRESS",
71
+ "55": "E-ADDRESS",
72
+ "56": "S-ADDRESS",
73
+ "57": "B-ZIPCODE",
74
+ "58": "I-ZIPCODE",
75
+ "59": "E-ZIPCODE",
76
+ "60": "S-ZIPCODE",
77
+ "61": "B-DATE",
78
+ "62": "I-DATE",
79
+ "63": "E-DATE",
80
+ "64": "S-DATE",
81
+ "65": "B-CARD_EXPIRY",
82
+ "66": "I-CARD_EXPIRY",
83
+ "67": "E-CARD_EXPIRY",
84
+ "68": "S-CARD_EXPIRY",
85
+ "69": "B-CVC",
86
+ "70": "I-CVC",
87
+ "71": "E-CVC",
88
+ "72": "S-CVC",
89
+ "73": "B-IPIN",
90
+ "74": "I-IPIN",
91
+ "75": "E-IPIN",
92
+ "76": "S-IPIN",
93
+ "77": "B-TRANSACTION_APPROVAL_ID",
94
+ "78": "I-TRANSACTION_APPROVAL_ID",
95
+ "79": "E-TRANSACTION_APPROVAL_ID",
96
+ "80": "S-TRANSACTION_APPROVAL_ID",
97
+ "81": "B-BUSINESS_ID",
98
+ "82": "I-BUSINESS_ID",
99
+ "83": "E-BUSINESS_ID",
100
+ "84": "S-BUSINESS_ID",
101
+ "85": "B-VIRTUAL_CARD_NUMBER",
102
+ "86": "I-VIRTUAL_CARD_NUMBER",
103
+ "87": "E-VIRTUAL_CARD_NUMBER",
104
+ "88": "S-VIRTUAL_CARD_NUMBER",
105
+ "89": "B-CI",
106
+ "90": "I-CI",
107
+ "91": "E-CI",
108
+ "92": "S-CI",
109
+ "93": "B-IPADDRESS",
110
+ "94": "I-IPADDRESS",
111
+ "95": "E-IPADDRESS",
112
+ "96": "S-IPADDRESS",
113
+ "97": "B-MACADDRESS",
114
+ "98": "I-MACADDRESS",
115
+ "99": "E-MACADDRESS",
116
+ "100": "S-MACADDRESS",
117
+ "101": "B-IMEI",
118
+ "102": "I-IMEI",
119
+ "103": "E-IMEI",
120
+ "104": "S-IMEI",
121
+ "105": "B-PORT",
122
+ "106": "I-PORT",
123
+ "107": "E-PORT",
124
+ "108": "S-PORT",
125
+ "109": "B-ORGANIZATION",
126
+ "110": "I-ORGANIZATION",
127
+ "111": "E-ORGANIZATION",
128
+ "112": "S-ORGANIZATION",
129
+ "113": "B-URL",
130
+ "114": "I-URL",
131
+ "115": "E-URL",
132
+ "116": "S-URL"
133
  },
134
  "initial_context_length": 4096,
135
  "initializer_range": 0.02,
136
  "intermediate_size": 640,
137
  "label2id": {
138
+ "B-ACCOUNT_NUMBER": 25,
139
+ "B-ADDRESS": 53,
140
+ "B-BUSINESS_ID": 81,
141
+ "B-CARD_EXPIRY": 65,
142
+ "B-CARD_NUMBER": 21,
143
+ "B-CI": 89,
144
+ "B-CVC": 69,
145
+ "B-DATE": 61,
146
+ "B-DRIVER_LICENSE": 49,
147
+ "B-EMAIL": 37,
148
  "B-FRN": 9,
149
+ "B-GENERIC_ID": 17,
150
+ "B-IMEI": 101,
151
+ "B-IPADDRESS": 93,
152
+ "B-IPIN": 73,
153
+ "B-MACADDRESS": 97,
154
+ "B-ORGANIZATION": 109,
155
+ "B-PASSPORT": 45,
156
  "B-PERSON": 1,
157
+ "B-PHONE": 41,
158
+ "B-PORT": 105,
159
  "B-RRN": 5,
160
+ "B-SECRET": 29,
161
+ "B-SSN": 13,
162
+ "B-TRANSACTION_APPROVAL_ID": 77,
163
+ "B-URL": 113,
164
+ "B-USER_ID": 33,
165
+ "B-VIRTUAL_CARD_NUMBER": 85,
166
+ "B-ZIPCODE": 57,
167
+ "E-ACCOUNT_NUMBER": 27,
168
+ "E-ADDRESS": 55,
169
+ "E-BUSINESS_ID": 83,
170
+ "E-CARD_EXPIRY": 67,
171
+ "E-CARD_NUMBER": 23,
172
+ "E-CI": 91,
173
+ "E-CVC": 71,
174
+ "E-DATE": 63,
175
+ "E-DRIVER_LICENSE": 51,
176
+ "E-EMAIL": 39,
177
  "E-FRN": 11,
178
+ "E-GENERIC_ID": 19,
179
+ "E-IMEI": 103,
180
+ "E-IPADDRESS": 95,
181
+ "E-IPIN": 75,
182
+ "E-MACADDRESS": 99,
183
+ "E-ORGANIZATION": 111,
184
+ "E-PASSPORT": 47,
185
  "E-PERSON": 3,
186
+ "E-PHONE": 43,
187
+ "E-PORT": 107,
188
  "E-RRN": 7,
189
+ "E-SECRET": 31,
190
+ "E-SSN": 15,
191
+ "E-TRANSACTION_APPROVAL_ID": 79,
192
+ "E-URL": 115,
193
+ "E-USER_ID": 35,
194
+ "E-VIRTUAL_CARD_NUMBER": 87,
195
+ "E-ZIPCODE": 59,
196
+ "I-ACCOUNT_NUMBER": 26,
197
+ "I-ADDRESS": 54,
198
+ "I-BUSINESS_ID": 82,
199
+ "I-CARD_EXPIRY": 66,
200
+ "I-CARD_NUMBER": 22,
201
+ "I-CI": 90,
202
+ "I-CVC": 70,
203
+ "I-DATE": 62,
204
+ "I-DRIVER_LICENSE": 50,
205
+ "I-EMAIL": 38,
206
  "I-FRN": 10,
207
+ "I-GENERIC_ID": 18,
208
+ "I-IMEI": 102,
209
+ "I-IPADDRESS": 94,
210
+ "I-IPIN": 74,
211
+ "I-MACADDRESS": 98,
212
+ "I-ORGANIZATION": 110,
213
+ "I-PASSPORT": 46,
214
  "I-PERSON": 2,
215
+ "I-PHONE": 42,
216
+ "I-PORT": 106,
217
  "I-RRN": 6,
218
+ "I-SECRET": 30,
219
+ "I-SSN": 14,
220
+ "I-TRANSACTION_APPROVAL_ID": 78,
221
+ "I-URL": 114,
222
+ "I-USER_ID": 34,
223
+ "I-VIRTUAL_CARD_NUMBER": 86,
224
+ "I-ZIPCODE": 58,
225
  "O": 0,
226
+ "S-ACCOUNT_NUMBER": 28,
227
+ "S-ADDRESS": 56,
228
+ "S-BUSINESS_ID": 84,
229
+ "S-CARD_EXPIRY": 68,
230
+ "S-CARD_NUMBER": 24,
231
+ "S-CI": 92,
232
+ "S-CVC": 72,
233
+ "S-DATE": 64,
234
+ "S-DRIVER_LICENSE": 52,
235
+ "S-EMAIL": 40,
236
  "S-FRN": 12,
237
+ "S-GENERIC_ID": 20,
238
+ "S-IMEI": 104,
239
+ "S-IPADDRESS": 96,
240
+ "S-IPIN": 76,
241
+ "S-MACADDRESS": 100,
242
+ "S-ORGANIZATION": 112,
243
+ "S-PASSPORT": 48,
244
  "S-PERSON": 4,
245
+ "S-PHONE": 44,
246
+ "S-PORT": 108,
247
  "S-RRN": 8,
248
+ "S-SECRET": 32,
249
+ "S-SSN": 16,
250
+ "S-TRANSACTION_APPROVAL_ID": 80,
251
+ "S-URL": 116,
252
+ "S-USER_ID": 36,
253
+ "S-VIRTUAL_CARD_NUMBER": 88,
254
+ "S-ZIPCODE": 60
255
  },
256
  "max_position_embeddings": 131072,
257
  "model_type": "openai_privacy_filter",
figures/evaluation-test-1-1.png CHANGED

Git LFS Details

  • SHA256: 0481eb0a53ab6e5699c87fd53a1c855c688d3f22532edb563a815d90419040d1
  • Pointer size: 131 Bytes
  • Size of remote file: 245 kB

Git LFS Details

  • SHA256: 9250a0d9e43e354c39de4ef9e68680d8dc9d0308f47fda29909f59a460f80bbe
  • Pointer size: 131 Bytes
  • Size of remote file: 129 kB
figures/evaluation-train-1-1.png CHANGED

Git LFS Details

  • SHA256: a5e0badc81ac4a9e613f34875a65e70a57ea37b3de4fad748cf7f9f89c40c646
  • Pointer size: 131 Bytes
  • Size of remote file: 119 kB

Git LFS Details

  • SHA256: e7bec3e8267124f62ebb35275bba3a7b8e799fb43297c5f9ad4999c625b83b7e
  • Pointer size: 130 Bytes
  • Size of remote file: 81.9 kB
label-taxonomy.yaml CHANGED
@@ -2,126 +2,176 @@
2
  # Label Mapping - ai4privacy 1.5m ๋ผ๋ฒจ -> ๋‚ด๋ถ€ ํ•™์Šต ๋ผ๋ฒจ ๋งคํ•‘ ํ…Œ์ด๋ธ”
3
  #
4
  # * ์—ญํ• : ๋ชจ๋ธ ํ•™์Šต ๋ผ๋ฒจ = ๋กœ๊น… ์Šคํ‚ค๋งˆ ํ‚ค = ์ •์ฑ… ํ…Œ์ด๋ธ” ํ‚ค์˜ ๋‹จ์ผ ์†Œ์Šค
5
- # (docs/handoff/2026-07-03-pii-masking-architecture-qna.md [13])
6
  # * ์—ญ์‚ฐ ๊ทผ๊ฑฐ: playbooks/privacy_filter/privacy-filter-policy.md (ํ‘œ 1 ์ •ํ˜• ํŒจํ„ด / ํ‘œ 2 ๋งˆ์Šคํ‚น ๊ธฐ์ค€)
7
- # * ์‹ค์ธก ๊ทผ๊ฑฐ: docs/handoff/2026-07-03-ai4privacy-1p5m-ko-audit.md (v0 ์ดˆ์•ˆ + ko ์„œ๋ธŒ์…‹ ๊ฐ์‚ฌ)
8
- # * v0 -> v1 ๋ณ€๊ฒฝ: ์ฃผ์†Œ ์ฒ˜๋ฆฌ ํ™•์ •(๋‹จ์ผ+์„œ๋ธŒ๋งˆ์Šคํ‚น) / FRN ์‹ ์„ค / USER_IDยทACCOUNT_NUMBER
9
- # ๋“œ๋กญ ์ฒ ํšŒ / ์—ฌ๊ถŒยท์šด์ „๋ฉดํ—ˆ ๋ถ„๋ฆฌ ์œ ์ง€ / regex ์ „๋‹ด ํ•ญ๋ชฉ ๋ถ„๋ฆฌ
10
- # * 2026-07-21: AGEยทGENDER ๋“œ๋กญ ํ™•์ • (ํ‘œ1ยทํ‘œ2 ๋ฌด๊ทผ๊ฑฐ - ์ •์ฑ… ์—ญ์‚ฐ ์›์น™ ๊ด€์ฒ , N=17 -> 15)
11
- # * 2026-07-21: ํ‘œ2 ๋ฌธ๋งฅ ํ•ญ๋ชฉ 3์ข… ๋ชจ๋ธ ์Šน๊ฒฉ (CARD_EXPIRYยทCVCยทIPIN - ๋ฌธ๋งฅ ๊ฒ€์ถœ์€ ๋ชจ๋ธ ๋ ˆ์ธ
12
- # ๋ณธ๋ น, ํ‚ค์›Œ๋“œ regex๋Š” ์ด์ค‘ ๋ ˆ์ธ ๋ณ‘ํ–‰. N=15 -> 18, 61 -> 73ํด๋ž˜์Šค)
13
  # =============================================================================
14
 
15
  version: v1
16
- date: 2026-07-21
17
  basis:
18
  policy: playbooks/privacy_filter/privacy-filter-policy.md
19
- audit: docs/handoff/2026-07-03-ai4privacy-1p5m-ko-audit.md
20
 
21
  # -----------------------------------------------------------------------------
22
- # 1. ๋ชจ๋ธ ํ•™์Šต ๋ผ๋ฒจ (N=18 -> BIOES 4N+1 = 73ํด๋ž˜์Šค)
23
  # * data_source: ๋ผ๋ฒจ ํ‘œ๋ณธ์˜ ์ถœ์ฒ˜ ๋ฆฌ์ŠคํŠธ - ko(1.5m-ko ์ •์ œ๋ณธ) / en(1.5m-en ๋ฆฌํ”Œ๋ ˆ์ด) /
24
- # domain(๋„๋ฉ”์ธ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋Œ€๊ธฐ - ํ—ค๋“œ๋Š” ์œ ์‚ฌ ๋ผ๋ฒจ ํ–‰ ๋ณต์‚ฌ๋กœ init)
25
- # * RRN์˜ 1.5m ์œ ๋ž˜๋ถ„์€ ko ํ•œ์ • (en TAXNUM์€ GENERIC_ID fallback) - domain์€ ์ฆ๊ฐ• ๋ฐฉ์‹ B
26
- # * en ๋ถ„ํฌ ์‹ค์ธก (2026-07-13, 163,740ํ–‰/1,247,393์ŠคํŒฌ): ์ƒ์œ„ 19์ข… ์ง‘์ค‘ - PASSWORD 0,
27
- # ACCOUNTNUM 1, USERNAME 20 -> "ํฌ์†Œ ๋ผ๋ฒจ์€ en ๋‹ด๋‹น" ๊ฐ€์„ค ๊ธฐ๊ฐ, [domain] ์žฌ๋ฐฐ์ •
28
  # -----------------------------------------------------------------------------
29
  model_labels:
30
  - name: PERSON
31
  description: ์„ฑ๋ช… (์„ฑ+์ด๋ฆ„ ๋ณ‘ํ•ฉ ๋‹จ์ผ ์ŠคํŒฌ)
32
  policy_ref: "ํ‘œ2 ์„ฑ๋ช… (๊น€*์šฉ - ์ฒซยท๋ ๊ธ€์ž ์ œ์™ธ) / ํ‘œ2 ์„ฑ๋ช…(์˜๋ฌธ) (์•ž 4์ž๋ฆฌ ๋…ธ์ถœ) - ์น˜ํ™˜ ์‹œ ์Šคํฌ๋ฆฝํŠธ(ํ•œ๊ธ€/์˜๋ฌธ)๋กœ ๊ทœ์น™ ๋ถ„๊ธฐ, full-span ๊ฒฝ๊ณ„ ํ•„์ˆ˜"
33
- data_source: [ko, en]
34
  head_init_base: private_person
35
  - name: RRN
36
  description: ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ
37
  policy_ref: "ํ‘œ1 ์ฃผ๋ฏผ๋ฒˆํ˜ธ / ํ‘œ2 ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ (๋’ค 7์ž๋ฆฌ ๋งˆ์Šคํ‚น)"
38
- data_source: [ko, domain] # domain = ์ฆ๊ฐ• ๋ฐฉ์‹ B ์‹ ๊ทœ ์ƒ์„ฑ๋ถ„ (์ „๋žต๋ฌธ ยง3.3.1)
39
  head_init_base: account_number
40
  - name: FRN
41
  description: ์™ธ๊ตญ์ธ๋“ฑ๋ก๋ฒˆํ˜ธ (์‹ ์„ค - 1.5m ์†Œ์Šค 0๊ฑด)
42
  policy_ref: "ํ‘œ1 ์™ธ๊ตญ์ธ๋“ฑ๋ก๋ฒˆํ˜ธ ([5-8] ์‹œ์ž‘) / ํ‘œ2 ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ(์™ธ๊ตญ์ธ๋“ฑ๋ก๋ฒˆํ˜ธ ํฌํ•จ) (๋’ค 7์ž๋ฆฌ)"
43
- data_source: [domain]
44
  head_init_from: RRN
 
 
 
 
 
 
 
 
 
 
45
  - name: CARD_NUMBER
46
  description: ์‹ ์šฉ/์ฒดํฌ์นด๋“œ ๋ฒˆํ˜ธ
47
  policy_ref: "ํ‘œ1 ์นด๋“œ๋ฒˆํ˜ธ / ํ‘œ2 ์นด๋“œ๋ฒˆํ˜ธ (7~12๋ฒˆ์งธ ์ž๋ฆฌ, PCI-DSS)"
48
- data_source: [ko, en, domain] # domain = ์ฆ๊ฐ• ๋ฐฉ์‹ B ์‹ ๊ทœ ์ƒ์„ฑ๋ถ„ (์ „๋žต๋ฌธ ยง3.3.1)
49
  head_init_base: account_number
50
  - name: ACCOUNT_NUMBER
51
- description: ๊ณ„์ขŒ๋ฒˆํ˜ธ (v0 ๋“œ๋กญ ์ฒ ํšŒ - ํ‘œ2 ๋งˆ์Šคํ‚น ๊ธฐ์ค€ ์กด์žฌ)
52
  policy_ref: "ํ‘œ1 ๊ณ„์ขŒ๋ฒˆํ˜ธ (์ „ํ™”๋ฒˆํ˜ธ ํก์ˆ˜ ์œ„ํ—˜ - recognizer ์šฐ์„ ์ˆœ์œ„ ํ•„์š”) / ํ‘œ2 ๊ณ„์ขŒ๋ฒˆํ˜ธ (๋’ค 5์ž๋ฆฌ)"
53
- data_source: [domain] # ko 5ยทen 1๊ฑด ์‹ค์ธก - ํ•ฉ์„ฑ ์ฆ๊ฐ• ํ•„์ˆ˜ (์€ํ–‰๋ณ„ ํฌ๋งท ๊ทœ์น™ ์ƒ์„ฑ ์šฉ์ด)
54
  head_init_base: account_number
55
  - name: SECRET
56
  description: ์ธ์ฆ ์‹œํฌ๋ฆฟ (๋น„๋ฐ€๋ฒˆํ˜ธยทAPI ํ‚คยทํ† ํฐ ํ†ตํ•ฉ - ์นด๋“œ/ํšŒ์›/ISP ๊ตฌ๋ถ„์€ ๋ฌธ๋งฅ ๋ถˆ๊ฐ€ + ์•ก์…˜ ๋™์ผ)
57
  policy_ref: "ํ‘œ2 ์นด๋“œ๋น„๋ฐ€๋ฒˆํ˜ธยท์˜จ๋ผ์ธ ํšŒ์› ํŒจ์Šค์›Œ๋“œยทISP๋น„๋ฐ€๋ฒˆํ˜ธ (์ฒ˜๋ฆฌ ๊ธˆ์ง€ -> ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ๋Š” LLM ๋…ธ์ถœ ๊ธˆ์ง€ = ์ „์ฒด ๋งˆ์Šคํ‚น์œผ๋กœ ํ•ด์„)"
58
- data_source: [domain] # 1.5m ์ „๋ฌด (ko 4ยทen 0 ์‹ค์ธก) - ๋„๋ฉ”์ธ/ํ•ฉ์„ฑ ์ฆ๊ฐ• ์ „๋‹ด
59
  head_init_base: secret # base 8์ข… ์ค‘ secret ํ–‰ ์ •ํ™• ๋ณต์‚ฌ (์ธ์ ‘ ์•„๋‹Œ ์ง๊ณ„ ์ƒ์†)
60
  - name: USER_ID
61
- description: ์˜จ๋ผ์ธ ํšŒ์› ID (v0 ๋“œ๋กญ ์ฒ ํšŒ - ํ‘œ2 ๋งˆ์Šคํ‚น ๊ธฐ์ค€ ์กด์žฌ)
62
  policy_ref: "ํ‘œ2 ์˜จ๋ผ์ธ ํšŒ์› ID (์•ž 2์ž๋ฆฌ ์ œ์™ธ)"
63
- data_source: [domain] # ko 4ยทen 20๊ฑด ์‹ค์ธก - ์ฆ๊ฐ• ํ•„์ˆ˜
64
  head_init_base: account_number
65
  - name: EMAIL
66
  description: ์ด๋ฉ”์ผ ์ฃผ์†Œ
67
  policy_ref: "ํ‘œ1 ์ด๋ฉ”์ผ / ํ‘œ2 ์ด๋ฉ”์ผ์ฃผ์†Œ (ID ์•ž 2์ž๋ฆฌ ์ œ์™ธ ๋งˆ์Šคํ‚น)"
68
- data_source: [ko, en]
69
  head_init_base: private_email
70
  - name: PHONE
71
  description: ์ „ํ™”๋ฒˆํ˜ธ (ํœด๋Œ€ํฐ/์ผ๋ฐ˜์ „ํ™” ํ†ตํ•ฉ - ์น˜ํ™˜ ๋‹จ๊ณ„์—์„œ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์žฌ๋ถ„๋ฅ˜)
72
  policy_ref: "ํ‘œ1 ํœด๋Œ€ํฐ๋ฒˆํ˜ธยท์ „ํ™”๋ฒˆํ˜ธ / ํ‘œ2 ๊ธฐ๋ณธ ๋’ค 6์ž๋ฆฌ ๊ณตํ†ต - ๋‚ด๋ถ€๋ง ์ฑ„๋„ ํ•œ์ • ํœด๋Œ€ํฐ
73
  ๋’ค 4์ž๋ฆฌ ์™„ํ™” (์น˜ํ™˜ ์‹œ ๊ฐ’ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ํœด๋Œ€ํฐ ํŒ๋ณ„ + ์ฑ„๋„ ์ถ• ๋ถ„๊ธฐ)"
74
- data_source: [ko, en]
75
  head_init_base: private_phone
76
  - name: PASSPORT
77
  description: ์—ฌ๊ถŒ๋ฒˆํ˜ธ (๋ถ„๋ฆฌ ์œ ์ง€ - ๋งˆ์Šคํ‚น ๊ธฐ์ค€ ์ƒ์ด + ko 3,211๊ฑด)
78
  policy_ref: "ํ‘œ1 ์—ฌ๊ถŒ๋ฒˆํ˜ธ / ํ‘œ2 ์—ฌ๊ถŒ๋ฒˆํ˜ธ (๋’ค 4์ž๋ฆฌ)"
79
- data_source: [ko, en]
80
  head_init_base: account_number
81
  - name: DRIVER_LICENSE
82
  description: ์šด์ „๋ฉดํ—ˆ๋ฒˆํ˜ธ (๋ถ„๋ฆฌ ์œ ์ง€ - ๋งˆ์Šคํ‚น ๊ธฐ์ค€ ์ƒ์ด + ko 4,092๊ฑด)
83
  policy_ref: "ํ‘œ1 ์šด์ „๋ฉดํ—ˆ๋ฒˆํ˜ธ / ํ‘œ2 ์šด์ „๋ฉดํ—ˆ๋ฒˆํ˜ธ (์ค‘๊ฐ„ 6์ž๋ฆฌ)"
84
- data_source: [ko, en]
85
- head_init_base: account_number
86
- - name: GENERIC_ID
87
- description: ๋ฒ”์šฉ ์‹๋ณ„์ž (ํ•œ๊ตญ ๋Œ€์‘๋ฌผ ์—†๋Š” ID๋ฅ˜ - recall-first๋กœ O ๋Œ€์‹  ์œ ์ง€)
88
- policy_ref: "audit ยง5 (SOCIALNUM 10์ž๋ฆฌยทIDCARDNUM ์˜์ˆซ์ž)"
89
- data_source: [ko, en]
90
  head_init_base: account_number
91
  - name: ADDRESS
92
  description: ์ฃผ์†Œ (์‹œยท๋„๋กœ๋ช…ยท๊ฑด๋ฌผ๋ฒˆํ˜ธ ํ†ตํ•ฉ ์ŠคํŒฌ - ์น˜ํ™˜ ๋‹จ๊ณ„์—์„œ ์ˆซ์ž ์„œ๋ธŒ๋งˆ์Šคํ‚น)
93
  policy_ref: "ํ‘œ2 ์ฃผ์†Œ (์ง€๋ฒˆ: ์/๋ฉด/๋™ ๋ฏธ๋งŒ ์ˆซ์ž / ๋„๋กœ๋ช…: ๊ฑด๋ฌผ๋ฒˆํ˜ธยท์ƒ์„ธ์ฃผ์†Œ ์ˆซ์ž ๋งˆ์Šคํ‚น -> ์ŠคํŒฌ ๋‚ด ๊ทœ์น™ ์น˜ํ™˜)"
94
- data_source: [ko, en]
95
  head_init_base: private_address
96
  - name: ZIPCODE
97
- description: ์šฐํŽธ๋ฒˆํ˜ธ (๋ถ„๋ฆฌ ์œ ์ง€ - keep ํ† ๊ธ€ ์„ธ๋ถ„์„ฑ ์ „์ œ)
98
- policy_ref: "handoff [10] ZIPCODE keep ์‹ค์ฆ"
99
- data_source: [ko, en]
100
  head_init_base: private_address
101
  - name: DATE
102
  description: ๋‚ ์งœยท์‹œ๊ฐ (์ƒ๋…„์›”์ผ ๋ฏธ๋ถ„๋ฆฌ - ko ๋ฐ์ดํ„ฐ DOB 0๊ฑด + ๊ณผ์ž‰ ๋งˆ์Šคํ‚น ์ค€์ˆ˜ ์ธ์ • ์กฐํ•ญ)
103
  policy_ref: "ํ‘œ2 ์ƒ๋…„์›”์ผ (๋…ธ์ถœ ๊ธˆ์ง€ - DATE ์ „์ฒด ๋งˆ์Šคํ‚น์œผ๋กœ ์ดˆ๊ณผ ์ค€์ˆ˜)"
104
- data_source: [ko, en]
105
  head_init_base: private_date
106
  - name: CARD_EXPIRY
107
- description: ์นด๋“œ์œ ํšจ๊ธฐํ•œ (ํ‘œ2 ๋ฌธ๋งฅ ํ•ญ๋ชฉ ์Šน๊ฒฉ 2026-07-21 - ํ‚ค์›Œ๋“œ regex ์ด์ค‘ ๋ ˆ์ธ ๋ณ‘ํ–‰)
108
  policy_ref: "ํ‘œ2 ์นด๋“œ์œ ํšจ๊ธฐํ•œ (**/** ์ „์ฒด ๋งˆ์Šคํ‚น)"
109
- data_source: [domain] # 1.5m ์›์ฒœ 0๊ฑด - ์ฆ๊ฐ• ์ „๋‹ด (PAN ๋™๋ฐ˜ ๋ฌธ๋งฅ ์ƒ์„ฑ)
110
  head_init_base: private_date
111
  - name: CVC
112
  description: ์นด๋“œ๊ฒ€์ฆ์ฝ”๋“œ (CVC/CVV/CAV ํ†ตํ•ฉ - ํ‘œ2 ๋ฌธ๋งฅ ํ•ญ๋ชฉ ์Šน๊ฒฉ 2026-07-21)
113
  policy_ref: "ํ‘œ2 ์นด๋“œ๊ฒ€์ฆ์ฝ”๋“œ (์ €์žฅยท์ถœ๋ ฅ ๊ธˆ์ง€ -> ๊ฒŒ์ดํŠธ์›จ์ด ์ „์ฒด ๋งˆ์Šคํ‚น ํ•ด์„)"
114
- data_source: [domain] # 1.5m ์›์ฒœ 0๊ฑด - ์ฆ๊ฐ• ์ „๋‹ด (๋‹จ๋… ์ƒ์„ฑ ๊ธˆ์ง€ - PAN ๋™๋ฐ˜ ํ•„์ˆ˜)
115
  head_init_base: account_number
116
  - name: IPIN
117
  description: I-PIN ๋ฒˆํ˜ธ (ํ‘œ2 ๋ฌธ๋งฅ ํ•ญ๋ชฉ ์Šน๊ฒฉ 2026-07-21 - ๊ฐ’ ๊ทœ๊ฒฉ pending)
118
  policy_ref: "ํ‘œ2 I-PIN (๋’ค 5์ž๋ฆฌ - ํ•˜์ดํ”ˆ ๋ฌด๊ด€ ์ˆซ์ž ๊ธฐ์ค€)"
119
- data_source: [domain] # 1.5m ์›์ฒœ 0๊ฑด - ๊ทœ๊ฒฉ ํ™•์ • ์ „ ํŒŒ์ผ๋Ÿฟ ์ˆ˜๏ฟฝ๏ฟฝ๋งŒ
 
 
 
 
 
 
 
 
 
 
120
  head_init_base: account_number
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
 
122
  # -----------------------------------------------------------------------------
123
  # 2. ์†Œ์Šค ๋ผ๋ฒจ ๋งคํ•‘ (ai4privacy 1.5m -> ๋‚ด๋ถ€ ๋ผ๋ฒจ)
124
- # * "O" = ํ•™์Šต์—์„œ ๋น„์—”ํ‹ฐํ‹ฐ ์ฒ˜๋ฆฌ (๋“œ๋กญ ๋ฆฌ์ŠคํŠธ - ์ •์ฑ…ํŒ€ ์ปจํŽŒ ํ›„ ํ™•์ •)
125
  # * ์กฐ๊ฑด๋ถ€ ๋งคํ•‘์€ locale + value_pattern ์•ˆ์ „์žฅ์น˜ ๋™๋ฐ˜
126
  # -----------------------------------------------------------------------------
127
  source_mapping: # <source_mapping>
@@ -132,9 +182,9 @@ source_mapping: # <source_mapping>
132
  label: RRN # <conditional_mapping>
133
  condition:
134
  locale: ko
135
- value_pattern: '^\d{6}-[1-4]\d{6}$' # ์‹ค์ธก 3,975/3,975 ์ •ํ•ฉ - ์•ˆ์ „์žฅ์น˜
136
  fallback: GENERIC_ID # ๋น„์ •ํ•ฉ ๊ฐ’ / ํƒ€ ๋กœ์ผ€์ผ(en ๋ฆฌํ”Œ๋ ˆ์ด)์€ ์„ธ๋ฌด ID -> ๋ฒ”์šฉ ID
137
- SOCIALNUM: GENERIC_ID
138
  IDCARDNUM: GENERIC_ID
139
  DRIVERLICENSENUM: DRIVER_LICENSE
140
  PASSPORTNUM: PASSPORT
@@ -148,31 +198,30 @@ source_mapping: # <source_mapping>
148
  ZIPCODE: ZIPCODE
149
  DATE: DATE
150
  TIME: DATE
151
- AGE: O # 2026-07-21 ๋“œ๋กญ ํ™•์ • - ํ‘œ1ยทํ‘œ2 ๋ฌด๊ทผ๊ฑฐ (quasi-identifier ์กด์น˜์•ˆ ํ๊ธฐ)
152
- GENDER: O # ใ€ƒ
153
- SEX: O # ใ€ƒ (GENDER ์ค‘๋ณต ์†Œ์Šค)
154
  USERNAME: USER_ID
155
- PASSWORD: SECRET # ko 4ยทen 0๊ฑด - ์‹œ๋“œ ๋ฏธ๋ฏธ, ๋ณธ ํ‘œ๋ณธ์€ ๋„๋ฉ”์ธ/ํ•ฉ์„ฑ ์ฆ๊ฐ•
156
- # ๋กฑํ…Œ์ผ (ko <= 40๊ฑด, ํ•™์Šต ๋ผ๋ฒจ ๋ถ€์ ๊ฒฉ) - ์ •์ฑ…ํŒ€ ์ปจํŽŒ ๋Œ€๊ธฐ ๋“œ๋กญ ๋ฆฌ์ŠคํŠธ
157
- ORGANISATION: O
158
- URL: O
159
  AMOUNT: O
160
  COUNTRY: O
161
  CURRENCY: O
162
- BANKNAME: O
163
- TIMEZONE: O
164
  SALARY: O
165
- IPV4: O # ๊ณ ๊ฐ IP๋Š” ํ‘œ2 ํ•ญ๋ชฉ์ด๋‚˜ ko 2๊ฑด - 1์ฐจ regex(ํ‘œ1 IP์ฃผ์†Œ) ์ „๋‹ด
 
 
166
  JOBTITLE: O
167
- HOSPITALNAME: O
168
  ALLERGIES: O
169
- WEIGHT: O # en ์ „์šฉ ๋ผ๋ฒจ (ko 0๊ฑด) - 2026-07-13 en ์ „์ˆ˜ ๊ฒ€์ฆ์—์„œ ๋ฐœ๊ฒฌ, ์ •์ฑ… ์™ธ
170
- HEIGHT: O # validation ์ „์šฉ ํฌ์†Œ ๋ผ๋ฒจ (ko 1๊ฑด + en 1๊ฑด) - 2026-07-22 refine fail-fast๋กœ ๋ฐœ๊ฒฌ, ์ •์ฑ… ์™ธ
171
 
172
  # -----------------------------------------------------------------------------
173
  # 3. ๋ณ‘ํ•ฉ ๊ทœ์น™ (์ •์ œ ์Šคํฌ๋ฆฝํŠธ 2๋‹จ๊ณ„ - ์ธ์ ‘ ์ŠคํŒฌ ๋ณ‘ํ•ฉ, koยทen ๊ณตํ†ต)
174
  # * ๋ณ‘ํ•ฉ์€ ์–ธ์–ด ๊ณตํ†ต (en "John Smith"๋„ ๋‹จ์ผ ์ŠคํŒฌ์ด์–ด์•ผ ํ‘œ2 ์˜๋ฌธ ์„ฑ๋ช… ๊ทœ์น™ ์„ฑ๋ฆฝ)
175
- # * ko ์ „์šฉ์€ ๋ณ‘ํ•ฉ์ด ์•„๋‹ˆ๋ผ ๊ทธ ๋‹ค์Œ์˜ "์ž์—ฐํ™”"(์„ฑ+๋ช… ๋ถ™์—ฌ์“ฐ๊ธฐ - ์ „๋žต๋ฌธ ยง3.4.2 (1) 2๋‹จ๊ณ„)
176
  # * ์ˆœ์„œ ๊ฐ•์ œ ๊ธˆ์ง€: ko ์ฃผ์†Œ๋Š” ํฐ -> ์ž‘, en ์ฃผ์†Œ๋Š” ์ž‘ -> ํฐ ์—ญ์ˆœ - ์ธ์ ‘์„ฑ๋งŒ ์กฐ๊ฑด
177
  #
178
  # * gap_allowed : ๋‘ ์—”ํ‹ฐํ‹ฐ ์‚ฌ์ด์˜ ์ธ์‹ยทํ—ˆ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ ๋ฐ ํŒจํ„ด
@@ -190,53 +239,3 @@ merge_rules: # <merge_rules>
190
  max_gap_chars: 4
191
  gap_allowed: whitespace_or_punct
192
  output_label: ADDRESS
193
-
194
- # -----------------------------------------------------------------------------
195
- # 4. 1์ฐจ regex ์ „๋‹ด ํ•ญ๋ชฉ (๋ชจ๋ธ ๋ผ๋ฒจ ์ œ์™ธ - ๋กœ๊น… ์Šคํ‚ค๋งˆ ํ‚ค์—๋Š” ํฌํ•จ)
196
- # * ํ‘œ1 ์ •ํ˜• ํŒจํ„ด recognizer๊ฐ€ ๊ฒ€์ถœ, ์น˜ํ™˜ ์ •์ฑ…์€ ํ‘œ2 ์ค€์šฉ
197
- # -----------------------------------------------------------------------------
198
- regex_only:
199
- - key: CI
200
- policy_ref: "ํ‘œ1 CI (86์ž+`==` ๊ณ ์ •, lookaround ๊ฒฝ๊ณ„ - ๊ฒ€์ˆ˜ ๋ณด๊ฐ• 2026-07-21) / ํ‘œ2 CI (์•ž 7์ž๋ฆฌ ๋…ธ์ถœ)"
201
- # SHA-512 base64 ๋™ํ˜• ๊ณผํƒ ํ—ˆ์šฉ - ์ •๋ฐ€๋„ ํ•„์š”์‹œ ciยท์—ฐ๊ณ„์ •๋ณด ํ‚ค์›Œ๋“œ ๊ฐ€์ 
202
- - key: IP_ADDRESS
203
- policy_ref: "ํ‘œ1 IP์ฃผ์†Œ (์˜ฅํ…Ÿ 0~255 ์—„๊ฒฉํ˜• - ๊ฒ€์ˆ˜ ๋ณด๊ฐ• 2026-07-21) / ํ‘œ2 ๊ณ ๊ฐ์˜ IP์ฃผ์†Œ (์•ž 3์ž๋ฆฌ = ์ฒซ ์˜ฅํ…Ÿ ๋งˆ์Šคํ‚น ํ•ด์„, IPv4 ํ•œ์ •)"
204
-
205
- # -----------------------------------------------------------------------------
206
- # 4-1. 1์ฐจ regex ๋ณ‘ํ–‰ (์ด์ค‘ ๋ ˆ์ธ) - ๋ชจ๋ธ ๋ผ๋ฒจ์ด๋ฉด์„œ ํ‚ค์›Œ๋“œ regex๋„ ๋ณ‘ํ–‰
207
- # * 2026-07-21 ๋ชจ๋ธ ์Šน๊ฒฉ 3์ข…: ํ‚ค์›Œ๋“œ regex(๊ณ ์ •๋ฐ€ ์ €recall - ๋ช…์‹œ ๋ฌธํ˜•) + ๋ชจ๋ธ(๋ฌดํ‚ค์›Œ๋“œ
208
- # ๋งฅ๋ฝ recall) union - ๋ฌธ๋งฅ ์˜์กด ๊ฒ€์ถœ์€ ๋ชจ๋ธ ๋ ˆ์ธ์˜ ์กด์žฌ ์ด์œ 
209
- # * ํŒจํ„ด ์—”์ง„ ์ „์ œ: Python re (lookbehind ์‚ฌ์šฉ - RE2/Hyperscan ๊ณ„์—ด ๋น„ํ˜ธํ™˜)
210
- # * ์น˜ํ™˜์€ ๊ฐ’ ์บก์ฒ˜๊ทธ๋ฃน๋งŒ (ํ‚ค์›Œ๋“œ ๋ณด์กด = ์ถ”์ ์„ฑ)
211
- # -----------------------------------------------------------------------------
212
- regex_assist:
213
- - key: CARD_EXPIRY
214
- patterns:
215
- keyword: '(?i)(์œ ํšจ\s*๊ธฐ[๊ฐ„ํ•œ]|expir\w*|valid\s*thru)\D{0,12}(0[1-9]|1[0-2])\s*[/.\-]\s*((?:20)?\d\d)(?!\d)'
216
- pan_adjacent: '(0[1-9]|1[0-2])\s*/\s*\d{2}(?!\d)' # ์นด๋“œ๋ฒˆํ˜ธ ๋งค์น˜ ์งํ›„ \D{0,20} ์œˆ๋„์šฐ ๋‚ด์—์„œ๋งŒ ์ ์šฉ
217
- - key: CVC
218
- patterns:
219
- keyword: '(?i)(\b(?:cv[vc]2?|security\s*code)\b|์นด๋“œ\s*๊ฒ€์ฆ\s*(?:๋ฒˆํ˜ธ|์ฝ”๋“œ|๊ฐ’)?|๋ณด์•ˆ\s*์ฝ”๋“œ)\W{0,6}(?!(?:19|20)\d\d(?!\d))(\d{3,4})(?!\d)'
220
- # CIDยทCSC ํ‚ค์›Œ๋“œ ๊ธฐ๋ณธ ์ œ์™ธ (correlation ID ์ถฉ๋Œ). ์ •๋ฐ€๋„ ์˜ต์…˜: PAN co-occurrence ๊ฒŒ์ดํŠธ
221
- - key: IPIN
222
- patterns:
223
- keyword: '(?i)(์•„์ดํ•€|i[-\s]?pin)\s*(?:๋ฒˆํ˜ธ|no\.?)?\D{0,8}(\d{6}[-\s]?\d{7})(?!\d)'
224
- # ์ฃผ๋ฏผ๋ฒˆํ˜ธ ๊ทœ์น™ ์„ ํ–‰ ์ ์šฉ ํ›„ ์ž”์—ฌ๋ถ„๋งŒ IPIN. ๊ฐ’ ๊ทœ๊ฒฉ(13์ž๋ฆฌ ๊ฐ€์ •) ํ™•์ธ ํ•„์š” (pending)
225
-
226
- # -----------------------------------------------------------------------------
227
- # 5. ์Šค์ฝ”ํ”„ ์™ธ - ํ…์ŠคํŠธ ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ํ‘œ2 ํ•ญ๋ชฉ (์„ ์–ธ์  ๊ธฐ๋ก)
228
- # -----------------------------------------------------------------------------
229
- out_of_scope:
230
- - key: VIDEO_PERSONAL_INFO
231
- policy_ref: "ํ‘œ2 ๊ฐœ์ธ์˜์ƒ์ •๋ณด (๊ฒ€์ • ๋ชฉ์  ์™ธ ์ฒ˜๋ฆฌ ๊ธˆ์ง€)"
232
- reason: "ํ…์ŠคํŠธ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹Œ ๋ชจ๋‹ฌ๋ฆฌํ‹ฐ(์ด๋ฏธ์ง€ยท์˜์ƒ) - ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ์ž…๋ ฅ ๊ฒฝ๋กœ๊ฐ€ ์—ด๋ฆฌ๋ฉด
233
- ํ…์ŠคํŠธ ํ•„ํ„ฐ๋ฅผ ์šฐํšŒํ•˜๋ฏ€๋กœ ๋ณ„๋„ ํ†ต์ œ(์ž…๋ ฅ ์ฐจ๋‹จ or ๋น„์ „ ํ•„ํ„ฐ) ํ•„์š”"
234
-
235
- # -----------------------------------------------------------------------------
236
- # 6. ๋ฏธ๊ฒฐ - ์ •์ฑ…ํŒ€ ์ปจํŽŒ ํ•ญ๋ชฉ, TBD
237
- # -----------------------------------------------------------------------------
238
- pending_confirmation:
239
- - "๋“œ๋กญ ๋ฆฌ์ŠคํŠธ(O ๋งคํ•‘) ์ „์ฒด = ๋น„PII ์„ ์–ธ - ํŠนํžˆ ORGANISATIONยทAMOUNTยทSALARY"
240
- - "IPIN ๊ฐ’ ๊ทœ๊ฒฉ (13์ž๋ฆฌ ๊ฐ€์ •) - ์ œ๊ณต๊ธฐ๊ด€ ๊ณ„์•ฝ ํ™•์ธ (CVC ๊ฒ€์ถœ ๊ทœ์น™์€ 2026-07-21 ํ‚ค์›Œ๋“œ ๋™๋ฐ˜ ํŒจํ„ด ์ฑ„ํƒ์œผ๋กœ ํ•ด์†Œ)"
241
- - "SECRET ์‹ ์„ค ์ฑ„ํƒ (2026-07-13) - ํ‘œ2 ์ฒ˜๋ฆฌ๊ธˆ์ง€๋ฅ˜์˜ '๊ฒŒ์ดํŠธ์›จ์ด ์ „์ฒด ๋งˆ์Šคํ‚น' ํ•ด์„์€
242
- ์ •์ฑ…ํŒ€ ์‚ฌํ›„ ์ปจํŽŒ ๋Œ€์ƒ"
 
2
  # Label Mapping - ai4privacy 1.5m ๋ผ๋ฒจ -> ๋‚ด๋ถ€ ํ•™์Šต ๋ผ๋ฒจ ๋งคํ•‘ ํ…Œ์ด๋ธ”
3
  #
4
  # * ์—ญํ• : ๋ชจ๋ธ ํ•™์Šต ๋ผ๋ฒจ = ๋กœ๊น… ์Šคํ‚ค๋งˆ ํ‚ค = ์ •์ฑ… ํ…Œ์ด๋ธ” ํ‚ค์˜ ๋‹จ์ผ ์†Œ์Šค
5
+ # (docs/analysis/2026-07-03-pii-masking-architecture-qna.md [13])
6
  # * ์—ญ์‚ฐ ๊ทผ๊ฑฐ: playbooks/privacy_filter/privacy-filter-policy.md (ํ‘œ 1 ์ •ํ˜• ํŒจํ„ด / ํ‘œ 2 ๋งˆ์Šคํ‚น ๊ธฐ์ค€)
7
+ # * ์‹ค์ธก ๊ทผ๊ฑฐ: docs/analysis/2026-07-03-ai4privacy-1p5m-ko-audit.md
8
+ # * v1 ์‹ ๊ทœ ๊ธฐ์ค€์„ : ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ์…‹ ๋ฒ„์ „์„ ์Šน๊ณ„ํ•˜์ง€ ์•Š๊ณ  29๊ฐœ ๋ชจ๋ธ ๋ผ๋ฒจ๋กœ ์ƒˆ๋กœ ์ƒ์„ฑ
 
 
 
 
9
  # =============================================================================
10
 
11
  version: v1
12
+ date: 2026-09-02
13
  basis:
14
  policy: playbooks/privacy_filter/privacy-filter-policy.md
15
+ audit: docs/analysis/2026-07-03-ai4privacy-1p5m-ko-audit.md
16
 
17
  # -----------------------------------------------------------------------------
18
+ # 1. ๋ชจ๋ธ ํ•™์Šต ๋ผ๋ฒจ (N=29 -> BIOES 4N+1 = 117ํด๋ž˜์Šค)
19
  # * data_source: ๋ผ๋ฒจ ํ‘œ๋ณธ์˜ ์ถœ์ฒ˜ ๋ฆฌ์ŠคํŠธ - ko(1.5m-ko ์ •์ œ๋ณธ) / en(1.5m-en ๋ฆฌํ”Œ๋ ˆ์ด) /
20
+ # synthesis(ํ•ฉ์„ฑ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋Œ€๊ธฐ - ํ—ค๋“œ๋Š” ์œ ์‚ฌ ๋ผ๋ฒจ ํ–‰ ๋ณต์‚ฌ๋กœ init)
21
+ # * RRN์˜ 1.5m ์œ ๋ž˜๋ถ„์€ ko ํ•œ์ • (en TAXNUM์€ GENERIC_ID fallback) - synthesis๋Š” ์ฆ๊ฐ• ๋ฐฉ์‹ B
22
+ # * ํฌ์†Œ ๋ผ๋ฒจ์€ koยทen `synthesis`๋กœ ๋ณด๊ฐ•ํ•˜๋ฉฐ 29์ข… ๋ชจ๋‘ ์–‘ ์–ธ์–ด ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋ชฉํ‘œ๋กœ ํ•จ
 
23
  # -----------------------------------------------------------------------------
24
  model_labels:
25
  - name: PERSON
26
  description: ์„ฑ๋ช… (์„ฑ+์ด๋ฆ„ ๋ณ‘ํ•ฉ ๋‹จ์ผ ์ŠคํŒฌ)
27
  policy_ref: "ํ‘œ2 ์„ฑ๋ช… (๊น€*์šฉ - ์ฒซยท๋ ๊ธ€์ž ์ œ์™ธ) / ํ‘œ2 ์„ฑ๋ช…(์˜๋ฌธ) (์•ž 4์ž๋ฆฌ ๋…ธ์ถœ) - ์น˜ํ™˜ ์‹œ ์Šคํฌ๋ฆฝํŠธ(ํ•œ๊ธ€/์˜๋ฌธ)๋กœ ๊ทœ์น™ ๋ถ„๊ธฐ, full-span ๊ฒฝ๊ณ„ ํ•„์ˆ˜"
28
+ data_source: [ko, en, synthesis]
29
  head_init_base: private_person
30
  - name: RRN
31
  description: ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ
32
  policy_ref: "ํ‘œ1 ์ฃผ๋ฏผ๋ฒˆํ˜ธ / ํ‘œ2 ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ (๋’ค 7์ž๋ฆฌ ๋งˆ์Šคํ‚น)"
33
+ data_source: [ko, synthesis] # synthesis = ์ฆ๊ฐ• ๋ฐฉ์‹ B ์‹ ๊ทœ ์ƒ์„ฑ๋ถ„ (์ „๋žต๋ฌธ ยง3.3.1)
34
  head_init_base: account_number
35
  - name: FRN
36
  description: ์™ธ๊ตญ์ธ๋“ฑ๋ก๋ฒˆํ˜ธ (์‹ ์„ค - 1.5m ์†Œ์Šค 0๊ฑด)
37
  policy_ref: "ํ‘œ1 ์™ธ๊ตญ์ธ๋“ฑ๋ก๋ฒˆํ˜ธ ([5-8] ์‹œ์ž‘) / ํ‘œ2 ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ(์™ธ๊ตญ์ธ๋“ฑ๋ก๋ฒˆํ˜ธ ํฌํ•จ) (๋’ค 7์ž๋ฆฌ)"
38
+ data_source: [synthesis]
39
  head_init_from: RRN
40
+ - name: SSN
41
+ description: ์‚ฌํšŒ๋ณด์žฅ๋ฒˆํ˜ธ ๊ณ„์—ด (ai4privacy koยทen SOCIALNUM - ๋ฏธ๊ตญ 9์ž๋ฆฌ๋กœ ํ•œ์ •ํ•˜์ง€ ์•Š๊ณ  ์›์ฒœ ํ˜•์‹ ๋ณด์กด)
42
+ policy_ref: "data-preprocessing-strategy ยง3.2 ๋ฐ ยง3.3.1 - koยทen SOCIALNUM ์ง์ ‘ ๋งคํ•‘, ์ „์ฒด ๋งˆ์Šคํ‚น"
43
+ data_source: [ko, en, synthesis]
44
+ head_init_base: account_number
45
+ - name: GENERIC_ID
46
+ description: ํŠน์ • ๊ตญ๊ฐ€๋ณ„ ์„ธ๋ถ€ taxonomy๋กœ ํ™•์ •ํ•˜์ง€ ๋ชปํ•œ ์‹ ๋ถ„์ฆ ๋ฒˆํ˜ธ์™€ ์„ธ๋ฌด ์‹๋ณ„๋ฒˆํ˜ธ๋ฅผ ์ˆ˜์šฉํ•˜๋Š” ๋ฒ”์šฉ ์‹๋ณ„์ž
47
+ policy_ref: "audit ยง5 - koยทen IDCARDNUM ๋ฐ en TAXNUM fallback"
48
+ data_source: [ko, en, synthesis]
49
+ head_init_base: account_number
50
  - name: CARD_NUMBER
51
  description: ์‹ ์šฉ/์ฒดํฌ์นด๋“œ ๋ฒˆํ˜ธ
52
  policy_ref: "ํ‘œ1 ์นด๋“œ๋ฒˆํ˜ธ / ํ‘œ2 ์นด๋“œ๋ฒˆํ˜ธ (7~12๋ฒˆ์งธ ์ž๋ฆฌ, PCI-DSS)"
53
+ data_source: [ko, en, synthesis] # synthesis = ์ฆ๊ฐ• ๋ฐฉ์‹ B ์‹ ๊ทœ ์ƒ์„ฑ๋ถ„ (์ „๋žต๋ฌธ ยง3.3.1)
54
  head_init_base: account_number
55
  - name: ACCOUNT_NUMBER
56
+ description: ๊ณ„์ขŒ๋ฒˆํ˜ธ
57
  policy_ref: "ํ‘œ1 ๊ณ„์ขŒ๋ฒˆํ˜ธ (์ „ํ™”๋ฒˆํ˜ธ ํก์ˆ˜ ์œ„ํ—˜ - recognizer ์šฐ์„ ์ˆœ์œ„ ํ•„์š”) / ํ‘œ2 ๊ณ„์ขŒ๋ฒˆํ˜ธ (๋’ค 5์ž๋ฆฌ)"
58
+ data_source: [ko, en, synthesis] # ko 5ยทen 1๊ฑด ์‹ค์ธก - ํ•ฉ์„ฑ ์ฆ๊ฐ• ํ•„์ˆ˜ (์€ํ–‰๋ณ„ ํฌ๋งท ๊ทœ์น™ ์ƒ์„ฑ ์šฉ์ด)
59
  head_init_base: account_number
60
  - name: SECRET
61
  description: ์ธ์ฆ ์‹œํฌ๋ฆฟ (๋น„๋ฐ€๋ฒˆํ˜ธยทAPI ํ‚คยทํ† ํฐ ํ†ตํ•ฉ - ์นด๋“œ/ํšŒ์›/ISP ๊ตฌ๋ถ„์€ ๋ฌธ๋งฅ ๋ถˆ๊ฐ€ + ์•ก์…˜ ๋™์ผ)
62
  policy_ref: "ํ‘œ2 ์นด๋“œ๋น„๋ฐ€๋ฒˆํ˜ธยท์˜จ๋ผ์ธ ํšŒ์› ํŒจ์Šค์›Œ๋“œยทISP๋น„๋ฐ€๋ฒˆํ˜ธ (์ฒ˜๋ฆฌ ๊ธˆ์ง€ -> ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ๋Š” LLM ๋…ธ์ถœ ๊ธˆ์ง€ = ์ „์ฒด ๋งˆ์Šคํ‚น์œผ๋กœ ํ•ด์„)"
63
+ data_source: [ko, synthesis] # PASSWORD ko 5๊ฑด ์‹ค์ธก + ํ•ฉ์„ฑ ์ฆ๊ฐ•
64
  head_init_base: secret # base 8์ข… ์ค‘ secret ํ–‰ ์ •ํ™• ๋ณต์‚ฌ (์ธ์ ‘ ์•„๋‹Œ ์ง๊ณ„ ์ƒ์†)
65
  - name: USER_ID
66
+ description: ์˜จ๋ผ์ธ ํšŒ์› ID
67
  policy_ref: "ํ‘œ2 ์˜จ๋ผ์ธ ํšŒ์› ID (์•ž 2์ž๋ฆฌ ์ œ์™ธ)"
68
+ data_source: [ko, en, synthesis] # ko 4ยทen 20๊ฑด ์‹ค์ธก - ์ฆ๊ฐ• ํ•„์ˆ˜
69
  head_init_base: account_number
70
  - name: EMAIL
71
  description: ์ด๋ฉ”์ผ ์ฃผ์†Œ
72
  policy_ref: "ํ‘œ1 ์ด๋ฉ”์ผ / ํ‘œ2 ์ด๋ฉ”์ผ์ฃผ์†Œ (ID ์•ž 2์ž๋ฆฌ ์ œ์™ธ ๋งˆ์Šคํ‚น)"
73
+ data_source: [ko, en, synthesis]
74
  head_init_base: private_email
75
  - name: PHONE
76
  description: ์ „ํ™”๋ฒˆํ˜ธ (ํœด๋Œ€ํฐ/์ผ๋ฐ˜์ „ํ™” ํ†ตํ•ฉ - ์น˜ํ™˜ ๋‹จ๊ณ„์—์„œ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์žฌ๋ถ„๋ฅ˜)
77
  policy_ref: "ํ‘œ1 ํœด๋Œ€ํฐ๋ฒˆํ˜ธยท์ „ํ™”๋ฒˆํ˜ธ / ํ‘œ2 ๊ธฐ๋ณธ ๋’ค 6์ž๋ฆฌ ๊ณตํ†ต - ๋‚ด๋ถ€๋ง ์ฑ„๋„ ํ•œ์ • ํœด๋Œ€ํฐ
78
  ๋’ค 4์ž๋ฆฌ ์™„ํ™” (์น˜ํ™˜ ์‹œ ๊ฐ’ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ํœด๋Œ€ํฐ ํŒ๋ณ„ + ์ฑ„๋„ ์ถ• ๋ถ„๊ธฐ)"
79
+ data_source: [ko, en, synthesis]
80
  head_init_base: private_phone
81
  - name: PASSPORT
82
  description: ์—ฌ๊ถŒ๋ฒˆํ˜ธ (๋ถ„๋ฆฌ ์œ ์ง€ - ๋งˆ์Šคํ‚น ๊ธฐ์ค€ ์ƒ์ด + ko 3,211๊ฑด)
83
  policy_ref: "ํ‘œ1 ์—ฌ๊ถŒ๋ฒˆํ˜ธ / ํ‘œ2 ์—ฌ๊ถŒ๋ฒˆํ˜ธ (๋’ค 4์ž๋ฆฌ)"
84
+ data_source: [ko, en, synthesis]
85
  head_init_base: account_number
86
  - name: DRIVER_LICENSE
87
  description: ์šด์ „๋ฉดํ—ˆ๋ฒˆํ˜ธ (๋ถ„๋ฆฌ ์œ ์ง€ - ๋งˆ์Šคํ‚น ๊ธฐ์ค€ ์ƒ์ด + ko 4,092๊ฑด)
88
  policy_ref: "ํ‘œ1 ์šด์ „๋ฉดํ—ˆ๋ฒˆํ˜ธ / ํ‘œ2 ์šด์ „๋ฉดํ—ˆ๋ฒˆํ˜ธ (์ค‘๊ฐ„ 6์ž๋ฆฌ)"
89
+ data_source: [ko, en, synthesis]
 
 
 
 
 
90
  head_init_base: account_number
91
  - name: ADDRESS
92
  description: ์ฃผ์†Œ (์‹œยท๋„๋กœ๋ช…ยท๊ฑด๋ฌผ๋ฒˆํ˜ธ ํ†ตํ•ฉ ์ŠคํŒฌ - ์น˜ํ™˜ ๋‹จ๊ณ„์—์„œ ์ˆซ์ž ์„œ๋ธŒ๋งˆ์Šคํ‚น)
93
  policy_ref: "ํ‘œ2 ์ฃผ์†Œ (์ง€๋ฒˆ: ์/๋ฉด/๋™ ๋ฏธ๋งŒ ์ˆซ์ž / ๋„๋กœ๋ช…: ๊ฑด๋ฌผ๋ฒˆํ˜ธยท์ƒ์„ธ์ฃผ์†Œ ์ˆซ์ž ๋งˆ์Šคํ‚น -> ์ŠคํŒฌ ๋‚ด ๊ทœ์น™ ์น˜ํ™˜)"
94
+ data_source: [ko, en, synthesis]
95
  head_init_base: private_address
96
  - name: ZIPCODE
97
+ description: ์šฐํŽธ๋ฒˆํ˜ธ (ADDRESS์™€ ๋ถ„๋ฆฌ๋œ ๋…๋ฆฝ ์ŠคํŒฌ)
98
+ policy_ref: "data-preprocessing-strategy ยง3.2 ๋ฐ ยง3.3.1"
99
+ data_source: [ko, en, synthesis]
100
  head_init_base: private_address
101
  - name: DATE
102
  description: ๋‚ ์งœยท์‹œ๊ฐ (์ƒ๋…„์›”์ผ ๋ฏธ๋ถ„๋ฆฌ - ko ๋ฐ์ดํ„ฐ DOB 0๊ฑด + ๊ณผ์ž‰ ๋งˆ์Šคํ‚น ์ค€์ˆ˜ ์ธ์ • ์กฐํ•ญ)
103
  policy_ref: "ํ‘œ2 ์ƒ๋…„์›”์ผ (๋…ธ์ถœ ๊ธˆ์ง€ - DATE ์ „์ฒด ๋งˆ์Šคํ‚น์œผ๋กœ ์ดˆ๊ณผ ์ค€์ˆ˜)"
104
+ data_source: [ko, en, synthesis]
105
  head_init_base: private_date
106
  - name: CARD_EXPIRY
107
+ description: ์นด๋“œ์œ ํšจ๊ธฐํ•œ
108
  policy_ref: "ํ‘œ2 ์นด๋“œ์œ ํšจ๊ธฐํ•œ (**/** ์ „์ฒด ๋งˆ์Šคํ‚น)"
109
+ data_source: [synthesis] # 1.5m ์›์ฒœ 0๊ฑด - ์ฆ๊ฐ• ์ „๋‹ด (PAN ๋™๋ฐ˜ ๋ฌธ๋งฅ ์ƒ์„ฑ)
110
  head_init_base: private_date
111
  - name: CVC
112
  description: ์นด๋“œ๊ฒ€์ฆ์ฝ”๋“œ (CVC/CVV/CAV ํ†ตํ•ฉ - ํ‘œ2 ๋ฌธ๋งฅ ํ•ญ๋ชฉ ์Šน๊ฒฉ 2026-07-21)
113
  policy_ref: "ํ‘œ2 ์นด๋“œ๊ฒ€์ฆ์ฝ”๋“œ (์ €์žฅยท์ถœ๋ ฅ ๊ธˆ์ง€ -> ๊ฒŒ์ดํŠธ์›จ์ด ์ „์ฒด ๋งˆ์Šคํ‚น ํ•ด์„)"
114
+ data_source: [synthesis] # 1.5m ์›์ฒœ 0๊ฑด - ์ฆ๊ฐ• ์ „๋‹ด (๋‹จ๋… ์ƒ์„ฑ ๊ธˆ์ง€ - PAN ๋™๋ฐ˜ ํ•„์ˆ˜)
115
  head_init_base: account_number
116
  - name: IPIN
117
  description: I-PIN ๋ฒˆํ˜ธ (ํ‘œ2 ๋ฌธ๋งฅ ํ•ญ๋ชฉ ์Šน๊ฒฉ 2026-07-21 - ๊ฐ’ ๊ทœ๊ฒฉ pending)
118
  policy_ref: "ํ‘œ2 I-PIN (๋’ค 5์ž๋ฆฌ - ํ•˜์ดํ”ˆ ๋ฌด๊ด€ ์ˆซ์ž ๊ธฐ์ค€)"
119
+ data_source: [synthesis] # 1.5m ์›์ฒœ 0๊ฑด - ๊ทœ๊ฒฉ ํ™•์ • ์ „ ํŒŒ์ผ๋Ÿฟ ์ˆ˜๋Ÿ‰๋งŒ
120
+ head_init_base: account_number
121
+ - name: TRANSACTION_APPROVAL_ID
122
+ description: ์นด๋“œ ๊ฒฐ์ œ ๊ฑฐ๋ž˜ ์Šน์ธ๋ฒˆํ˜ธ (์Šน์ธ๋ฒˆํ˜ธยท๊ฒฐ์ œ ์Šน์ธ๋ฒˆํ˜ธ ๋ฌธ๋งฅ์˜ 8์ž๋ฆฌ ์‹๋ณ„์ž)
123
+ policy_ref: "data-preprocessing-supplementation ยง1 ๊ธˆ์œต ๋ฐ VOC/CS ์˜์—ญ (๋งˆ์Šคํ‚น ๊ธฐ์ค€ ์ •์ฑ… ํ…Œ์ด๋ธ” ๋ฐ˜์˜ ํ•„์š”)"
124
+ data_source: [synthesis]
125
+ head_init_base: account_number
126
+ - name: BUSINESS_ID
127
+ description: ์‚ฌ์—…์ž๋ฒˆํ˜ธยท๊ฐ€๋งน์ ๋ฒˆํ˜ธ ํ†ตํ•ฉ ์‹๋ณ„์ž (์‚ฌ์—…์ž๋ฒˆํ˜ธ 10์ž๋ฆฌยท๊ฐ€๋งน์ ๋ฒˆํ˜ธ 9์ž๋ฆฌ)
128
+ policy_ref: "data-preprocessing-supplementation ยง1 ๊ธˆ์œต ๋ฐ VOC/CS ์˜์—ญ (๋งˆ์Šคํ‚น ๊ธฐ์ค€ ์ •์ฑ… ํ…Œ์ด๋ธ” ๋ฐ˜์˜ ํ•„์š”)"
129
+ data_source: [synthesis]
130
  head_init_base: account_number
131
+ - name: VIRTUAL_CARD_NUMBER
132
+ description: ๋Œ€์ฒด์นด๋“œ๋ฒˆํ˜ธยท๊ฐ€์ƒ์นด๋“œ๋ฒˆํ˜ธ (๋Œ€์ฒด์นด๋“œ๋ฒˆํ˜ธ ๋ฌธ๋งฅ์˜ 11์ž๋ฆฌ ์‹๋ณ„์ž)
133
+ policy_ref: "data-preprocessing-supplementation ยง1 ๊ธˆ์œต ๋ฐ VOC/CS ์˜์—ญ (๋งˆ์Šคํ‚น ๊ธฐ์ค€ ์ •์ฑ… ํ…Œ์ด๋ธ” ๋ฐ˜์˜ ํ•„์š”)"
134
+ data_source: [synthesis]
135
+ head_init_base: account_number
136
+ - name: CI
137
+ description: ์—ฐ๊ณ„์ •๋ณด (Connecting Information, 86์ž base64 ๋ณธ๋ฌธ + == ํŒจ๋”ฉ)
138
+ policy_ref: "ํ‘œ1 CI (86์ž+`==` ๊ณ ์ •, lookaround ๊ฒฝ๊ณ„) / ํ‘œ2 CI (์•ž 7์ž๋ฆฌ ๋…ธ์ถœ)"
139
+ data_source: [synthesis]
140
+ head_init_base: account_number
141
+ - name: IPADDRESS
142
+ description: IPv4 ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ
143
+ policy_ref: "ํ‘œ1 IP์ฃผ์†Œ / ํ‘œ2 ๊ณ ๊ฐ IP์ฃผ์†Œ - ์ „์ฒด ๋งˆ์Šคํ‚น"
144
+ data_source: [ko, en, synthesis]
145
+ head_init_base: private_url
146
+ - name: MACADDRESS
147
+ description: ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์˜ 48๋น„ํŠธ MAC ์ฃผ์†Œ
148
+ policy_ref: "data-preprocessing-strategy ยง3.2 ๋ฐ ยง3.3.1 - ์ „์ฒด ๋งˆ์Šคํ‚น"
149
+ data_source: [synthesis]
150
+ head_init_base: account_number
151
+ - name: IMEI
152
+ description: ์ด๋™ํ†ต์‹  ๋‹จ๋ง์˜ 15์ž๋ฆฌ ๊ตญ์ œ ๋‹จ๋ง๊ธฐ ์‹๋ณ„๋ฒˆํ˜ธ
153
+ policy_ref: "data-preprocessing-strategy ยง3.2 ๋ฐ ยง3.3.1 - ์ „์ฒด ๋งˆ์Šคํ‚น"
154
+ data_source: [synthesis]
155
+ head_init_base: account_number
156
+ - name: PORT
157
+ description: ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค ํฌํŠธ ๋ฒˆํ˜ธ (0~65535) - ๊ณผํƒ ์–ต์ œ์šฉ ๋น„PII ๋ผ๋ฒจ
158
+ policy_ref: "data-preprocessing-strategy ยง3.2 ๋ฐ ยง3.3.1"
159
+ data_source: [synthesis]
160
+ head_init_base: private_url
161
+ - name: ORGANIZATION
162
+ description: ํšŒ์‚ฌยท์€ํ–‰ยท๋ณ‘์› ๋“ฑ ์กฐ์ง๋ช… - PERSONยทADDRESS ๊ณผํƒ ์–ต์ œ์šฉ ๋น„PII ๋ผ๋ฒจ
163
+ policy_ref: "data-preprocessing-strategy ยง2.1.1 ๋ฐ ยง3.2"
164
+ data_source: [ko, en, synthesis]
165
+ head_init_base: private_person
166
+ - name: URL
167
+ description: ์›น URL - ๊ฒฝ๋กœยท์ฟผ๋ฆฌยทํ† ํฐ์„ ํฌํ•จํ•œ ์ „์ฒด URL์„ ๋‹จ์ผ ์ŠคํŒฌ์œผ๋กœ ๊ฒ€์ถœ
168
+ policy_ref: "data-preprocessing-strategy ยง3.2 ๋ฐ ยง3.3.1"
169
+ data_source: [ko, en, synthesis]
170
+ head_init_base: private_url
171
 
172
  # -----------------------------------------------------------------------------
173
  # 2. ์†Œ์Šค ๋ผ๋ฒจ ๋งคํ•‘ (ai4privacy 1.5m -> ๋‚ด๋ถ€ ๋ผ๋ฒจ)
174
+ # * "O" = ํ•™์Šต์—์„œ ๋น„์—”ํ‹ฐํ‹ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  privacy_mask์—์„œ ์ œ๊ฑฐ
175
  # * ์กฐ๊ฑด๋ถ€ ๋งคํ•‘์€ locale + value_pattern ์•ˆ์ „์žฅ์น˜ ๋™๋ฐ˜
176
  # -----------------------------------------------------------------------------
177
  source_mapping: # <source_mapping>
 
182
  label: RRN # <conditional_mapping>
183
  condition:
184
  locale: ko
185
+ value_pattern: '^\d{6}-[1-4]\d{6}$'
186
  fallback: GENERIC_ID # ๋น„์ •ํ•ฉ ๊ฐ’ / ํƒ€ ๋กœ์ผ€์ผ(en ๋ฆฌํ”Œ๋ ˆ์ด)์€ ์„ธ๋ฌด ID -> ๋ฒ”์šฉ ID
187
+ SOCIALNUM: SSN
188
  IDCARDNUM: GENERIC_ID
189
  DRIVERLICENSENUM: DRIVER_LICENSE
190
  PASSPORTNUM: PASSPORT
 
198
  ZIPCODE: ZIPCODE
199
  DATE: DATE
200
  TIME: DATE
201
+ TIMEZONE: O
 
 
202
  USERNAME: USER_ID
203
+ PASSWORD: SECRET
204
+ ORGANISATION: ORGANIZATION
205
+ IPV4: IPADDRESS
206
+ URL: URL
207
  AMOUNT: O
208
  COUNTRY: O
209
  CURRENCY: O
210
+ BANKNAME: ORGANIZATION
 
211
  SALARY: O
212
+ AGE: O
213
+ GENDER: O
214
+ SEX: O
215
  JOBTITLE: O
216
+ HOSPITALNAME: ORGANIZATION
217
  ALLERGIES: O
218
+ WEIGHT: O
219
+ HEIGHT: O
220
 
221
  # -----------------------------------------------------------------------------
222
  # 3. ๋ณ‘ํ•ฉ ๊ทœ์น™ (์ •์ œ ์Šคํฌ๋ฆฝํŠธ 2๋‹จ๊ณ„ - ์ธ์ ‘ ์ŠคํŒฌ ๋ณ‘ํ•ฉ, koยทen ๊ณตํ†ต)
223
  # * ๋ณ‘ํ•ฉ์€ ์–ธ์–ด ๊ณตํ†ต (en "John Smith"๋„ ๋‹จ์ผ ์ŠคํŒฌ์ด์–ด์•ผ ํ‘œ2 ์˜๋ฌธ ์„ฑ๋ช… ๊ทœ์น™ ์„ฑ๋ฆฝ)
224
+ # * ko ์ „์šฉ์€ ๋ณ‘ํ•ฉ์ด ์•„๋‹ˆ๋ผ ๊ทธ ๋‹ค์Œ์˜ "์ž์—ฐํ™”"(์„ฑ+๋ช… ๋ถ™์—ฌ์“ฐ๊ธฐ - ์ „๋žต๋ฌธ ยง3.4.1 2๋‹จ๊ณ„)
225
  # * ์ˆœ์„œ ๊ฐ•์ œ ๊ธˆ์ง€: ko ์ฃผ์†Œ๋Š” ํฐ -> ์ž‘, en ์ฃผ์†Œ๋Š” ์ž‘ -> ํฐ ์—ญ์ˆœ - ์ธ์ ‘์„ฑ๋งŒ ์กฐ๊ฑด
226
  #
227
  # * gap_allowed : ๋‘ ์—”ํ‹ฐํ‹ฐ ์‚ฌ์ด์˜ ์ธ์‹ยทํ—ˆ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ ๋ฐ ํŒจํ„ด
 
239
  max_gap_chars: 4
240
  gap_allowed: whitespace_or_punct
241
  output_label: ADDRESS
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
model.safetensors CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:9beec7575336b7c05ee59d7da9dfd25027b241ae5507e1ac4f7a04d7a10d83cb
3
- size 2799040778
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:685b29cf27a95edd56a36b391941b26ee3979be68ce9d57ea5856bb7644bf18b
3
+ size 2799097186