ko-pii 1.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ko_pii-1.1.0/.gitignore +48 -0
- ko_pii-1.1.0/CHANGELOG.md +155 -0
- ko_pii-1.1.0/CLAUDE.md +560 -0
- ko_pii-1.1.0/CONTRIBUTING.md +147 -0
- ko_pii-1.1.0/LICENSE +201 -0
- ko_pii-1.1.0/PKG-INFO +700 -0
- ko_pii-1.1.0/README.md +641 -0
- ko_pii-1.1.0/docs/EVALUATION_REPORT.md +582 -0
- ko_pii-1.1.0/docs/annotation_policy.md +174 -0
- ko_pii-1.1.0/docs/coverage.md +83 -0
- ko_pii-1.1.0/docs/domain_fit_report.md +178 -0
- ko_pii-1.1.0/docs/eval_samples.md +254 -0
- ko_pii-1.1.0/docs/integration_mcp.md +150 -0
- ko_pii-1.1.0/docs/integration_openai_privacy_filter.md +269 -0
- ko_pii-1.1.0/docs/integration_presidio.md +147 -0
- ko_pii-1.1.0/docs/kdpii_visual_compare.html +649 -0
- ko_pii-1.1.0/docs/legal_mapping.md +57 -0
- ko_pii-1.1.0/docs/pattern_analysis.md +235 -0
- ko_pii-1.1.0/docs/real_world_crawl_validation.md +124 -0
- ko_pii-1.1.0/docs/risk_levels.md +46 -0
- ko_pii-1.1.0/docs/sample_redaction.html +109 -0
- ko_pii-1.1.0/docs/sample_redaction.md +174 -0
- ko_pii-1.1.0/docs/showcase.html +41 -0
- ko_pii-1.1.0/docs/synthetic_sample.html +109 -0
- ko_pii-1.1.0/docs/user_megademo.html +668 -0
- ko_pii-1.1.0/pyproject.toml +111 -0
- ko_pii-1.1.0/src/k_pii/__init__.py +68 -0
- ko_pii-1.1.0/src/k_pii/analytics/__init__.py +24 -0
- ko_pii-1.1.0/src/k_pii/analytics/combined_risk.py +153 -0
- ko_pii-1.1.0/src/k_pii/analytics/k_anonymity.py +121 -0
- ko_pii-1.1.0/src/k_pii/anonymizer.py +240 -0
- ko_pii-1.1.0/src/k_pii/batch.py +252 -0
- ko_pii-1.1.0/src/k_pii/checksum/__init__.py +1 -0
- ko_pii-1.1.0/src/k_pii/checksum/business_reg_checksum.py +26 -0
- ko_pii-1.1.0/src/k_pii/checksum/corp_reg_checksum.py +29 -0
- ko_pii-1.1.0/src/k_pii/checksum/luhn.py +35 -0
- ko_pii-1.1.0/src/k_pii/checksum/rrn_checksum.py +27 -0
- ko_pii-1.1.0/src/k_pii/cli.py +286 -0
- ko_pii-1.1.0/src/k_pii/context/__init__.py +26 -0
- ko_pii-1.1.0/src/k_pii/context/context_rules.py +215 -0
- ko_pii-1.1.0/src/k_pii/context/hanja.py +94 -0
- ko_pii-1.1.0/src/k_pii/context/name_dictionary.py +68 -0
- ko_pii-1.1.0/src/k_pii/context/name_origin.py +89 -0
- ko_pii-1.1.0/src/k_pii/context/name_syllables.py +122 -0
- ko_pii-1.1.0/src/k_pii/context/particles.py +27 -0
- ko_pii-1.1.0/src/k_pii/context/romanization.py +109 -0
- ko_pii-1.1.0/src/k_pii/core/__init__.py +1 -0
- ko_pii-1.1.0/src/k_pii/core/modes.py +100 -0
- ko_pii-1.1.0/src/k_pii/core/types.py +30 -0
- ko_pii-1.1.0/src/k_pii/detect.py +122 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/__init__.py +61 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/agencies.py +210 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/agency_abbrev.py +164 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/agency_titles.py +204 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/common_words.py +722 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/districts.py +392 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/field_labels.py +42 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/majors.py +246 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/surnames.py +68 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/titles.py +315 -0
- ko_pii-1.1.0/src/k_pii/dictionaries/universities.py +261 -0
- ko_pii-1.1.0/src/k_pii/domain/__init__.py +15 -0
- ko_pii-1.1.0/src/k_pii/domain/civil_petition.py +56 -0
- ko_pii-1.1.0/src/k_pii/domain/government.py +74 -0
- ko_pii-1.1.0/src/k_pii/domain/hr.py +67 -0
- ko_pii-1.1.0/src/k_pii/eval/__init__.py +26 -0
- ko_pii-1.1.0/src/k_pii/eval/benchmark.py +43 -0
- ko_pii-1.1.0/src/k_pii/eval/fp_collector.py +134 -0
- ko_pii-1.1.0/src/k_pii/eval/kdpii.py +295 -0
- ko_pii-1.1.0/src/k_pii/eval/klue_benchmark.py +75 -0
- ko_pii-1.1.0/src/k_pii/eval/klue_ner.py +260 -0
- ko_pii-1.1.0/src/k_pii/eval/metrics.py +150 -0
- ko_pii-1.1.0/src/k_pii/eval/model_comparison.py +727 -0
- ko_pii-1.1.0/src/k_pii/eval/presidio_compare.py +194 -0
- ko_pii-1.1.0/src/k_pii/eval/synth.py +1416 -0
- ko_pii-1.1.0/src/k_pii/generalization/__init__.py +18 -0
- ko_pii-1.1.0/src/k_pii/generalization/address.py +38 -0
- ko_pii-1.1.0/src/k_pii/generalization/age.py +16 -0
- ko_pii-1.1.0/src/k_pii/generalization/date.py +21 -0
- ko_pii-1.1.0/src/k_pii/generalization/occupation.py +29 -0
- ko_pii-1.1.0/src/k_pii/integrations/__init__.py +36 -0
- ko_pii-1.1.0/src/k_pii/integrations/base.py +45 -0
- ko_pii-1.1.0/src/k_pii/integrations/hybrid.py +169 -0
- ko_pii-1.1.0/src/k_pii/integrations/mcp_server.py +275 -0
- ko_pii-1.1.0/src/k_pii/integrations/openai_privacy_filter.py +270 -0
- ko_pii-1.1.0/src/k_pii/integrations/presidio_plugin.py +170 -0
- ko_pii-1.1.0/src/k_pii/io_/__init__.py +18 -0
- ko_pii-1.1.0/src/k_pii/io_/csv_reader.py +26 -0
- ko_pii-1.1.0/src/k_pii/io_/dispatcher.py +53 -0
- ko_pii-1.1.0/src/k_pii/io_/docx.py +69 -0
- ko_pii-1.1.0/src/k_pii/io_/hwp.py +183 -0
- ko_pii-1.1.0/src/k_pii/io_/hwpx.py +90 -0
- ko_pii-1.1.0/src/k_pii/io_/pdf.py +37 -0
- ko_pii-1.1.0/src/k_pii/io_/plain.py +13 -0
- ko_pii-1.1.0/src/k_pii/io_/xlsx.py +95 -0
- ko_pii-1.1.0/src/k_pii/legal/__init__.py +16 -0
- ko_pii-1.1.0/src/k_pii/legal/mapping.py +136 -0
- ko_pii-1.1.0/src/k_pii/modes/__init__.py +8 -0
- ko_pii-1.1.0/src/k_pii/modes/_apply.py +49 -0
- ko_pii-1.1.0/src/k_pii/modes/fpe.py +209 -0
- ko_pii-1.1.0/src/k_pii/modes/hashed.py +36 -0
- ko_pii-1.1.0/src/k_pii/modes/partial.py +310 -0
- ko_pii-1.1.0/src/k_pii/modes/redact.py +79 -0
- ko_pii-1.1.0/src/k_pii/modes/tokenize.py +42 -0
- ko_pii-1.1.0/src/k_pii/patterns/__init__.py +1 -0
- ko_pii-1.1.0/src/k_pii/patterns/account.py +146 -0
- ko_pii-1.1.0/src/k_pii/patterns/address.py +284 -0
- ko_pii-1.1.0/src/k_pii/patterns/birth.py +283 -0
- ko_pii-1.1.0/src/k_pii/patterns/business_reg.py +55 -0
- ko_pii-1.1.0/src/k_pii/patterns/card.py +86 -0
- ko_pii-1.1.0/src/k_pii/patterns/corp_reg.py +80 -0
- ko_pii-1.1.0/src/k_pii/patterns/court_case.py +132 -0
- ko_pii-1.1.0/src/k_pii/patterns/driver_license.py +108 -0
- ko_pii-1.1.0/src/k_pii/patterns/edi_drug.py +116 -0
- ko_pii-1.1.0/src/k_pii/patterns/email.py +51 -0
- ko_pii-1.1.0/src/k_pii/patterns/fax.py +63 -0
- ko_pii-1.1.0/src/k_pii/patterns/frn.py +91 -0
- ko_pii-1.1.0/src/k_pii/patterns/ip.py +112 -0
- ko_pii-1.1.0/src/k_pii/patterns/medical_insurance.py +50 -0
- ko_pii-1.1.0/src/k_pii/patterns/passport.py +85 -0
- ko_pii-1.1.0/src/k_pii/patterns/person.py +594 -0
- ko_pii-1.1.0/src/k_pii/patterns/personal_attr.py +546 -0
- ko_pii-1.1.0/src/k_pii/patterns/phone.py +156 -0
- ko_pii-1.1.0/src/k_pii/patterns/pnu.py +106 -0
- ko_pii-1.1.0/src/k_pii/patterns/postal_code.py +117 -0
- ko_pii-1.1.0/src/k_pii/patterns/prescription.py +142 -0
- ko_pii-1.1.0/src/k_pii/patterns/rrn.py +96 -0
- ko_pii-1.1.0/src/k_pii/patterns/url.py +43 -0
- ko_pii-1.1.0/src/k_pii/patterns/vehicle.py +122 -0
- ko_pii-1.1.0/src/k_pii/reporting/__init__.py +5 -0
- ko_pii-1.1.0/src/k_pii/reporting/certificate.py +65 -0
- ko_pii-1.1.0/src/k_pii/reporting/html_report.py +255 -0
- ko_pii-1.1.0/src/k_pii/reporting/summary.py +75 -0
- ko_pii-1.1.0/src/k_pii/review/__init__.py +20 -0
- ko_pii-1.1.0/src/k_pii/review/feedback.py +120 -0
- ko_pii-1.1.0/src/k_pii/review/queue.py +193 -0
- ko_pii-1.1.0/src/k_pii/tabular.py +220 -0
- ko_pii-1.1.0/src/k_pii/vault/__init__.py +10 -0
- ko_pii-1.1.0/src/k_pii/vault/audit.py +124 -0
- ko_pii-1.1.0/src/k_pii/vault/encrypted.py +112 -0
- ko_pii-1.1.0/src/k_pii/vault/reversible.py +244 -0
- ko_pii-1.1.0/tests/integration/__init__.py +0 -0
- ko_pii-1.1.0/tests/integration/test_end_to_end.py +70 -0
- ko_pii-1.1.0/tests/unit/analytics/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/analytics/test_anonymizer_integration.py +33 -0
- ko_pii-1.1.0/tests/unit/analytics/test_combined_risk.py +76 -0
- ko_pii-1.1.0/tests/unit/analytics/test_k_anonymity.py +77 -0
- ko_pii-1.1.0/tests/unit/checksum/test_business_reg_checksum.py +51 -0
- ko_pii-1.1.0/tests/unit/checksum/test_corp_reg_checksum.py +44 -0
- ko_pii-1.1.0/tests/unit/checksum/test_luhn.py +42 -0
- ko_pii-1.1.0/tests/unit/checksum/test_rrn_checksum.py +50 -0
- ko_pii-1.1.0/tests/unit/context/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/context/test_context_rules.py +40 -0
- ko_pii-1.1.0/tests/unit/context/test_hanja.py +30 -0
- ko_pii-1.1.0/tests/unit/context/test_name_dictionary.py +25 -0
- ko_pii-1.1.0/tests/unit/context/test_name_origin.py +45 -0
- ko_pii-1.1.0/tests/unit/context/test_name_syllables.py +47 -0
- ko_pii-1.1.0/tests/unit/context/test_particles.py +24 -0
- ko_pii-1.1.0/tests/unit/context/test_romanization.py +33 -0
- ko_pii-1.1.0/tests/unit/dictionaries/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/dictionaries/test_agencies.py +20 -0
- ko_pii-1.1.0/tests/unit/dictionaries/test_agency_abbrev.py +61 -0
- ko_pii-1.1.0/tests/unit/dictionaries/test_combinations.py +156 -0
- ko_pii-1.1.0/tests/unit/dictionaries/test_common_words.py +11 -0
- ko_pii-1.1.0/tests/unit/dictionaries/test_districts.py +72 -0
- ko_pii-1.1.0/tests/unit/dictionaries/test_field_labels.py +25 -0
- ko_pii-1.1.0/tests/unit/dictionaries/test_surnames.py +33 -0
- ko_pii-1.1.0/tests/unit/dictionaries/test_titles.py +22 -0
- ko_pii-1.1.0/tests/unit/dictionaries/test_titles_special.py +91 -0
- ko_pii-1.1.0/tests/unit/domain/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/domain/test_civil_petition.py +35 -0
- ko_pii-1.1.0/tests/unit/domain/test_government.py +69 -0
- ko_pii-1.1.0/tests/unit/domain/test_hr.py +50 -0
- ko_pii-1.1.0/tests/unit/eval/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/eval/test_benchmark_smoke.py +34 -0
- ko_pii-1.1.0/tests/unit/eval/test_metrics.py +89 -0
- ko_pii-1.1.0/tests/unit/eval/test_synth.py +36 -0
- ko_pii-1.1.0/tests/unit/generalization/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/generalization/test_address.py +23 -0
- ko_pii-1.1.0/tests/unit/generalization/test_age.py +23 -0
- ko_pii-1.1.0/tests/unit/generalization/test_date.py +23 -0
- ko_pii-1.1.0/tests/unit/generalization/test_occupation.py +18 -0
- ko_pii-1.1.0/tests/unit/integrations/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/integrations/test_anonymizer_with_secondary.py +99 -0
- ko_pii-1.1.0/tests/unit/integrations/test_hybrid.py +91 -0
- ko_pii-1.1.0/tests/unit/integrations/test_mcp_server.py +23 -0
- ko_pii-1.1.0/tests/unit/integrations/test_presidio_plugin.py +51 -0
- ko_pii-1.1.0/tests/unit/integrations/test_privacy_filter_adapter.py +107 -0
- ko_pii-1.1.0/tests/unit/io_/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/io_/test_file_readers.py +204 -0
- ko_pii-1.1.0/tests/unit/io_/test_optional_formats.py +52 -0
- ko_pii-1.1.0/tests/unit/legal/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/legal/test_mapping.py +40 -0
- ko_pii-1.1.0/tests/unit/modes/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/modes/test_fpe.py +68 -0
- ko_pii-1.1.0/tests/unit/modes/test_hashed.py +35 -0
- ko_pii-1.1.0/tests/unit/modes/test_partial.py +51 -0
- ko_pii-1.1.0/tests/unit/modes/test_redact.py +54 -0
- ko_pii-1.1.0/tests/unit/modes/test_tokenize.py +59 -0
- ko_pii-1.1.0/tests/unit/patterns/test_account.py +39 -0
- ko_pii-1.1.0/tests/unit/patterns/test_address.py +53 -0
- ko_pii-1.1.0/tests/unit/patterns/test_address_jibun.py +37 -0
- ko_pii-1.1.0/tests/unit/patterns/test_birth.py +84 -0
- ko_pii-1.1.0/tests/unit/patterns/test_boundary_rules.py +101 -0
- ko_pii-1.1.0/tests/unit/patterns/test_business_reg.py +69 -0
- ko_pii-1.1.0/tests/unit/patterns/test_card.py +60 -0
- ko_pii-1.1.0/tests/unit/patterns/test_corp_reg.py +56 -0
- ko_pii-1.1.0/tests/unit/patterns/test_court_case.py +56 -0
- ko_pii-1.1.0/tests/unit/patterns/test_driver_license.py +79 -0
- ko_pii-1.1.0/tests/unit/patterns/test_edi_drug.py +39 -0
- ko_pii-1.1.0/tests/unit/patterns/test_email.py +56 -0
- ko_pii-1.1.0/tests/unit/patterns/test_fax.py +47 -0
- ko_pii-1.1.0/tests/unit/patterns/test_frn.py +85 -0
- ko_pii-1.1.0/tests/unit/patterns/test_ip.py +53 -0
- ko_pii-1.1.0/tests/unit/patterns/test_ip_v6.py +35 -0
- ko_pii-1.1.0/tests/unit/patterns/test_medical_insurance.py +59 -0
- ko_pii-1.1.0/tests/unit/patterns/test_passport.py +64 -0
- ko_pii-1.1.0/tests/unit/patterns/test_person.py +94 -0
- ko_pii-1.1.0/tests/unit/patterns/test_personal_attr.py +106 -0
- ko_pii-1.1.0/tests/unit/patterns/test_phone.py +83 -0
- ko_pii-1.1.0/tests/unit/patterns/test_phone_intl.py +30 -0
- ko_pii-1.1.0/tests/unit/patterns/test_pnu.py +70 -0
- ko_pii-1.1.0/tests/unit/patterns/test_postal_code.py +48 -0
- ko_pii-1.1.0/tests/unit/patterns/test_prescription.py +84 -0
- ko_pii-1.1.0/tests/unit/patterns/test_rrn.py +133 -0
- ko_pii-1.1.0/tests/unit/patterns/test_url.py +44 -0
- ko_pii-1.1.0/tests/unit/patterns/test_vehicle.py +52 -0
- ko_pii-1.1.0/tests/unit/reporting/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/reporting/test_certificate.py +23 -0
- ko_pii-1.1.0/tests/unit/reporting/test_html_report.py +41 -0
- ko_pii-1.1.0/tests/unit/reporting/test_summary.py +31 -0
- ko_pii-1.1.0/tests/unit/review/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/review/test_feedback.py +57 -0
- ko_pii-1.1.0/tests/unit/review/test_queue.py +74 -0
- ko_pii-1.1.0/tests/unit/test_anonymizer.py +82 -0
- ko_pii-1.1.0/tests/unit/test_batch.py +77 -0
- ko_pii-1.1.0/tests/unit/test_cli.py +77 -0
- ko_pii-1.1.0/tests/unit/test_detect_all.py +41 -0
- ko_pii-1.1.0/tests/unit/test_fp_stress.py +99 -0
- ko_pii-1.1.0/tests/unit/test_modes_policy.py +34 -0
- ko_pii-1.1.0/tests/unit/test_tabular.py +77 -0
- ko_pii-1.1.0/tests/unit/vault/__init__.py +0 -0
- ko_pii-1.1.0/tests/unit/vault/test_audit.py +50 -0
- ko_pii-1.1.0/tests/unit/vault/test_encrypted.py +60 -0
- ko_pii-1.1.0/tests/unit/vault/test_reversible.py +114 -0
ko_pii-1.1.0/.gitignore
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
|
|
8
|
+
# Distribution / packaging
|
|
9
|
+
.eggs/
|
|
10
|
+
build/
|
|
11
|
+
dist/
|
|
12
|
+
sdist/
|
|
13
|
+
wheels/
|
|
14
|
+
*.egg-info/
|
|
15
|
+
*.egg
|
|
16
|
+
|
|
17
|
+
# Virtual environments
|
|
18
|
+
.venv/
|
|
19
|
+
venv/
|
|
20
|
+
env/
|
|
21
|
+
ENV/
|
|
22
|
+
|
|
23
|
+
# Test & coverage
|
|
24
|
+
.pytest_cache/
|
|
25
|
+
.coverage
|
|
26
|
+
.coverage.*
|
|
27
|
+
htmlcov/
|
|
28
|
+
.tox/
|
|
29
|
+
.cache/
|
|
30
|
+
coverage.xml
|
|
31
|
+
*.cover
|
|
32
|
+
|
|
33
|
+
# Type checkers
|
|
34
|
+
.mypy_cache/
|
|
35
|
+
.pyright/
|
|
36
|
+
.ruff_cache/
|
|
37
|
+
|
|
38
|
+
# IDE
|
|
39
|
+
.vscode/
|
|
40
|
+
.idea/
|
|
41
|
+
*.swp
|
|
42
|
+
*.swo
|
|
43
|
+
.DS_Store
|
|
44
|
+
Thumbs.db
|
|
45
|
+
|
|
46
|
+
# Vault output (sensitive when populated)
|
|
47
|
+
*.vault.json
|
|
48
|
+
vaults/
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
본 프로젝트는 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)
|
|
4
|
+
형식 + [Semantic Versioning](https://semver.org/lang/ko/) 을 따른다.
|
|
5
|
+
|
|
6
|
+
## [Unreleased]
|
|
7
|
+
|
|
8
|
+
## [1.1.0] - 2026-05-21
|
|
9
|
+
|
|
10
|
+
Phase 9 (실데이터 평가 + 룰 정제) 완료. KDPII 53,778 문서 실데이터
|
|
11
|
+
벤치마크 도입. PERSON 풀네임 (3자+) 만 평가 기준 (개인정보보호법 제2조).
|
|
12
|
+
|
|
13
|
+
### Added — 평가 인프라
|
|
14
|
+
|
|
15
|
+
- `eval/kdpii.py` — KDPII 평가 모듈 (`--person-min-length=3` 기본)
|
|
16
|
+
- `eval/fp_collector.py` — 자동 과탐 어휘 수집 도구
|
|
17
|
+
(비식별 텍스트 → PERSON 과탐 → common_words 후보 추출)
|
|
18
|
+
- 합성 코퍼스 8 → **13 템플릿** 확장:
|
|
19
|
+
- press_release / audit_report / contract / hr_appointment / admin_disposition
|
|
20
|
+
|
|
21
|
+
### Added — 사전 확장
|
|
22
|
+
|
|
23
|
+
- `dictionaries/districts.py`:
|
|
24
|
+
- 동 사전 +85개 (COMMON_DONGS)
|
|
25
|
+
- 국가명 사전 70+ (COUNTRIES)
|
|
26
|
+
- 시 약칭 60+ (EXTRA_CITY_ABBREV)
|
|
27
|
+
- `dictionaries/universities.py`: 약칭 +30 (3자 정식형 누락 보강)
|
|
28
|
+
- `dictionaries/titles.py`: 권사/집사/매니저/학생회장/길드장 등 30+
|
|
29
|
+
- `dictionaries/majors.py`: 학과 +70 (실용음악과/예술학과 등)
|
|
30
|
+
- `dictionaries/common_words.py`: KDPII 자동 수집 어휘 ~200 + 공문서 어휘 ~30
|
|
31
|
+
- `patterns/person.py`: `_COMMON_KOREAN_ENDINGS` 한국어 어말 16종 사전
|
|
32
|
+
|
|
33
|
+
### Added — 검출 정확도
|
|
34
|
+
|
|
35
|
+
- AGE: 한글 음역 일의자리 단독 ("한 살/세 살"), 환갑/팔순 등 명사,
|
|
36
|
+
N개월 영유아 anchor, "30대" 연령대 패턴
|
|
37
|
+
- ADDRESS: 국적 접미사 자동 strip ("한국인" → "한국")
|
|
38
|
+
- DT_BIRTH: 30+ 비-생일 키워드 거부 ("선고일자/시행일자/배포일자" 등)
|
|
39
|
+
- PHONE: 대표번호 (15xx-18xx) 8자리 패턴 추가
|
|
40
|
+
- EDUCATION: 정규식 outer named-group 분리 (X대/X고/X중/X초 약칭 매칭)
|
|
41
|
+
|
|
42
|
+
### Added — IO + 메타데이터
|
|
43
|
+
|
|
44
|
+
- `io_/docx.py`: DOCX 메타데이터 (creator/lastModifiedBy/title) 추출
|
|
45
|
+
- `io_/hwpx.py`: HWPX 메타데이터 추출
|
|
46
|
+
|
|
47
|
+
### Changed — 평가 정책 (Breaking)
|
|
48
|
+
|
|
49
|
+
- KDPII 평가 기본값: PERSON 풀네임만 (3자+) — 개인정보보호법 제2조
|
|
50
|
+
정의상 단독 1-2자 별명은 PII 아님. `--person-min-length=1` 으로 이전
|
|
51
|
+
동작 복원 가능.
|
|
52
|
+
- KLUE-NER 평가도 풀네임만 (이전 2자+ → 3자+)
|
|
53
|
+
- 합성 코퍼스 위치 명확화 — "회귀 감지 sanity check" 으로 격하 (실제
|
|
54
|
+
정확도는 KDPII / 공공 문서 본문 산문 측정)
|
|
55
|
+
|
|
56
|
+
### Documentation
|
|
57
|
+
|
|
58
|
+
- `docs/EVALUATION_REPORT.md` — 통합 평가 보고서 (한국어 명명 정탐/오탐/미탐)
|
|
59
|
+
- `docs/kdpii_evaluation_report.md` — KDPII 결과 보고서
|
|
60
|
+
- `docs/domain_fit_report.md` — 도메인 적합도 분석
|
|
61
|
+
- `docs/kdpii_visual_compare.html` — KDPII 100 문서 시각 비교
|
|
62
|
+
- CLAUDE.md Decision Log D-011~D-027 추가
|
|
63
|
+
|
|
64
|
+
### 정확도 (KDPII 53,778 문서, PERSON 풀네임만)
|
|
65
|
+
|
|
66
|
+
| Tier | 카테고리 | F1 |
|
|
67
|
+
|---|---|---:|
|
|
68
|
+
| S | EMAIL/VEHICLE/FRN/RRN/IP/PHONE/URL | 0.99+ |
|
|
69
|
+
| A | WEIGHT/HEIGHT/DRIVER_LICENSE/ACCOUNT/AGE | 0.82~0.92 |
|
|
70
|
+
| B | PASSPORT/MAJOR/DT_BIRTH/EDUCATION/POSITION | 0.55~0.80 |
|
|
71
|
+
| C | ADDRESS | 0.52 |
|
|
72
|
+
| D | PERSON/CARD | 0.14~0.19 |
|
|
73
|
+
| **전체** | | **0.699** |
|
|
74
|
+
|
|
75
|
+
- 공공 문서 본문 산문 (메인 도메인): F1 ≈ 0.83
|
|
76
|
+
- 합성 13 템플릿: F1 = 0.85 (회귀 감지 sanity)
|
|
77
|
+
- KLUE-NER PERSON 풀네임: F1 = 0.376
|
|
78
|
+
|
|
79
|
+
## [1.0.0] - 2026-05-15
|
|
80
|
+
|
|
81
|
+
첫 정식 릴리스. 한국 공공 부문 PII 검출·가명화 도구로 production-ready 수준
|
|
82
|
+
도달. 외부 ML 없이 룰만으로 합성 공문서 F1=1.000, KLUE-NER (한국 인명만)
|
|
83
|
+
F1=0.331 달성.
|
|
84
|
+
|
|
85
|
+
### Added — Phase 11: OpenAI Privacy Filter 어댑터 (옵셔널 ML 통합)
|
|
86
|
+
- `integrations/` 모듈 — SecondaryDetector 프로토콜 + 어댑터들
|
|
87
|
+
- OpenAI Privacy Filter 어댑터 (Apache-2.0, 1.5B params, 다국어 PII)
|
|
88
|
+
- Hybrid Anonymizer — 4가지 병합 모드 (union/intersection/cross_validation/enrich_primary)
|
|
89
|
+
- `[ml]` extras — `transformers>=4.40`, `torch>=2.0` (옵셔널)
|
|
90
|
+
|
|
91
|
+
### Added — Phase 10: 솔루션 인프라
|
|
92
|
+
- HWP 5.x (OLE) + PDF 입력 — `[file]` extras (`olefile`, `pypdf`)
|
|
93
|
+
- 표 컬럼-단위 처리 (`tabular.py`) — CSV/XLSX 헤더 자동 매핑 (80+ 헤더)
|
|
94
|
+
- Vault 암호화 (AES-256-GCM + PBKDF2 480k iter) — `[security]` extras
|
|
95
|
+
- 감사 로그 (JSONL, 모든 reveal 추적) — 보호법 제29조 직접 대응
|
|
96
|
+
- 배치/병렬 처리 (multiprocessing) — CLI `--batch --workers N`
|
|
97
|
+
- 검토 큐 + 피드백 학습 (`review/`) — 사람-시스템 협업
|
|
98
|
+
- HTML 검토 리포트 (단일 정적 파일)
|
|
99
|
+
- 한자 → 한글 변환 + Revised Romanization
|
|
100
|
+
|
|
101
|
+
### Added — Phase 9: 부분 마스킹 + FPE + 식의약·법조 도메인
|
|
102
|
+
- `modes/partial.py` — 부분 마스킹 (홍OO, 880101-1******, 010-****-5678)
|
|
103
|
+
- `modes/fpe.py` — 형식 보존 가명화 (RRN 체크섬 자동 재계산)
|
|
104
|
+
- 신규 PII: KCD (질병코드), EDI_DRUG, COURT_CASE (법원 사건번호)
|
|
105
|
+
|
|
106
|
+
### Added — Phase 8: 결합 위험도 + k-익명성
|
|
107
|
+
- `analytics/combined_risk.py` — 식별자/준식별자/민감속성 4분류 + 조합 평가
|
|
108
|
+
- `analytics/k_anonymity.py` — k-익명성 평가 + 일반화 제안
|
|
109
|
+
- 신규 PII: PNU (필지고유번호)
|
|
110
|
+
|
|
111
|
+
### Added — Phase 7: 평가 + 문서화
|
|
112
|
+
- 합성 공문서 생성기 (6 템플릿, Faker 불사용)
|
|
113
|
+
- Precision/Recall/F1 메트릭 + 벤치마크 CLI
|
|
114
|
+
- KLUE-NER 외부 평가 (한국어 자연어 NER) + Korean-only 모드
|
|
115
|
+
- `docs/` — legal_mapping, risk_levels, coverage, real_data_evaluation
|
|
116
|
+
|
|
117
|
+
### Added — Phase 6: 통합 API + 정책 + 리포팅 + CLI
|
|
118
|
+
- `Anonymizer` 통합 클래스
|
|
119
|
+
- `ProcessingMode` (PARANOID/STRICT/BALANCED/PERMISSIVE/AUDIT)
|
|
120
|
+
- `legal/mapping.py` — 카테고리 ↔ 법조항 단일 매핑
|
|
121
|
+
- `reporting/{summary,certificate}.py` — 감사 증명서
|
|
122
|
+
- `ko-pii` CLI 엔트리포인트
|
|
123
|
+
|
|
124
|
+
### Added — Phase 5: Vault + 처리 모드
|
|
125
|
+
- `vault/reversible.py` — 가역 가명화 (JSON schema v1, salted SHA-256)
|
|
126
|
+
- 6 처리 전략: tokenize / redact / asterisk / hashed / partial / fpe
|
|
127
|
+
- `generalization/` — 연령·날짜·주소·직업 일반화
|
|
128
|
+
|
|
129
|
+
### Added — Phase 4: 도메인 특화 룰
|
|
130
|
+
- `domain/government.py` — DOC_ID
|
|
131
|
+
- `domain/civil_petition.py` — PETITION_ID
|
|
132
|
+
- `domain/hr.py` — EMPLOYEE_ID
|
|
133
|
+
|
|
134
|
+
### Added — Phase 3: 컨텍스트 기반 이름 탐지
|
|
135
|
+
- 한국 성씨 사전 (286개)
|
|
136
|
+
- 직책 사전 (일반직 + 경찰 11계급, 소방 11계급, 군 19계급, 검사·법관·외무)
|
|
137
|
+
- 부처·청·위원회 사전 (정부조직법 19부6처18청6위원회 + 약칭)
|
|
138
|
+
- 행정구역 사전 (17 광역 + 226 기초자치단체)
|
|
139
|
+
- 한국어 조사 처리 + 누적 사전 (NameDictionary)
|
|
140
|
+
- 컨텍스트 점수 시스템 + 점수 보강 룰 (음절 통계, co-occurrence 등)
|
|
141
|
+
|
|
142
|
+
### Added — Phase 2: 비검증 PII (정규식 + 컨텍스트)
|
|
143
|
+
- PHONE (국제 +82 포함), EMAIL, POSTAL_CODE, IP (v4+v6),
|
|
144
|
+
VEHICLE, URL, ADDRESS (도로명+지번), ACCOUNT, FAX
|
|
145
|
+
|
|
146
|
+
### Added — Phase 1: 결정적 PII (체크섬)
|
|
147
|
+
- RRN (주민등록번호) + 후-2020 무작위화 대응
|
|
148
|
+
- FRN (외국인등록번호)
|
|
149
|
+
- BUSINESS_REG, CORP_REG (체크섬)
|
|
150
|
+
- DRIVER_LICENSE, PASSPORT
|
|
151
|
+
- CARD (Luhn)
|
|
152
|
+
- MEDICAL_INSURANCE
|
|
153
|
+
|
|
154
|
+
[Unreleased]: https://github.com/modak000/ko-pii/compare/v1.0.0...HEAD
|
|
155
|
+
[1.0.0]: https://github.com/modak000/ko-pii/releases/tag/v1.0.0
|