Token Classification
Transformers
Safetensors
Korean
English
openai_privacy_filter
ner
pii
privacy
pii-masking
korean
finance
bioes
viterbi
mixture-of-experts
Instructions to use BCCard/MoAI-Privacy-Filter with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use BCCard/MoAI-Privacy-Filter with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("token-classification", model="BCCard/MoAI-Privacy-Filter")# Load model directly from transformers import AutoTokenizer, AutoModelForTokenClassification tokenizer = AutoTokenizer.from_pretrained("BCCard/MoAI-Privacy-Filter") model = AutoModelForTokenClassification.from_pretrained("BCCard/MoAI-Privacy-Filter", device_map="auto") - Notebooks
- Google Colab
- Kaggle
| # ============================================================================= | |
| # Label Mapping - ai4privacy 1.5m ๋ผ๋ฒจ -> ๋ด๋ถ ํ์ต ๋ผ๋ฒจ ๋งคํ ํ ์ด๋ธ | |
| # | |
| # * ์ญํ : ๋ชจ๋ธ ํ์ต ๋ผ๋ฒจ = ๋ก๊น ์คํค๋ง ํค = ์ ์ฑ ํ ์ด๋ธ ํค์ ๋จ์ผ ์์ค | |
| # (docs/handoff/2026-07-03-pii-masking-architecture-qna.md [13]) | |
| # * ์ญ์ฐ ๊ทผ๊ฑฐ: playbooks/privacy_filter/privacy-filter-policy.md (ํ 1 ์ ํ ํจํด / ํ 2 ๋ง์คํน ๊ธฐ์ค) | |
| # * ์ค์ธก ๊ทผ๊ฑฐ: docs/handoff/2026-07-03-ai4privacy-1p5m-ko-audit.md (v0 ์ด์ + ko ์๋ธ์ ๊ฐ์ฌ) | |
| # * v0 -> v1 ๋ณ๊ฒฝ: ์ฃผ์ ์ฒ๋ฆฌ ํ์ (๋จ์ผ+์๋ธ๋ง์คํน) / FRN ์ ์ค / USER_IDยทACCOUNT_NUMBER | |
| # ๋๋กญ ์ฒ ํ / ์ฌ๊ถยท์ด์ ๋ฉดํ ๋ถ๋ฆฌ ์ ์ง / regex ์ ๋ด ํญ๋ชฉ ๋ถ๋ฆฌ | |
| # * 2026-07-21: AGEยทGENDER ๋๋กญ ํ์ (ํ1ยทํ2 ๋ฌด๊ทผ๊ฑฐ - ์ ์ฑ ์ญ์ฐ ์์น ๊ด์ฒ , N=17 -> 15) | |
| # * 2026-07-21: ํ2 ๋ฌธ๋งฅ ํญ๋ชฉ 3์ข ๋ชจ๋ธ ์น๊ฒฉ (CARD_EXPIRYยทCVCยทIPIN - ๋ฌธ๋งฅ ๊ฒ์ถ์ ๋ชจ๋ธ ๋ ์ธ | |
| # ๋ณธ๋ น, ํค์๋ regex๋ ์ด์ค ๋ ์ธ ๋ณํ. N=15 -> 18, 61 -> 73ํด๋์ค) | |
| # ============================================================================= | |
| version: v1 | |
| date: 2026-07-21 | |
| basis: | |
| policy: playbooks/privacy_filter/privacy-filter-policy.md | |
| audit: docs/handoff/2026-07-03-ai4privacy-1p5m-ko-audit.md | |
| # ----------------------------------------------------------------------------- | |
| # 1. ๋ชจ๋ธ ํ์ต ๋ผ๋ฒจ (N=18 -> BIOES 4N+1 = 73ํด๋์ค) | |
| # * data_source: ๋ผ๋ฒจ ํ๋ณธ์ ์ถ์ฒ ๋ฆฌ์คํธ - ko(1.5m-ko ์ ์ ๋ณธ) / en(1.5m-en ๋ฆฌํ๋ ์ด) / | |
| # domain(๋๋ฉ์ธ ๋ถํธ์คํธ๋ฉ ๋๊ธฐ - ํค๋๋ ์ ์ฌ ๋ผ๋ฒจ ํ ๋ณต์ฌ๋ก init) | |
| # * RRN์ 1.5m ์ ๋๋ถ์ ko ํ์ (en TAXNUM์ GENERIC_ID fallback) - domain์ ์ฆ๊ฐ ๋ฐฉ์ B | |
| # * en ๋ถํฌ ์ค์ธก (2026-07-13, 163,740ํ/1,247,393์คํฌ): ์์ 19์ข ์ง์ค - PASSWORD 0, | |
| # ACCOUNTNUM 1, USERNAME 20 -> "ํฌ์ ๋ผ๋ฒจ์ en ๋ด๋น" ๊ฐ์ค ๊ธฐ๊ฐ, [domain] ์ฌ๋ฐฐ์ | |
| # ----------------------------------------------------------------------------- | |
| model_labels: | |
| - name: PERSON | |
| description: ์ฑ๋ช (์ฑ+์ด๋ฆ ๋ณํฉ ๋จ์ผ ์คํฌ) | |
| policy_ref: "ํ2 ์ฑ๋ช (๊น*์ฉ - ์ฒซยท๋ ๊ธ์ ์ ์ธ) / ํ2 ์ฑ๋ช (์๋ฌธ) (์ 4์๋ฆฌ ๋ ธ์ถ) - ์นํ ์ ์คํฌ๋ฆฝํธ(ํ๊ธ/์๋ฌธ)๋ก ๊ท์น ๋ถ๊ธฐ, full-span ๊ฒฝ๊ณ ํ์" | |
| data_source: [ko, en] | |
| head_init_base: private_person | |
| - name: RRN | |
| description: ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ | |
| policy_ref: "ํ1 ์ฃผ๋ฏผ๋ฒํธ / ํ2 ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ (๋ค 7์๋ฆฌ ๋ง์คํน)" | |
| data_source: [ko, domain] # domain = ์ฆ๊ฐ ๋ฐฉ์ B ์ ๊ท ์์ฑ๋ถ (์ ๋ต๋ฌธ ยง3.3.1) | |
| head_init_base: account_number | |
| - name: FRN | |
| description: ์ธ๊ตญ์ธ๋ฑ๋ก๋ฒํธ (์ ์ค - 1.5m ์์ค 0๊ฑด) | |
| policy_ref: "ํ1 ์ธ๊ตญ์ธ๋ฑ๋ก๋ฒํธ ([5-8] ์์) / ํ2 ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ(์ธ๊ตญ์ธ๋ฑ๋ก๋ฒํธ ํฌํจ) (๋ค 7์๋ฆฌ)" | |
| data_source: [domain] | |
| head_init_from: RRN | |
| - name: CARD_NUMBER | |
| description: ์ ์ฉ/์ฒดํฌ์นด๋ ๋ฒํธ | |
| policy_ref: "ํ1 ์นด๋๋ฒํธ / ํ2 ์นด๋๋ฒํธ (7~12๋ฒ์งธ ์๋ฆฌ, PCI-DSS)" | |
| data_source: [ko, en, domain] # domain = ์ฆ๊ฐ ๋ฐฉ์ B ์ ๊ท ์์ฑ๋ถ (์ ๋ต๋ฌธ ยง3.3.1) | |
| head_init_base: account_number | |
| - name: ACCOUNT_NUMBER | |
| description: ๊ณ์ข๋ฒํธ (v0 ๋๋กญ ์ฒ ํ - ํ2 ๋ง์คํน ๊ธฐ์ค ์กด์ฌ) | |
| policy_ref: "ํ1 ๊ณ์ข๋ฒํธ (์ ํ๋ฒํธ ํก์ ์ํ - recognizer ์ฐ์ ์์ ํ์) / ํ2 ๊ณ์ข๋ฒํธ (๋ค 5์๋ฆฌ)" | |
| data_source: [domain] # ko 5ยทen 1๊ฑด ์ค์ธก - ํฉ์ฑ ์ฆ๊ฐ ํ์ (์ํ๋ณ ํฌ๋งท ๊ท์น ์์ฑ ์ฉ์ด) | |
| head_init_base: account_number | |
| - name: SECRET | |
| description: ์ธ์ฆ ์ํฌ๋ฆฟ (๋น๋ฐ๋ฒํธยทAPI ํคยทํ ํฐ ํตํฉ - ์นด๋/ํ์/ISP ๊ตฌ๋ถ์ ๋ฌธ๋งฅ ๋ถ๊ฐ + ์ก์ ๋์ผ) | |
| policy_ref: "ํ2 ์นด๋๋น๋ฐ๋ฒํธยท์จ๋ผ์ธ ํ์ ํจ์ค์๋ยทISP๋น๋ฐ๋ฒํธ (์ฒ๋ฆฌ ๊ธ์ง -> ๊ฒ์ดํธ์จ์ด์์๋ LLM ๋ ธ์ถ ๊ธ์ง = ์ ์ฒด ๋ง์คํน์ผ๋ก ํด์)" | |
| data_source: [domain] # 1.5m ์ ๋ฌด (ko 4ยทen 0 ์ค์ธก) - ๋๋ฉ์ธ/ํฉ์ฑ ์ฆ๊ฐ ์ ๋ด | |
| head_init_base: secret # base 8์ข ์ค secret ํ ์ ํ ๋ณต์ฌ (์ธ์ ์๋ ์ง๊ณ ์์) | |
| - name: USER_ID | |
| description: ์จ๋ผ์ธ ํ์ ID (v0 ๋๋กญ ์ฒ ํ - ํ2 ๋ง์คํน ๊ธฐ์ค ์กด์ฌ) | |
| policy_ref: "ํ2 ์จ๋ผ์ธ ํ์ ID (์ 2์๋ฆฌ ์ ์ธ)" | |
| data_source: [domain] # ko 4ยทen 20๊ฑด ์ค์ธก - ์ฆ๊ฐ ํ์ | |
| head_init_base: account_number | |
| - name: EMAIL | |
| description: ์ด๋ฉ์ผ ์ฃผ์ | |
| policy_ref: "ํ1 ์ด๋ฉ์ผ / ํ2 ์ด๋ฉ์ผ์ฃผ์ (ID ์ 2์๋ฆฌ ์ ์ธ ๋ง์คํน)" | |
| data_source: [ko, en] | |
| head_init_base: private_email | |
| - name: PHONE | |
| description: ์ ํ๋ฒํธ (ํด๋ํฐ/์ผ๋ฐ์ ํ ํตํฉ - ์นํ ๋จ๊ณ์์ ํ๋ฆฌํฝ์ค๋ก ์ฌ๋ถ๋ฅ) | |
| policy_ref: "ํ1 ํด๋ํฐ๋ฒํธยท์ ํ๋ฒํธ / ํ2 ๊ธฐ๋ณธ ๋ค 6์๋ฆฌ ๊ณตํต - ๋ด๋ถ๋ง ์ฑ๋ ํ์ ํด๋ํฐ | |
| ๋ค 4์๋ฆฌ ์ํ (์นํ ์ ๊ฐ ํ๋ฆฌํฝ์ค๋ก ํด๋ํฐ ํ๋ณ + ์ฑ๋ ์ถ ๋ถ๊ธฐ)" | |
| data_source: [ko, en] | |
| head_init_base: private_phone | |
| - name: PASSPORT | |
| description: ์ฌ๊ถ๋ฒํธ (๋ถ๋ฆฌ ์ ์ง - ๋ง์คํน ๊ธฐ์ค ์์ด + ko 3,211๊ฑด) | |
| policy_ref: "ํ1 ์ฌ๊ถ๋ฒํธ / ํ2 ์ฌ๊ถ๋ฒํธ (๋ค 4์๋ฆฌ)" | |
| data_source: [ko, en] | |
| head_init_base: account_number | |
| - name: DRIVER_LICENSE | |
| description: ์ด์ ๋ฉดํ๋ฒํธ (๋ถ๋ฆฌ ์ ์ง - ๋ง์คํน ๊ธฐ์ค ์์ด + ko 4,092๊ฑด) | |
| policy_ref: "ํ1 ์ด์ ๋ฉดํ๋ฒํธ / ํ2 ์ด์ ๋ฉดํ๋ฒํธ (์ค๊ฐ 6์๋ฆฌ)" | |
| data_source: [ko, en] | |
| head_init_base: account_number | |
| - name: GENERIC_ID | |
| description: ๋ฒ์ฉ ์๋ณ์ (ํ๊ตญ ๋์๋ฌผ ์๋ ID๋ฅ - recall-first๋ก O ๋์ ์ ์ง) | |
| policy_ref: "audit ยง5 (SOCIALNUM 10์๋ฆฌยทIDCARDNUM ์์ซ์)" | |
| data_source: [ko, en] | |
| head_init_base: account_number | |
| - name: ADDRESS | |
| description: ์ฃผ์ (์ยท๋๋ก๋ช ยท๊ฑด๋ฌผ๋ฒํธ ํตํฉ ์คํฌ - ์นํ ๋จ๊ณ์์ ์ซ์ ์๋ธ๋ง์คํน) | |
| policy_ref: "ํ2 ์ฃผ์ (์ง๋ฒ: ์/๋ฉด/๋ ๋ฏธ๋ง ์ซ์ / ๋๋ก๋ช : ๊ฑด๋ฌผ๋ฒํธยท์์ธ์ฃผ์ ์ซ์ ๋ง์คํน -> ์คํฌ ๋ด ๊ท์น ์นํ)" | |
| data_source: [ko, en] | |
| head_init_base: private_address | |
| - name: ZIPCODE | |
| description: ์ฐํธ๋ฒํธ (๋ถ๋ฆฌ ์ ์ง - keep ํ ๊ธ ์ธ๋ถ์ฑ ์ ์ ) | |
| policy_ref: "handoff [10] ZIPCODE keep ์ค์ฆ" | |
| data_source: [ko, en] | |
| head_init_base: private_address | |
| - name: DATE | |
| description: ๋ ์งยท์๊ฐ (์๋ ์์ผ ๋ฏธ๋ถ๋ฆฌ - ko ๋ฐ์ดํฐ DOB 0๊ฑด + ๊ณผ์ ๋ง์คํน ์ค์ ์ธ์ ์กฐํญ) | |
| policy_ref: "ํ2 ์๋ ์์ผ (๋ ธ์ถ ๊ธ์ง - DATE ์ ์ฒด ๋ง์คํน์ผ๋ก ์ด๊ณผ ์ค์)" | |
| data_source: [ko, en] | |
| head_init_base: private_date | |
| - name: CARD_EXPIRY | |
| description: ์นด๋์ ํจ๊ธฐํ (ํ2 ๋ฌธ๋งฅ ํญ๋ชฉ ์น๊ฒฉ 2026-07-21 - ํค์๋ regex ์ด์ค ๋ ์ธ ๋ณํ) | |
| policy_ref: "ํ2 ์นด๋์ ํจ๊ธฐํ (**/** ์ ์ฒด ๋ง์คํน)" | |
| data_source: [domain] # 1.5m ์์ฒ 0๊ฑด - ์ฆ๊ฐ ์ ๋ด (PAN ๋๋ฐ ๋ฌธ๋งฅ ์์ฑ) | |
| head_init_base: private_date | |
| - name: CVC | |
| description: ์นด๋๊ฒ์ฆ์ฝ๋ (CVC/CVV/CAV ํตํฉ - ํ2 ๋ฌธ๋งฅ ํญ๋ชฉ ์น๊ฒฉ 2026-07-21) | |
| policy_ref: "ํ2 ์นด๋๊ฒ์ฆ์ฝ๋ (์ ์ฅยท์ถ๋ ฅ ๊ธ์ง -> ๊ฒ์ดํธ์จ์ด ์ ์ฒด ๋ง์คํน ํด์)" | |
| data_source: [domain] # 1.5m ์์ฒ 0๊ฑด - ์ฆ๊ฐ ์ ๋ด (๋จ๋ ์์ฑ ๊ธ์ง - PAN ๋๋ฐ ํ์) | |
| head_init_base: account_number | |
| - name: IPIN | |
| description: I-PIN ๋ฒํธ (ํ2 ๋ฌธ๋งฅ ํญ๋ชฉ ์น๊ฒฉ 2026-07-21 - ๊ฐ ๊ท๊ฒฉ pending) | |
| policy_ref: "ํ2 I-PIN (๋ค 5์๋ฆฌ - ํ์ดํ ๋ฌด๊ด ์ซ์ ๊ธฐ์ค)" | |
| data_source: [domain] # 1.5m ์์ฒ 0๊ฑด - ๊ท๊ฒฉ ํ์ ์ ํ์ผ๋ฟ ์๋๋ง | |
| head_init_base: account_number | |
| # ----------------------------------------------------------------------------- | |
| # 2. ์์ค ๋ผ๋ฒจ ๋งคํ (ai4privacy 1.5m -> ๋ด๋ถ ๋ผ๋ฒจ) | |
| # * "O" = ํ์ต์์ ๋น์ํฐํฐ ์ฒ๋ฆฌ (๋๋กญ ๋ฆฌ์คํธ - ์ ์ฑ ํ ์ปจํ ํ ํ์ ) | |
| # * ์กฐ๊ฑด๋ถ ๋งคํ์ locale + value_pattern ์์ ์ฅ์น ๋๋ฐ | |
| # ----------------------------------------------------------------------------- | |
| source_mapping: # <source_mapping> | |
| GIVENNAME: PERSON | |
| SURNAME: PERSON | |
| TITLE: O # ๊ตฐ/์/gun/yang ์ง์ญ ์กด์นญ 88% - ์ ๋ ๋๋กญ | |
| TAXNUM: | |
| label: RRN # <conditional_mapping> | |
| condition: | |
| locale: ko | |
| value_pattern: '^\d{6}-[1-4]\d{6}$' # ์ค์ธก 3,975/3,975 ์ ํฉ - ์์ ์ฅ์น | |
| fallback: GENERIC_ID # ๋น์ ํฉ ๊ฐ / ํ ๋ก์ผ์ผ(en ๋ฆฌํ๋ ์ด)์ ์ธ๋ฌด ID -> ๋ฒ์ฉ ID | |
| SOCIALNUM: GENERIC_ID | |
| IDCARDNUM: GENERIC_ID | |
| DRIVERLICENSENUM: DRIVER_LICENSE | |
| PASSPORTNUM: PASSPORT | |
| TELEPHONENUM: PHONE | |
| EMAIL: EMAIL | |
| CREDITCARDNUMBER: CARD_NUMBER | |
| ACCOUNTNUM: ACCOUNT_NUMBER | |
| CITY: ADDRESS | |
| STREET: ADDRESS | |
| BUILDINGNUM: ADDRESS | |
| ZIPCODE: ZIPCODE | |
| DATE: DATE | |
| TIME: DATE | |
| AGE: O # 2026-07-21 ๋๋กญ ํ์ - ํ1ยทํ2 ๋ฌด๊ทผ๊ฑฐ (quasi-identifier ์กด์น์ ํ๊ธฐ) | |
| GENDER: O # ใ | |
| SEX: O # ใ (GENDER ์ค๋ณต ์์ค) | |
| USERNAME: USER_ID | |
| PASSWORD: SECRET # ko 4ยทen 0๊ฑด - ์๋ ๋ฏธ๋ฏธ, ๋ณธ ํ๋ณธ์ ๋๋ฉ์ธ/ํฉ์ฑ ์ฆ๊ฐ | |
| # ๋กฑํ ์ผ (ko <= 40๊ฑด, ํ์ต ๋ผ๋ฒจ ๋ถ์ ๊ฒฉ) - ์ ์ฑ ํ ์ปจํ ๋๊ธฐ ๋๋กญ ๋ฆฌ์คํธ | |
| ORGANISATION: O | |
| URL: O | |
| AMOUNT: O | |
| COUNTRY: O | |
| CURRENCY: O | |
| BANKNAME: O | |
| TIMEZONE: O | |
| SALARY: O | |
| IPV4: O # ๊ณ ๊ฐ IP๋ ํ2 ํญ๋ชฉ์ด๋ ko 2๊ฑด - 1์ฐจ regex(ํ1 IP์ฃผ์) ์ ๋ด | |
| JOBTITLE: O | |
| HOSPITALNAME: O | |
| ALLERGIES: O | |
| WEIGHT: O # en ์ ์ฉ ๋ผ๋ฒจ (ko 0๊ฑด) - 2026-07-13 en ์ ์ ๊ฒ์ฆ์์ ๋ฐ๊ฒฌ, ์ ์ฑ ์ธ | |
| HEIGHT: O # validation ์ ์ฉ ํฌ์ ๋ผ๋ฒจ (ko 1๊ฑด + en 1๊ฑด) - 2026-07-22 refine fail-fast๋ก ๋ฐ๊ฒฌ, ์ ์ฑ ์ธ | |
| # ----------------------------------------------------------------------------- | |
| # 3. ๋ณํฉ ๊ท์น (์ ์ ์คํฌ๋ฆฝํธ 2๋จ๊ณ - ์ธ์ ์คํฌ ๋ณํฉ, koยทen ๊ณตํต) | |
| # * ๋ณํฉ์ ์ธ์ด ๊ณตํต (en "John Smith"๋ ๋จ์ผ ์คํฌ์ด์ด์ผ ํ2 ์๋ฌธ ์ฑ๋ช ๊ท์น ์ฑ๋ฆฝ) | |
| # * ko ์ ์ฉ์ ๋ณํฉ์ด ์๋๋ผ ๊ทธ ๋ค์์ "์์ฐํ"(์ฑ+๋ช ๋ถ์ฌ์ฐ๊ธฐ - ์ ๋ต๋ฌธ ยง3.4.2 (1) 2๋จ๊ณ) | |
| # * ์์ ๊ฐ์ ๊ธ์ง: ko ์ฃผ์๋ ํฐ -> ์, en ์ฃผ์๋ ์ -> ํฐ ์ญ์ - ์ธ์ ์ฑ๋ง ์กฐ๊ฑด | |
| # | |
| # * gap_allowed : ๋ ์ํฐํฐ ์ฌ์ด์ ์ธ์ยทํ์ฉ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ ๋ฐ ํจํด | |
| # - whitespace (๊ณต๋ฐฑยทํญ) | |
| # - punct (๊ตฌ๋์ : `, . - ยท / ( )` ๋ฑ ๋ฌธ์ฅ ๋ถํธ) | |
| # ----------------------------------------------------------------------------- | |
| merge_rules: # <merge_rules> | |
| person: | |
| source_labels: [GIVENNAME, SURNAME] | |
| max_gap_chars: 4 | |
| gap_allowed: whitespace_or_punct | |
| output_label: PERSON | |
| address: | |
| source_labels: [CITY, STREET, BUILDINGNUM] | |
| max_gap_chars: 4 | |
| gap_allowed: whitespace_or_punct | |
| output_label: ADDRESS | |
| # ----------------------------------------------------------------------------- | |
| # 4. 1์ฐจ regex ์ ๋ด ํญ๋ชฉ (๋ชจ๋ธ ๋ผ๋ฒจ ์ ์ธ - ๋ก๊น ์คํค๋ง ํค์๋ ํฌํจ) | |
| # * ํ1 ์ ํ ํจํด recognizer๊ฐ ๊ฒ์ถ, ์นํ ์ ์ฑ ์ ํ2 ์ค์ฉ | |
| # ----------------------------------------------------------------------------- | |
| regex_only: | |
| - key: CI | |
| policy_ref: "ํ1 CI (86์+`==` ๊ณ ์ , lookaround ๊ฒฝ๊ณ - ๊ฒ์ ๋ณด๊ฐ 2026-07-21) / ํ2 CI (์ 7์๋ฆฌ ๋ ธ์ถ)" | |
| # SHA-512 base64 ๋ํ ๊ณผํ ํ์ฉ - ์ ๋ฐ๋ ํ์์ ciยท์ฐ๊ณ์ ๋ณด ํค์๋ ๊ฐ์ | |
| - key: IP_ADDRESS | |
| policy_ref: "ํ1 IP์ฃผ์ (์ฅํ 0~255 ์๊ฒฉํ - ๊ฒ์ ๋ณด๊ฐ 2026-07-21) / ํ2 ๊ณ ๊ฐ์ IP์ฃผ์ (์ 3์๋ฆฌ = ์ฒซ ์ฅํ ๋ง์คํน ํด์, IPv4 ํ์ )" | |
| # ----------------------------------------------------------------------------- | |
| # 4-1. 1์ฐจ regex ๋ณํ (์ด์ค ๋ ์ธ) - ๋ชจ๋ธ ๋ผ๋ฒจ์ด๋ฉด์ ํค์๋ regex๋ ๋ณํ | |
| # * 2026-07-21 ๋ชจ๋ธ ์น๊ฒฉ 3์ข : ํค์๋ regex(๊ณ ์ ๋ฐ ์ recall - ๋ช ์ ๋ฌธํ) + ๋ชจ๋ธ(๋ฌดํค์๋ | |
| # ๋งฅ๋ฝ recall) union - ๋ฌธ๋งฅ ์์กด ๊ฒ์ถ์ ๋ชจ๋ธ ๋ ์ธ์ ์กด์ฌ ์ด์ | |
| # * ํจํด ์์ง ์ ์ : Python re (lookbehind ์ฌ์ฉ - RE2/Hyperscan ๊ณ์ด ๋นํธํ) | |
| # * ์นํ์ ๊ฐ ์บก์ฒ๊ทธ๋ฃน๋ง (ํค์๋ ๋ณด์กด = ์ถ์ ์ฑ) | |
| # ----------------------------------------------------------------------------- | |
| regex_assist: | |
| - key: CARD_EXPIRY | |
| patterns: | |
| keyword: '(?i)(์ ํจ\s*๊ธฐ[๊ฐํ]|expir\w*|valid\s*thru)\D{0,12}(0[1-9]|1[0-2])\s*[/.\-]\s*((?:20)?\d\d)(?!\d)' | |
| pan_adjacent: '(0[1-9]|1[0-2])\s*/\s*\d{2}(?!\d)' # ์นด๋๋ฒํธ ๋งค์น ์งํ \D{0,20} ์๋์ฐ ๋ด์์๋ง ์ ์ฉ | |
| - key: CVC | |
| patterns: | |
| 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)' | |
| # CIDยทCSC ํค์๋ ๊ธฐ๋ณธ ์ ์ธ (correlation ID ์ถฉ๋). ์ ๋ฐ๋ ์ต์ : PAN co-occurrence ๊ฒ์ดํธ | |
| - key: IPIN | |
| patterns: | |
| keyword: '(?i)(์์ดํ|i[-\s]?pin)\s*(?:๋ฒํธ|no\.?)?\D{0,8}(\d{6}[-\s]?\d{7})(?!\d)' | |
| # ์ฃผ๋ฏผ๋ฒํธ ๊ท์น ์ ํ ์ ์ฉ ํ ์์ฌ๋ถ๋ง IPIN. ๊ฐ ๊ท๊ฒฉ(13์๋ฆฌ ๊ฐ์ ) ํ์ธ ํ์ (pending) | |
| # ----------------------------------------------------------------------------- | |
| # 5. ์ค์ฝํ ์ธ - ํ ์คํธ ๊ฒ์ดํธ์จ์ด๊ฐ ๋ค๋ฃจ์ง ์๋ ํ2 ํญ๋ชฉ (์ ์ธ์ ๊ธฐ๋ก) | |
| # ----------------------------------------------------------------------------- | |
| out_of_scope: | |
| - key: VIDEO_PERSONAL_INFO | |
| policy_ref: "ํ2 ๊ฐ์ธ์์์ ๋ณด (๊ฒ์ ๋ชฉ์ ์ธ ์ฒ๋ฆฌ ๊ธ์ง)" | |
| reason: "ํ ์คํธ ์ํฐํฐ๊ฐ ์๋ ๋ชจ๋ฌ๋ฆฌํฐ(์ด๋ฏธ์งยท์์) - ๋ฉํฐ๋ชจ๋ฌ ์ ๋ ฅ ๊ฒฝ๋ก๊ฐ ์ด๋ฆฌ๋ฉด | |
| ํ ์คํธ ํํฐ๋ฅผ ์ฐํํ๋ฏ๋ก ๋ณ๋ ํต์ (์ ๋ ฅ ์ฐจ๋จ or ๋น์ ํํฐ) ํ์" | |
| # ----------------------------------------------------------------------------- | |
| # 6. ๋ฏธ๊ฒฐ - ์ ์ฑ ํ ์ปจํ ํญ๋ชฉ, TBD | |
| # ----------------------------------------------------------------------------- | |
| pending_confirmation: | |
| - "๋๋กญ ๋ฆฌ์คํธ(O ๋งคํ) ์ ์ฒด = ๋นPII ์ ์ธ - ํนํ ORGANISATIONยทAMOUNTยทSALARY" | |
| - "IPIN ๊ฐ ๊ท๊ฒฉ (13์๋ฆฌ ๊ฐ์ ) - ์ ๊ณต๊ธฐ๊ด ๊ณ์ฝ ํ์ธ (CVC ๊ฒ์ถ ๊ท์น์ 2026-07-21 ํค์๋ ๋๋ฐ ํจํด ์ฑํ์ผ๋ก ํด์)" | |
| - "SECRET ์ ์ค ์ฑํ (2026-07-13) - ํ2 ์ฒ๋ฆฌ๊ธ์ง๋ฅ์ '๊ฒ์ดํธ์จ์ด ์ ์ฒด ๋ง์คํน' ํด์์ | |
| ์ ์ฑ ํ ์ฌํ ์ปจํ ๋์" | |