becleverksh commited on
Commit
ad336d5
ยท
verified ยท
1 Parent(s): f065c66

Upload int8-weight-only release artifact

Browse files
.gitattributes CHANGED
@@ -33,3 +33,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ figures/evaluation-test-1-1.png filter=lfs diff=lfs merge=lfs -text
37
+ figures/evaluation-train-1-1.png filter=lfs diff=lfs merge=lfs -text
38
+ model_quantized.onnx_data filter=lfs diff=lfs merge=lfs -text
39
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,408 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - ko
4
+ - en
5
+ license: apache-2.0
6
+ library_name: onnxruntime
7
+ pipeline_tag: token-classification
8
+ inference: false
9
+ base_model: openai/privacy-filter
10
+ tags:
11
+ - onnx
12
+ - onnxruntime
13
+ - int8
14
+ - weight-only
15
+ - token-classification
16
+ - ner
17
+ - pii
18
+ - privacy
19
+ - pii-masking
20
+ - korean
21
+ - finance
22
+ - bioes
23
+ - viterbi
24
+ - mixture-of-experts
25
+ datasets:
26
+ - BCCard/pii-masking-openpii-finance
27
+ metrics:
28
+ - f1
29
+ - precision
30
+ - recall
31
+ ---
32
+
33
+ # 1. Overview
34
+ This repository provides the INT8 weight-only ONNX Runtime serving artifact for a Korean/English PII detection model for the finance domain. The model was built by full fine-tuning [`openai/privacy-filter`](https://huggingface.co/openai/privacy-filter) - a 1.4B-parameter MoE with 50M active parameters - on synthetic finance-domain PII data. It tags 18 PII entity types using 73
35
+ BIOES token classes at token level.
36
+
37
+ The model is designed as the NER layer of a multi-layer PII-masking gateway in front of LLM services. It should be deployed with a deterministic regex backstop for fully structured identifiers and must not be treated as a standalone anonymization, compliance or privacy guarantee. High-sensitivity deployments require in-domain evaluation and ongoing monitoring.
38
+
39
+ This repository does not contain PyTorch weights. `AutoModelForTokenClassification.from_pretrained()`
40
+ and the standard Transformers token-classification pipeline therefore do not load this artifact. Use ONNX Runtime as shown in [Usage](#13-usage).
41
+
42
+ The serving chain is:
43
+
44
+ ```text
45
+ text
46
+ -> tokenizer
47
+ -> INT8 weight-only ONNX graph
48
+ -> FP32 logits
49
+ -> constrained BIOES Viterbi
50
+ -> character-offset spans
51
+ -> whitespace boundary refinement
52
+ ```
53
+
54
+ ## 1.1. TL;DR
55
+ * **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
56
+ * **Domain / Language**: Finance (BC Card โ€” cards, accounts, national IDs, customer service text) / Korean + English
57
+ * **Task**: Token classification (BIOES) โ†’ character-offset PII spans โ†’ masking
58
+ * **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`
59
+ * **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)
60
+ * **Decoding**: **constrained BIOES Viterbi** (not per-token argmax) + whitespace span refinement โ€” the bundled `viterbi_calibration.json` exposes precisionโ†”recall operating-point biases without retraining
61
+ * **Format**: INT8 weight-only ONNX (`MatMulNBits`, `QMoE`, `GatherBlockQuantized`) with FP32 activations and logits; graph + external tensor data + tokenizer + label taxonomy + Viterbi calibration sidecar
62
+ * **Sequence length**: trained on sequences โ‰ค768 tokens โ€” chunk longer inputs
63
+ * **Intended use**
64
+ - In-house **PII masking gateway** (detect โ†’ mask before text reaches an LLM)
65
+ - Korean-centric finance text with mixed English (IDs, e-mails, card numbers)
66
+
67
+ ## 1.2. Label Taxonomy (N=18)
68
+ 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.
69
+
70
+ | label | description | data source |
71
+ |-------|-------------|-------------|
72
+ | `PERSON` | full name (surname + given, single span) | ko, en, domain |
73
+ | `RRN` | resident registration number (Korea) | ko, domain |
74
+ | `FRN` | foreign registration number | domain |
75
+ | `CARD_NUMBER` | credit/debit card PAN | ko, en, domain |
76
+ | `ACCOUNT_NUMBER` | bank account number | ko, domain |
77
+ | `SECRET` | auth secret (password / API key / token) | ko, domain |
78
+ | `USER_ID` | online member ID | ko, en, domain |
79
+ | `EMAIL` | email address | ko, en, domain |
80
+ | `PHONE` | phone number (mobile / landline) | ko, en, domain |
81
+ | `PASSPORT` | passport number | ko, en, domain |
82
+ | `DRIVER_LICENSE` | driver's license number | ko, en, domain |
83
+ | `GENERIC_ID` | generic identifier (no KO counterpart) | ko, en, domain |
84
+ | `ADDRESS` | address (city / street / building, single span) | ko, en, domain |
85
+ | `ZIPCODE` | postal code | ko, en, domain |
86
+ | `DATE` | date / time | ko, en, domain |
87
+ | `CARD_EXPIRY` | card expiry date | domain |
88
+ | `CVC` | card verification code | domain |
89
+ | `IPIN` | I-PIN number | domain |
90
+
91
+ Each entity type has `B-`, `I-`, `E-` and `S-` boundary classes, plus the background class `O`. This yields 73 output classes. The bundled `label-taxonomy.yaml` and `config.json` must remain in the same label order.
92
+
93
+ ## 1.3. Usage
94
+ Install the CPU runtime and client dependencies:
95
+
96
+ ```bash
97
+ pip install "onnxruntime>=1.28,<1.29" "huggingface-hub>=1.5" "transformers>=5.6" numpy
98
+ ```
99
+
100
+ The following example downloads the repository and runs the INT8 ONNX graph. To reproduce the validated output, use the functions in [Viterbi Reference Implementation](#43-viterbi-reference-implementation)
101
+ to apply constrained BIOES decoding and recover refined character-offset spans. Independent token argmax is not equivalent to the validated decoding chain.
102
+
103
+ ```python
104
+ import json
105
+ from pathlib import Path
106
+
107
+ import numpy as np
108
+ import onnxruntime as ort
109
+
110
+ from huggingface_hub import snapshot_download
111
+ from transformers import AutoTokenizer
112
+
113
+ model_id = "BCCard/MoAI-Privacy-Filter-INT8"
114
+ model_dir = Path(snapshot_download(repo_id=model_id))
115
+ tokenizer = AutoTokenizer.from_pretrained(model_dir)
116
+ config = json.loads((model_dir / "config.json").read_text(encoding="utf-8"))
117
+ labels = tuple(
118
+ config["id2label"][str(index)]
119
+ for index in range(len(config["id2label"]))
120
+ )
121
+ calibration = json.loads(
122
+ (model_dir / "viterbi_calibration.json").read_text(encoding="utf-8")
123
+ )
124
+ biases = calibration["operating_points"]["default"]["biases"]
125
+
126
+ session = ort.InferenceSession(
127
+ str(model_dir / "model_quantized.onnx"),
128
+ providers=["CPUExecutionProvider"],
129
+ )
130
+ text = "๊ณ ๊ฐ ๋ชจ์•„์ด๋‹˜(000000-0000000)๊ป˜์„œ 010-0000-0000๋กœ ์—ฐ๋ฝ ์š”์ฒญํ•˜์…จ์Šต๋‹ˆ๋‹ค."
131
+ encoding = tokenizer(
132
+ text,
133
+ return_offsets_mapping=True,
134
+ add_special_tokens=False,
135
+ return_tensors="np",
136
+ )
137
+ offsets = encoding.pop("offset_mapping")[0].tolist()
138
+ feeds = {
139
+ model_input.name: np.asarray(encoding[model_input.name], dtype=np.int64)
140
+ for model_input in session.get_inputs()
141
+ }
142
+ logits = session.run(["logits"], feeds)[0]
143
+ length = int(feeds["attention_mask"][0].sum())
144
+
145
+ # Copy constrained_viterbi() and decode_spans() from Section 4.3.
146
+ path = constrained_viterbi(logits[0, :length], labels, biases)
147
+ tags = [labels[class_id] for class_id in path]
148
+ spans = decode_spans(tags, offsets[:length], text)
149
+
150
+ print(logits.shape)
151
+ print(spans)
152
+ ```
153
+
154
+ Output from the INT8 graph:
155
+
156
+ ```text
157
+ (1, 30, 73)
158
+ [
159
+ {'start': 3, 'end': 6, 'label': 'PERSON'},
160
+ {'start': 8, 'end': 22, 'label': 'RRN'},
161
+ {'start': 26, 'end': 39, 'label': 'PHONE'}
162
+ ]
163
+ ```
164
+
165
+ The offsets use Python's half-open character interval `[start, end)`. Masking is downstream policy logic. For example, the spans above can produce:
166
+
167
+ ```text
168
+ ๊ณ ๊ฐ [PERSON]๋‹˜([RRN])๊ป˜์„œ [PHONE]๋กœ ์—ฐ๋ฝ ์š”์ฒญํ•˜์…จ์Šต๋‹ˆ๋‹ค.
169
+ ```
170
+
171
+ For batches, enable right padding and pass only `input_ids` and `attention_mask` to the graph. `offset_mapping` stays outside ONNX and is used only to map decoded token tags back to the original text. Inputs are INT64 and the graph always returns FP32 logits.
172
+
173
+
174
+ ## 1.4. Training Data
175
+ | Dataset | Role | Size |
176
+ |---------|------|------|
177
+ | (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 |
178
+ | (Private) BCCard/pii-masking-openpii-finance-test (v2) | Golden Set (release gate; never used for training/tuning) | 2,000 rows (ko 1,460 / en 540) |
179
+
180
+ * 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** (forgetting guard)
181
+ * 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
182
+ * All values are synthetic; validity-pattern collisions with real identifiers are removed at generation time (e.g. card numbers are forced to fail Luhn)
183
+
184
+
185
+ ## 1.5. Training Procedure
186
+ | Item | Value |
187
+ |------|-------|
188
+ | Method | Full fine-tuning (1.4B params โ€” experts and router included) |
189
+ | Head | 33-class base head โ†’ 73-class head, initialized by copying base rows via taxonomy mapping |
190
+ | Loss | Token-level cross-entropy |
191
+ | Batch | effective 16 (per-device ร— world ร— accum), fixed across hardware layouts |
192
+ | LR / scheduler | 1e-4 / linear decay, warmup 3% |
193
+ | Optimizer | AdamW (fused), weight decay 0.0, max_grad_norm 1.0 |
194
+ | Epochs | 5 โ€” best checkpoint by validation span micro-F1, **decoded with the same constrained Viterbi as deployment** |
195
+ | Precision | FP32 master weights + BF16 autocast; MoE router/experts explicitly kept FP32 during compute |
196
+ | Hardware | 1ร— NVIDIA H100 (~5h) |
197
+
198
+ <div align="center">
199
+ <img src="figures/evaluation-train-1-1.png" alt="Training loss, learning-rate and gradient-norm curves for the v1 and v2 models" >
200
+ </div>
201
+
202
+ <div align="center">
203
+ <img src="figures/evaluation-test-1-1.png" alt="Training-time validation metric curves for the v1 and v2 models" >
204
+ </div>
205
+
206
+ <br>
207
+
208
+ # 2. Evaluation
209
+ ## 2.1. INT8 Validation Results
210
+ The INT8 artifact was evaluated on all 14,543 v2 validation rows with the same tokenizer, actual character offsets, constrained Viterbi decoder and whitespace refinement used in the serving example.
211
+
212
+ | Metric | INT8 ONNX |
213
+ |---|---:|
214
+ | strict micro F1 | 0.9599 |
215
+ | macro F1 | 0.9607 |
216
+ | ko strict micro F1 | 0.9560 |
217
+ | ko macro F1 | 0.9571 |
218
+ | en strict micro F1 | 0.9689 |
219
+ | en macro F1 | 0.9641 |
220
+ | masking coverage - diagnostic | 0.9980 |
221
+ | ko masking coverage - diagnostic | 0.9987 |
222
+ | en masking coverage - diagnostic | 0.9967 |
223
+
224
+ Masking coverage is the proportion of gold PII characters covered by the union of predicted spans, regardless of predicted label. It is a diagnostic value and was not used as the INT8 pass or fail gate.
225
+
226
+ ## 2.2. INT8 Parity Against FP32 ONNX
227
+ | Metric | FP32 ONNX | INT8 ONNX | Delta |
228
+ |---|---:|---:|---:|
229
+ | strict micro F1 | 0.959801 | 0.959886 | +0.000085 |
230
+ | macro F1 | 0.960264 | 0.960662 | +0.000398 |
231
+ | masking coverage - diagnostic | 0.997960 | 0.997980 | +0.000020 |
232
+ | ko strict micro F1 | 0.955986 | 0.956047 | +0.000061 |
233
+ | en strict micro F1 | 0.968768 | 0.968910 | +0.000142 |
234
+
235
+ INT8 predictions reached strict micro F1 0.998568 against FP32 predictions and matched exactly on 14,429 of 14,543 rows. Overall PERSON recall changed by -0.000276 and ADDRESS recall changed by +0.000116. All thresholds fixed before the full run passed. Small positive quality deltas do not show that INT8 is intrinsically more accurate. Quantization moved a small number of boundary decisions in both directions.
236
+
237
+ ## 2.3. Limitations and Deployment Guidance
238
+ * The graph uses Microsoft contrib operators. ONNX Runtime 1.28.0 with `CPUExecutionProvider` was validated. Confirm operator placement and fallback behavior before selecting another provider.
239
+ * The M4 validation run was a functional observation, not a serving benchmark. Measure warmup, latency percentiles, throughput, RSS and peak memory on target hardware.
240
+ * Independent token argmax can create invalid BIOES paths and does not reproduce the reported metrics. Use constrained Viterbi decoding.
241
+ * Weak-context Korean person names remain the main known miss channel. Names without honorifics, particles or nearby role cues require particular monitoring.
242
+ * Alphanumeric identifiers can swap among `USER_ID`, `SECRET`, `GENERIC_ID` and `ACCOUNT_NUMBER`. The value may still be masked even when the semantic label is wrong.
243
+ * Training and evaluation use synthetic data. Robustness to real customer text, slang, OCR noise and previously unseen credential formats has not been established.
244
+ * The label policy is fixed to the 18 types above. Changing taxonomy or boundary policy requires fine-tuning.
245
+ * Inputs beyond 768 tokens were not part of this release validation. Chunk longer inputs with overlap and reconcile spans at chunk boundaries.
246
+ * Use deterministic pattern rules as a backstop for structured identifiers and retain review paths for high-sensitivity workflows.
247
+
248
+ <br>
249
+
250
+ # 3. Future Work
251
+ * Benchmark the INT8 artifact on the actual serving hardware and execution provider.
252
+ * Improve weak-context PERSON coverage and collect privacy-safe shadow-mode failure patterns for a future data revision.
253
+
254
+ <br>
255
+
256
+ # 4. Meta Info
257
+ ## 4.1. Citation
258
+ ```bibtex
259
+ @misc{bccard2026moaiprivacyfilter,
260
+ title = {MoAI Privacy Filter INT8: A Korean Finance-Domain PII Detection Model},
261
+ author = {BC Card AX Team},
262
+ year = {2026},
263
+ howpublished = {https://huggingface.co/BCCard/MoAI-Privacy-Filter-INT8},
264
+ note = {INT8 weight-only ONNX artifact of a full fine-tune of openai/privacy-filter}
265
+ }
266
+ ```
267
+
268
+ ## 4.2. See Also
269
+ * Base model - [`openai/privacy-filter`](https://huggingface.co/openai/privacy-filter)
270
+ * Parent BF16 model - [`BCCard/MoAI-Privacy-Filter`](https://huggingface.co/BCCard/MoAI-Privacy-Filter)
271
+ * Training dataset - [`BCCard/pii-masking-openpii-finance`](https://huggingface.co/datasets/BCCard/pii-masking-openpii-finance)
272
+ * Source data attribution - `ai4privacy/pii-masking-openpii-1.5m` under CC-BY-4.0
273
+
274
+ ## 4.3. Viterbi Reference Implementation
275
+ These functions apply the BIOES transition constraints and calibration biases used for validation, then recover character-offset spans with whitespace boundary refinement. Keep `config.json`, `label-taxonomy.yaml` and `viterbi_calibration.json` in their bundled label order and configuration.
276
+
277
+ <details>
278
+ <summary>Show the constrained Viterbi and span-decoding reference code</summary>
279
+
280
+ ```python
281
+ import numpy as np
282
+
283
+
284
+ def transition_bias(
285
+ from_prefix: str,
286
+ to_prefix: str,
287
+ biases: dict[str, float],
288
+ ) -> float:
289
+ if from_prefix == "O" and to_prefix == "O":
290
+ return biases["transition_bias_background_stay"]
291
+ if from_prefix == "O" and to_prefix in {"B", "S"}:
292
+ return biases["transition_bias_background_to_start"]
293
+ if from_prefix in {"E", "S"} and to_prefix == "O":
294
+ return biases["transition_bias_end_to_background"]
295
+ if from_prefix in {"E", "S"} and to_prefix in {"B", "S"}:
296
+ return biases["transition_bias_end_to_start"]
297
+ if from_prefix in {"B", "I"} and to_prefix == "I":
298
+ return biases["transition_bias_inside_to_continue"]
299
+ if from_prefix in {"B", "I"} and to_prefix == "E":
300
+ return biases["transition_bias_inside_to_end"]
301
+ raise ValueError(f"Unsupported transition family: {from_prefix} -> {to_prefix}")
302
+
303
+
304
+ def constrained_viterbi(
305
+ logits: np.ndarray,
306
+ labels: tuple[str, ...],
307
+ biases: dict[str, float],
308
+ ) -> list[int]:
309
+ scores = np.asarray(logits, dtype=np.float32)
310
+ num_classes = len(labels)
311
+ parsed = [
312
+ ("O", None) if tag == "O" else tuple(tag.split("-", 1))
313
+ for tag in labels
314
+ ]
315
+ start_scores = np.full(num_classes, -np.inf, dtype=np.float32)
316
+ end_scores = np.full(num_classes, -np.inf, dtype=np.float32)
317
+ transition_scores = np.full(
318
+ (num_classes, num_classes),
319
+ -np.inf,
320
+ dtype=np.float32,
321
+ )
322
+
323
+ for class_id, (tag_prefix, _) in enumerate(parsed):
324
+ if tag_prefix in {"O", "B", "S"}:
325
+ start_scores[class_id] = 0.0
326
+ if tag_prefix in {"O", "E", "S"}:
327
+ end_scores[class_id] = 0.0
328
+
329
+ for from_id, (from_prefix, from_label) in enumerate(parsed):
330
+ for to_id, (to_prefix, to_label) in enumerate(parsed):
331
+ allowed = (
332
+ from_prefix in {"O", "E", "S"}
333
+ and to_prefix in {"O", "B", "S"}
334
+ ) or (
335
+ from_prefix in {"B", "I"}
336
+ and to_prefix in {"I", "E"}
337
+ and from_label == to_label
338
+ )
339
+ if allowed:
340
+ transition_scores[from_id, to_id] = transition_bias(
341
+ from_prefix,
342
+ to_prefix,
343
+ biases,
344
+ )
345
+
346
+ delta = start_scores + scores[0]
347
+ backpointers = np.zeros((scores.shape[0], num_classes), dtype=np.int64)
348
+ for token_id in range(1, scores.shape[0]):
349
+ candidates = delta[:, None] + transition_scores
350
+ backpointers[token_id] = np.argmax(candidates, axis=0)
351
+ delta = np.max(candidates, axis=0) + scores[token_id]
352
+
353
+ last_class = int(np.argmax(delta + end_scores))
354
+ path = [last_class]
355
+ for token_id in range(scores.shape[0] - 1, 0, -1):
356
+ path.append(int(backpointers[token_id, path[-1]]))
357
+ return list(reversed(path))
358
+
359
+
360
+ def decode_spans(
361
+ tags: list[str],
362
+ offsets: list[list[int]],
363
+ text: str,
364
+ ) -> list[dict[str, int | str]]:
365
+ spans = []
366
+ current = None
367
+
368
+ def flush() -> None:
369
+ nonlocal current
370
+ if current is None:
371
+ return
372
+ start = current["start"]
373
+ end = current["end"]
374
+ while start < end and text[start].isspace():
375
+ start += 1
376
+ while end > start and text[end - 1].isspace():
377
+ end -= 1
378
+ if start < end:
379
+ spans.append(
380
+ {
381
+ "start": start,
382
+ "end": end,
383
+ "label": current["label"],
384
+ }
385
+ )
386
+ current = None
387
+
388
+ for tag, (start, end) in zip(tags, offsets, strict=True):
389
+ if tag == "O":
390
+ flush()
391
+ continue
392
+ tag_prefix, label = tag.split("-", 1)
393
+ if tag_prefix in {"B", "S"} or current is None or current["label"] != label:
394
+ flush()
395
+ current = {
396
+ "start": start,
397
+ "end": end,
398
+ "label": label,
399
+ }
400
+ else:
401
+ current["end"] = end
402
+ if tag_prefix in {"E", "S"}:
403
+ flush()
404
+ flush()
405
+ return spans
406
+ ```
407
+
408
+ </details>
config.json ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "OpenAIPrivacyFilterForTokenClassification"
4
+ ],
5
+ "attention_bias": true,
6
+ "attention_dropout": 0.0,
7
+ "bos_token_id": null,
8
+ "classifier_dropout": 0.0,
9
+ "default_n_ctx": 128000,
10
+ "eos_token_id": 199999,
11
+ "head_dim": 64,
12
+ "hidden_act": "silu",
13
+ "hidden_size": 640,
14
+ "id2label": {
15
+ "0": "O",
16
+ "1": "B-PERSON",
17
+ "2": "I-PERSON",
18
+ "3": "E-PERSON",
19
+ "4": "S-PERSON",
20
+ "5": "B-RRN",
21
+ "6": "I-RRN",
22
+ "7": "E-RRN",
23
+ "8": "S-RRN",
24
+ "9": "B-FRN",
25
+ "10": "I-FRN",
26
+ "11": "E-FRN",
27
+ "12": "S-FRN",
28
+ "13": "B-CARD_NUMBER",
29
+ "14": "I-CARD_NUMBER",
30
+ "15": "E-CARD_NUMBER",
31
+ "16": "S-CARD_NUMBER",
32
+ "17": "B-ACCOUNT_NUMBER",
33
+ "18": "I-ACCOUNT_NUMBER",
34
+ "19": "E-ACCOUNT_NUMBER",
35
+ "20": "S-ACCOUNT_NUMBER",
36
+ "21": "B-SECRET",
37
+ "22": "I-SECRET",
38
+ "23": "E-SECRET",
39
+ "24": "S-SECRET",
40
+ "25": "B-USER_ID",
41
+ "26": "I-USER_ID",
42
+ "27": "E-USER_ID",
43
+ "28": "S-USER_ID",
44
+ "29": "B-EMAIL",
45
+ "30": "I-EMAIL",
46
+ "31": "E-EMAIL",
47
+ "32": "S-EMAIL",
48
+ "33": "B-PHONE",
49
+ "34": "I-PHONE",
50
+ "35": "E-PHONE",
51
+ "36": "S-PHONE",
52
+ "37": "B-PASSPORT",
53
+ "38": "I-PASSPORT",
54
+ "39": "E-PASSPORT",
55
+ "40": "S-PASSPORT",
56
+ "41": "B-DRIVER_LICENSE",
57
+ "42": "I-DRIVER_LICENSE",
58
+ "43": "E-DRIVER_LICENSE",
59
+ "44": "S-DRIVER_LICENSE",
60
+ "45": "B-GENERIC_ID",
61
+ "46": "I-GENERIC_ID",
62
+ "47": "E-GENERIC_ID",
63
+ "48": "S-GENERIC_ID",
64
+ "49": "B-ADDRESS",
65
+ "50": "I-ADDRESS",
66
+ "51": "E-ADDRESS",
67
+ "52": "S-ADDRESS",
68
+ "53": "B-ZIPCODE",
69
+ "54": "I-ZIPCODE",
70
+ "55": "E-ZIPCODE",
71
+ "56": "S-ZIPCODE",
72
+ "57": "B-DATE",
73
+ "58": "I-DATE",
74
+ "59": "E-DATE",
75
+ "60": "S-DATE",
76
+ "61": "B-CARD_EXPIRY",
77
+ "62": "I-CARD_EXPIRY",
78
+ "63": "E-CARD_EXPIRY",
79
+ "64": "S-CARD_EXPIRY",
80
+ "65": "B-CVC",
81
+ "66": "I-CVC",
82
+ "67": "E-CVC",
83
+ "68": "S-CVC",
84
+ "69": "B-IPIN",
85
+ "70": "I-IPIN",
86
+ "71": "E-IPIN",
87
+ "72": "S-IPIN"
88
+ },
89
+ "initial_context_length": 4096,
90
+ "initializer_range": 0.02,
91
+ "intermediate_size": 640,
92
+ "label2id": {
93
+ "B-ACCOUNT_NUMBER": 17,
94
+ "B-ADDRESS": 49,
95
+ "B-CARD_EXPIRY": 61,
96
+ "B-CARD_NUMBER": 13,
97
+ "B-CVC": 65,
98
+ "B-DATE": 57,
99
+ "B-DRIVER_LICENSE": 41,
100
+ "B-EMAIL": 29,
101
+ "B-FRN": 9,
102
+ "B-GENERIC_ID": 45,
103
+ "B-IPIN": 69,
104
+ "B-PASSPORT": 37,
105
+ "B-PERSON": 1,
106
+ "B-PHONE": 33,
107
+ "B-RRN": 5,
108
+ "B-SECRET": 21,
109
+ "B-USER_ID": 25,
110
+ "B-ZIPCODE": 53,
111
+ "E-ACCOUNT_NUMBER": 19,
112
+ "E-ADDRESS": 51,
113
+ "E-CARD_EXPIRY": 63,
114
+ "E-CARD_NUMBER": 15,
115
+ "E-CVC": 67,
116
+ "E-DATE": 59,
117
+ "E-DRIVER_LICENSE": 43,
118
+ "E-EMAIL": 31,
119
+ "E-FRN": 11,
120
+ "E-GENERIC_ID": 47,
121
+ "E-IPIN": 71,
122
+ "E-PASSPORT": 39,
123
+ "E-PERSON": 3,
124
+ "E-PHONE": 35,
125
+ "E-RRN": 7,
126
+ "E-SECRET": 23,
127
+ "E-USER_ID": 27,
128
+ "E-ZIPCODE": 55,
129
+ "I-ACCOUNT_NUMBER": 18,
130
+ "I-ADDRESS": 50,
131
+ "I-CARD_EXPIRY": 62,
132
+ "I-CARD_NUMBER": 14,
133
+ "I-CVC": 66,
134
+ "I-DATE": 58,
135
+ "I-DRIVER_LICENSE": 42,
136
+ "I-EMAIL": 30,
137
+ "I-FRN": 10,
138
+ "I-GENERIC_ID": 46,
139
+ "I-IPIN": 70,
140
+ "I-PASSPORT": 38,
141
+ "I-PERSON": 2,
142
+ "I-PHONE": 34,
143
+ "I-RRN": 6,
144
+ "I-SECRET": 22,
145
+ "I-USER_ID": 26,
146
+ "I-ZIPCODE": 54,
147
+ "O": 0,
148
+ "S-ACCOUNT_NUMBER": 20,
149
+ "S-ADDRESS": 52,
150
+ "S-CARD_EXPIRY": 64,
151
+ "S-CARD_NUMBER": 16,
152
+ "S-CVC": 68,
153
+ "S-DATE": 60,
154
+ "S-DRIVER_LICENSE": 44,
155
+ "S-EMAIL": 32,
156
+ "S-FRN": 12,
157
+ "S-GENERIC_ID": 48,
158
+ "S-IPIN": 72,
159
+ "S-PASSPORT": 40,
160
+ "S-PERSON": 4,
161
+ "S-PHONE": 36,
162
+ "S-RRN": 8,
163
+ "S-SECRET": 24,
164
+ "S-USER_ID": 28,
165
+ "S-ZIPCODE": 56
166
+ },
167
+ "max_position_embeddings": 131072,
168
+ "model_type": "openai_privacy_filter",
169
+ "num_attention_heads": 14,
170
+ "num_experts_per_tok": 4,
171
+ "num_hidden_layers": 8,
172
+ "num_key_value_heads": 2,
173
+ "num_local_experts": 128,
174
+ "onnx_config": {
175
+ "activation_dtype": "float32",
176
+ "block_size": 32,
177
+ "external_data": "model_quantized.onnx_data",
178
+ "model_file": "model_quantized.onnx",
179
+ "operator_profile": "MatMulNBits + QMoE + GatherBlockQuantized",
180
+ "output_dtype": "float32",
181
+ "weight_bits": 8,
182
+ "weight_only": true
183
+ },
184
+ "output_router_logits": false,
185
+ "pad_token_id": 199999,
186
+ "rms_norm_eps": 1e-05,
187
+ "rope_parameters": {
188
+ "beta_fast": 32.0,
189
+ "beta_slow": 1.0,
190
+ "factor": 32.0,
191
+ "original_max_position_embeddings": 4096,
192
+ "rope_theta": 150000.0,
193
+ "rope_type": "yarn",
194
+ "truncate": false
195
+ },
196
+ "router_aux_loss_coef": 0.001,
197
+ "sliding_window": 128,
198
+ "tie_word_embeddings": false,
199
+ "transformers_version": "5.13.1",
200
+ "use_cache": false,
201
+ "vocab_size": 200064
202
+ }
figures/evaluation-test-1-1.png ADDED

Git LFS Details

  • SHA256: 0481eb0a53ab6e5699c87fd53a1c855c688d3f22532edb563a815d90419040d1
  • Pointer size: 131 Bytes
  • Size of remote file: 245 kB
figures/evaluation-train-1-1.png ADDED

Git LFS Details

  • SHA256: a5e0badc81ac4a9e613f34875a65e70a57ea37b3de4fad748cf7f9f89c40c646
  • Pointer size: 131 Bytes
  • Size of remote file: 119 kB
label-taxonomy.yaml ADDED
@@ -0,0 +1,242 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # =============================================================================
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>
128
+ GIVENNAME: PERSON
129
+ SURNAME: PERSON
130
+ TITLE: O # ๊ตฐ/์–‘/gun/yang ์ง์—ญ ์กด์นญ 88% - ์ „๋Ÿ‰ ๋“œ๋กญ
131
+ TAXNUM:
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
141
+ TELEPHONENUM: PHONE
142
+ EMAIL: EMAIL
143
+ CREDITCARDNUMBER: CARD_NUMBER
144
+ ACCOUNTNUM: ACCOUNT_NUMBER
145
+ CITY: ADDRESS
146
+ STREET: ADDRESS
147
+ BUILDINGNUM: ADDRESS
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 : ๋‘ ์—”ํ‹ฐํ‹ฐ ์‚ฌ์ด์˜ ์ธ์‹ยทํ—ˆ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ ๋ฐ ํŒจํ„ด
179
+ # - whitespace (๊ณต๋ฐฑยทํƒญ)
180
+ # - punct (๊ตฌ๋‘์  : `, . - ยท / ( )` ๋“ฑ ๋ฌธ์žฅ ๋ถ€ํ˜ธ)
181
+ # -----------------------------------------------------------------------------
182
+ merge_rules: # <merge_rules>
183
+ person:
184
+ source_labels: [GIVENNAME, SURNAME]
185
+ max_gap_chars: 4
186
+ gap_allowed: whitespace_or_punct
187
+ output_label: PERSON
188
+ address:
189
+ source_labels: [CITY, STREET, BUILDINGNUM]
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
+ ์ •์ฑ…ํŒ€ ์‚ฌํ›„ ์ปจํŽŒ ๋Œ€์ƒ"
model_quantized.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2f9e709e0e9825dcd2d42e7f7bad9e2dcc7087cc3962db46787b9a4b123f5f74
3
+ size 151493
model_quantized.onnx_data ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3c86220d2388b60740a7ec824dd94e6f3152804e96f758d9c2b9a34dd5c97886
3
+ size 1618085352
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0614fe83cadab421296e664e1f48f4261fa8fef6e03e63bb75c20f38e37d07d3
3
+ size 27868174
tokenizer_config.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "eos_token": "<|endoftext|>",
4
+ "is_local": false,
5
+ "local_files_only": false,
6
+ "model_input_names": [
7
+ "input_ids",
8
+ "attention_mask"
9
+ ],
10
+ "model_max_length": 128000,
11
+ "pad_token": "<|endoftext|>",
12
+ "tokenizer_class": "TokenizersBackend"
13
+ }
viterbi_calibration.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "operating_points": {
3
+ "default": {
4
+ "biases": {
5
+ "transition_bias_background_stay": 0.0,
6
+ "transition_bias_background_to_start": 0.0,
7
+ "transition_bias_end_to_background": 0.0,
8
+ "transition_bias_end_to_start": 0.0,
9
+ "transition_bias_inside_to_continue": 0.0,
10
+ "transition_bias_inside_to_end": 0.0
11
+ }
12
+ }
13
+ }
14
+ }