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.
Files changed (245) hide show
  1. ko_pii-1.1.0/.gitignore +48 -0
  2. ko_pii-1.1.0/CHANGELOG.md +155 -0
  3. ko_pii-1.1.0/CLAUDE.md +560 -0
  4. ko_pii-1.1.0/CONTRIBUTING.md +147 -0
  5. ko_pii-1.1.0/LICENSE +201 -0
  6. ko_pii-1.1.0/PKG-INFO +700 -0
  7. ko_pii-1.1.0/README.md +641 -0
  8. ko_pii-1.1.0/docs/EVALUATION_REPORT.md +582 -0
  9. ko_pii-1.1.0/docs/annotation_policy.md +174 -0
  10. ko_pii-1.1.0/docs/coverage.md +83 -0
  11. ko_pii-1.1.0/docs/domain_fit_report.md +178 -0
  12. ko_pii-1.1.0/docs/eval_samples.md +254 -0
  13. ko_pii-1.1.0/docs/integration_mcp.md +150 -0
  14. ko_pii-1.1.0/docs/integration_openai_privacy_filter.md +269 -0
  15. ko_pii-1.1.0/docs/integration_presidio.md +147 -0
  16. ko_pii-1.1.0/docs/kdpii_visual_compare.html +649 -0
  17. ko_pii-1.1.0/docs/legal_mapping.md +57 -0
  18. ko_pii-1.1.0/docs/pattern_analysis.md +235 -0
  19. ko_pii-1.1.0/docs/real_world_crawl_validation.md +124 -0
  20. ko_pii-1.1.0/docs/risk_levels.md +46 -0
  21. ko_pii-1.1.0/docs/sample_redaction.html +109 -0
  22. ko_pii-1.1.0/docs/sample_redaction.md +174 -0
  23. ko_pii-1.1.0/docs/showcase.html +41 -0
  24. ko_pii-1.1.0/docs/synthetic_sample.html +109 -0
  25. ko_pii-1.1.0/docs/user_megademo.html +668 -0
  26. ko_pii-1.1.0/pyproject.toml +111 -0
  27. ko_pii-1.1.0/src/k_pii/__init__.py +68 -0
  28. ko_pii-1.1.0/src/k_pii/analytics/__init__.py +24 -0
  29. ko_pii-1.1.0/src/k_pii/analytics/combined_risk.py +153 -0
  30. ko_pii-1.1.0/src/k_pii/analytics/k_anonymity.py +121 -0
  31. ko_pii-1.1.0/src/k_pii/anonymizer.py +240 -0
  32. ko_pii-1.1.0/src/k_pii/batch.py +252 -0
  33. ko_pii-1.1.0/src/k_pii/checksum/__init__.py +1 -0
  34. ko_pii-1.1.0/src/k_pii/checksum/business_reg_checksum.py +26 -0
  35. ko_pii-1.1.0/src/k_pii/checksum/corp_reg_checksum.py +29 -0
  36. ko_pii-1.1.0/src/k_pii/checksum/luhn.py +35 -0
  37. ko_pii-1.1.0/src/k_pii/checksum/rrn_checksum.py +27 -0
  38. ko_pii-1.1.0/src/k_pii/cli.py +286 -0
  39. ko_pii-1.1.0/src/k_pii/context/__init__.py +26 -0
  40. ko_pii-1.1.0/src/k_pii/context/context_rules.py +215 -0
  41. ko_pii-1.1.0/src/k_pii/context/hanja.py +94 -0
  42. ko_pii-1.1.0/src/k_pii/context/name_dictionary.py +68 -0
  43. ko_pii-1.1.0/src/k_pii/context/name_origin.py +89 -0
  44. ko_pii-1.1.0/src/k_pii/context/name_syllables.py +122 -0
  45. ko_pii-1.1.0/src/k_pii/context/particles.py +27 -0
  46. ko_pii-1.1.0/src/k_pii/context/romanization.py +109 -0
  47. ko_pii-1.1.0/src/k_pii/core/__init__.py +1 -0
  48. ko_pii-1.1.0/src/k_pii/core/modes.py +100 -0
  49. ko_pii-1.1.0/src/k_pii/core/types.py +30 -0
  50. ko_pii-1.1.0/src/k_pii/detect.py +122 -0
  51. ko_pii-1.1.0/src/k_pii/dictionaries/__init__.py +61 -0
  52. ko_pii-1.1.0/src/k_pii/dictionaries/agencies.py +210 -0
  53. ko_pii-1.1.0/src/k_pii/dictionaries/agency_abbrev.py +164 -0
  54. ko_pii-1.1.0/src/k_pii/dictionaries/agency_titles.py +204 -0
  55. ko_pii-1.1.0/src/k_pii/dictionaries/common_words.py +722 -0
  56. ko_pii-1.1.0/src/k_pii/dictionaries/districts.py +392 -0
  57. ko_pii-1.1.0/src/k_pii/dictionaries/field_labels.py +42 -0
  58. ko_pii-1.1.0/src/k_pii/dictionaries/majors.py +246 -0
  59. ko_pii-1.1.0/src/k_pii/dictionaries/surnames.py +68 -0
  60. ko_pii-1.1.0/src/k_pii/dictionaries/titles.py +315 -0
  61. ko_pii-1.1.0/src/k_pii/dictionaries/universities.py +261 -0
  62. ko_pii-1.1.0/src/k_pii/domain/__init__.py +15 -0
  63. ko_pii-1.1.0/src/k_pii/domain/civil_petition.py +56 -0
  64. ko_pii-1.1.0/src/k_pii/domain/government.py +74 -0
  65. ko_pii-1.1.0/src/k_pii/domain/hr.py +67 -0
  66. ko_pii-1.1.0/src/k_pii/eval/__init__.py +26 -0
  67. ko_pii-1.1.0/src/k_pii/eval/benchmark.py +43 -0
  68. ko_pii-1.1.0/src/k_pii/eval/fp_collector.py +134 -0
  69. ko_pii-1.1.0/src/k_pii/eval/kdpii.py +295 -0
  70. ko_pii-1.1.0/src/k_pii/eval/klue_benchmark.py +75 -0
  71. ko_pii-1.1.0/src/k_pii/eval/klue_ner.py +260 -0
  72. ko_pii-1.1.0/src/k_pii/eval/metrics.py +150 -0
  73. ko_pii-1.1.0/src/k_pii/eval/model_comparison.py +727 -0
  74. ko_pii-1.1.0/src/k_pii/eval/presidio_compare.py +194 -0
  75. ko_pii-1.1.0/src/k_pii/eval/synth.py +1416 -0
  76. ko_pii-1.1.0/src/k_pii/generalization/__init__.py +18 -0
  77. ko_pii-1.1.0/src/k_pii/generalization/address.py +38 -0
  78. ko_pii-1.1.0/src/k_pii/generalization/age.py +16 -0
  79. ko_pii-1.1.0/src/k_pii/generalization/date.py +21 -0
  80. ko_pii-1.1.0/src/k_pii/generalization/occupation.py +29 -0
  81. ko_pii-1.1.0/src/k_pii/integrations/__init__.py +36 -0
  82. ko_pii-1.1.0/src/k_pii/integrations/base.py +45 -0
  83. ko_pii-1.1.0/src/k_pii/integrations/hybrid.py +169 -0
  84. ko_pii-1.1.0/src/k_pii/integrations/mcp_server.py +275 -0
  85. ko_pii-1.1.0/src/k_pii/integrations/openai_privacy_filter.py +270 -0
  86. ko_pii-1.1.0/src/k_pii/integrations/presidio_plugin.py +170 -0
  87. ko_pii-1.1.0/src/k_pii/io_/__init__.py +18 -0
  88. ko_pii-1.1.0/src/k_pii/io_/csv_reader.py +26 -0
  89. ko_pii-1.1.0/src/k_pii/io_/dispatcher.py +53 -0
  90. ko_pii-1.1.0/src/k_pii/io_/docx.py +69 -0
  91. ko_pii-1.1.0/src/k_pii/io_/hwp.py +183 -0
  92. ko_pii-1.1.0/src/k_pii/io_/hwpx.py +90 -0
  93. ko_pii-1.1.0/src/k_pii/io_/pdf.py +37 -0
  94. ko_pii-1.1.0/src/k_pii/io_/plain.py +13 -0
  95. ko_pii-1.1.0/src/k_pii/io_/xlsx.py +95 -0
  96. ko_pii-1.1.0/src/k_pii/legal/__init__.py +16 -0
  97. ko_pii-1.1.0/src/k_pii/legal/mapping.py +136 -0
  98. ko_pii-1.1.0/src/k_pii/modes/__init__.py +8 -0
  99. ko_pii-1.1.0/src/k_pii/modes/_apply.py +49 -0
  100. ko_pii-1.1.0/src/k_pii/modes/fpe.py +209 -0
  101. ko_pii-1.1.0/src/k_pii/modes/hashed.py +36 -0
  102. ko_pii-1.1.0/src/k_pii/modes/partial.py +310 -0
  103. ko_pii-1.1.0/src/k_pii/modes/redact.py +79 -0
  104. ko_pii-1.1.0/src/k_pii/modes/tokenize.py +42 -0
  105. ko_pii-1.1.0/src/k_pii/patterns/__init__.py +1 -0
  106. ko_pii-1.1.0/src/k_pii/patterns/account.py +146 -0
  107. ko_pii-1.1.0/src/k_pii/patterns/address.py +284 -0
  108. ko_pii-1.1.0/src/k_pii/patterns/birth.py +283 -0
  109. ko_pii-1.1.0/src/k_pii/patterns/business_reg.py +55 -0
  110. ko_pii-1.1.0/src/k_pii/patterns/card.py +86 -0
  111. ko_pii-1.1.0/src/k_pii/patterns/corp_reg.py +80 -0
  112. ko_pii-1.1.0/src/k_pii/patterns/court_case.py +132 -0
  113. ko_pii-1.1.0/src/k_pii/patterns/driver_license.py +108 -0
  114. ko_pii-1.1.0/src/k_pii/patterns/edi_drug.py +116 -0
  115. ko_pii-1.1.0/src/k_pii/patterns/email.py +51 -0
  116. ko_pii-1.1.0/src/k_pii/patterns/fax.py +63 -0
  117. ko_pii-1.1.0/src/k_pii/patterns/frn.py +91 -0
  118. ko_pii-1.1.0/src/k_pii/patterns/ip.py +112 -0
  119. ko_pii-1.1.0/src/k_pii/patterns/medical_insurance.py +50 -0
  120. ko_pii-1.1.0/src/k_pii/patterns/passport.py +85 -0
  121. ko_pii-1.1.0/src/k_pii/patterns/person.py +594 -0
  122. ko_pii-1.1.0/src/k_pii/patterns/personal_attr.py +546 -0
  123. ko_pii-1.1.0/src/k_pii/patterns/phone.py +156 -0
  124. ko_pii-1.1.0/src/k_pii/patterns/pnu.py +106 -0
  125. ko_pii-1.1.0/src/k_pii/patterns/postal_code.py +117 -0
  126. ko_pii-1.1.0/src/k_pii/patterns/prescription.py +142 -0
  127. ko_pii-1.1.0/src/k_pii/patterns/rrn.py +96 -0
  128. ko_pii-1.1.0/src/k_pii/patterns/url.py +43 -0
  129. ko_pii-1.1.0/src/k_pii/patterns/vehicle.py +122 -0
  130. ko_pii-1.1.0/src/k_pii/reporting/__init__.py +5 -0
  131. ko_pii-1.1.0/src/k_pii/reporting/certificate.py +65 -0
  132. ko_pii-1.1.0/src/k_pii/reporting/html_report.py +255 -0
  133. ko_pii-1.1.0/src/k_pii/reporting/summary.py +75 -0
  134. ko_pii-1.1.0/src/k_pii/review/__init__.py +20 -0
  135. ko_pii-1.1.0/src/k_pii/review/feedback.py +120 -0
  136. ko_pii-1.1.0/src/k_pii/review/queue.py +193 -0
  137. ko_pii-1.1.0/src/k_pii/tabular.py +220 -0
  138. ko_pii-1.1.0/src/k_pii/vault/__init__.py +10 -0
  139. ko_pii-1.1.0/src/k_pii/vault/audit.py +124 -0
  140. ko_pii-1.1.0/src/k_pii/vault/encrypted.py +112 -0
  141. ko_pii-1.1.0/src/k_pii/vault/reversible.py +244 -0
  142. ko_pii-1.1.0/tests/integration/__init__.py +0 -0
  143. ko_pii-1.1.0/tests/integration/test_end_to_end.py +70 -0
  144. ko_pii-1.1.0/tests/unit/analytics/__init__.py +0 -0
  145. ko_pii-1.1.0/tests/unit/analytics/test_anonymizer_integration.py +33 -0
  146. ko_pii-1.1.0/tests/unit/analytics/test_combined_risk.py +76 -0
  147. ko_pii-1.1.0/tests/unit/analytics/test_k_anonymity.py +77 -0
  148. ko_pii-1.1.0/tests/unit/checksum/test_business_reg_checksum.py +51 -0
  149. ko_pii-1.1.0/tests/unit/checksum/test_corp_reg_checksum.py +44 -0
  150. ko_pii-1.1.0/tests/unit/checksum/test_luhn.py +42 -0
  151. ko_pii-1.1.0/tests/unit/checksum/test_rrn_checksum.py +50 -0
  152. ko_pii-1.1.0/tests/unit/context/__init__.py +0 -0
  153. ko_pii-1.1.0/tests/unit/context/test_context_rules.py +40 -0
  154. ko_pii-1.1.0/tests/unit/context/test_hanja.py +30 -0
  155. ko_pii-1.1.0/tests/unit/context/test_name_dictionary.py +25 -0
  156. ko_pii-1.1.0/tests/unit/context/test_name_origin.py +45 -0
  157. ko_pii-1.1.0/tests/unit/context/test_name_syllables.py +47 -0
  158. ko_pii-1.1.0/tests/unit/context/test_particles.py +24 -0
  159. ko_pii-1.1.0/tests/unit/context/test_romanization.py +33 -0
  160. ko_pii-1.1.0/tests/unit/dictionaries/__init__.py +0 -0
  161. ko_pii-1.1.0/tests/unit/dictionaries/test_agencies.py +20 -0
  162. ko_pii-1.1.0/tests/unit/dictionaries/test_agency_abbrev.py +61 -0
  163. ko_pii-1.1.0/tests/unit/dictionaries/test_combinations.py +156 -0
  164. ko_pii-1.1.0/tests/unit/dictionaries/test_common_words.py +11 -0
  165. ko_pii-1.1.0/tests/unit/dictionaries/test_districts.py +72 -0
  166. ko_pii-1.1.0/tests/unit/dictionaries/test_field_labels.py +25 -0
  167. ko_pii-1.1.0/tests/unit/dictionaries/test_surnames.py +33 -0
  168. ko_pii-1.1.0/tests/unit/dictionaries/test_titles.py +22 -0
  169. ko_pii-1.1.0/tests/unit/dictionaries/test_titles_special.py +91 -0
  170. ko_pii-1.1.0/tests/unit/domain/__init__.py +0 -0
  171. ko_pii-1.1.0/tests/unit/domain/test_civil_petition.py +35 -0
  172. ko_pii-1.1.0/tests/unit/domain/test_government.py +69 -0
  173. ko_pii-1.1.0/tests/unit/domain/test_hr.py +50 -0
  174. ko_pii-1.1.0/tests/unit/eval/__init__.py +0 -0
  175. ko_pii-1.1.0/tests/unit/eval/test_benchmark_smoke.py +34 -0
  176. ko_pii-1.1.0/tests/unit/eval/test_metrics.py +89 -0
  177. ko_pii-1.1.0/tests/unit/eval/test_synth.py +36 -0
  178. ko_pii-1.1.0/tests/unit/generalization/__init__.py +0 -0
  179. ko_pii-1.1.0/tests/unit/generalization/test_address.py +23 -0
  180. ko_pii-1.1.0/tests/unit/generalization/test_age.py +23 -0
  181. ko_pii-1.1.0/tests/unit/generalization/test_date.py +23 -0
  182. ko_pii-1.1.0/tests/unit/generalization/test_occupation.py +18 -0
  183. ko_pii-1.1.0/tests/unit/integrations/__init__.py +0 -0
  184. ko_pii-1.1.0/tests/unit/integrations/test_anonymizer_with_secondary.py +99 -0
  185. ko_pii-1.1.0/tests/unit/integrations/test_hybrid.py +91 -0
  186. ko_pii-1.1.0/tests/unit/integrations/test_mcp_server.py +23 -0
  187. ko_pii-1.1.0/tests/unit/integrations/test_presidio_plugin.py +51 -0
  188. ko_pii-1.1.0/tests/unit/integrations/test_privacy_filter_adapter.py +107 -0
  189. ko_pii-1.1.0/tests/unit/io_/__init__.py +0 -0
  190. ko_pii-1.1.0/tests/unit/io_/test_file_readers.py +204 -0
  191. ko_pii-1.1.0/tests/unit/io_/test_optional_formats.py +52 -0
  192. ko_pii-1.1.0/tests/unit/legal/__init__.py +0 -0
  193. ko_pii-1.1.0/tests/unit/legal/test_mapping.py +40 -0
  194. ko_pii-1.1.0/tests/unit/modes/__init__.py +0 -0
  195. ko_pii-1.1.0/tests/unit/modes/test_fpe.py +68 -0
  196. ko_pii-1.1.0/tests/unit/modes/test_hashed.py +35 -0
  197. ko_pii-1.1.0/tests/unit/modes/test_partial.py +51 -0
  198. ko_pii-1.1.0/tests/unit/modes/test_redact.py +54 -0
  199. ko_pii-1.1.0/tests/unit/modes/test_tokenize.py +59 -0
  200. ko_pii-1.1.0/tests/unit/patterns/test_account.py +39 -0
  201. ko_pii-1.1.0/tests/unit/patterns/test_address.py +53 -0
  202. ko_pii-1.1.0/tests/unit/patterns/test_address_jibun.py +37 -0
  203. ko_pii-1.1.0/tests/unit/patterns/test_birth.py +84 -0
  204. ko_pii-1.1.0/tests/unit/patterns/test_boundary_rules.py +101 -0
  205. ko_pii-1.1.0/tests/unit/patterns/test_business_reg.py +69 -0
  206. ko_pii-1.1.0/tests/unit/patterns/test_card.py +60 -0
  207. ko_pii-1.1.0/tests/unit/patterns/test_corp_reg.py +56 -0
  208. ko_pii-1.1.0/tests/unit/patterns/test_court_case.py +56 -0
  209. ko_pii-1.1.0/tests/unit/patterns/test_driver_license.py +79 -0
  210. ko_pii-1.1.0/tests/unit/patterns/test_edi_drug.py +39 -0
  211. ko_pii-1.1.0/tests/unit/patterns/test_email.py +56 -0
  212. ko_pii-1.1.0/tests/unit/patterns/test_fax.py +47 -0
  213. ko_pii-1.1.0/tests/unit/patterns/test_frn.py +85 -0
  214. ko_pii-1.1.0/tests/unit/patterns/test_ip.py +53 -0
  215. ko_pii-1.1.0/tests/unit/patterns/test_ip_v6.py +35 -0
  216. ko_pii-1.1.0/tests/unit/patterns/test_medical_insurance.py +59 -0
  217. ko_pii-1.1.0/tests/unit/patterns/test_passport.py +64 -0
  218. ko_pii-1.1.0/tests/unit/patterns/test_person.py +94 -0
  219. ko_pii-1.1.0/tests/unit/patterns/test_personal_attr.py +106 -0
  220. ko_pii-1.1.0/tests/unit/patterns/test_phone.py +83 -0
  221. ko_pii-1.1.0/tests/unit/patterns/test_phone_intl.py +30 -0
  222. ko_pii-1.1.0/tests/unit/patterns/test_pnu.py +70 -0
  223. ko_pii-1.1.0/tests/unit/patterns/test_postal_code.py +48 -0
  224. ko_pii-1.1.0/tests/unit/patterns/test_prescription.py +84 -0
  225. ko_pii-1.1.0/tests/unit/patterns/test_rrn.py +133 -0
  226. ko_pii-1.1.0/tests/unit/patterns/test_url.py +44 -0
  227. ko_pii-1.1.0/tests/unit/patterns/test_vehicle.py +52 -0
  228. ko_pii-1.1.0/tests/unit/reporting/__init__.py +0 -0
  229. ko_pii-1.1.0/tests/unit/reporting/test_certificate.py +23 -0
  230. ko_pii-1.1.0/tests/unit/reporting/test_html_report.py +41 -0
  231. ko_pii-1.1.0/tests/unit/reporting/test_summary.py +31 -0
  232. ko_pii-1.1.0/tests/unit/review/__init__.py +0 -0
  233. ko_pii-1.1.0/tests/unit/review/test_feedback.py +57 -0
  234. ko_pii-1.1.0/tests/unit/review/test_queue.py +74 -0
  235. ko_pii-1.1.0/tests/unit/test_anonymizer.py +82 -0
  236. ko_pii-1.1.0/tests/unit/test_batch.py +77 -0
  237. ko_pii-1.1.0/tests/unit/test_cli.py +77 -0
  238. ko_pii-1.1.0/tests/unit/test_detect_all.py +41 -0
  239. ko_pii-1.1.0/tests/unit/test_fp_stress.py +99 -0
  240. ko_pii-1.1.0/tests/unit/test_modes_policy.py +34 -0
  241. ko_pii-1.1.0/tests/unit/test_tabular.py +77 -0
  242. ko_pii-1.1.0/tests/unit/vault/__init__.py +0 -0
  243. ko_pii-1.1.0/tests/unit/vault/test_audit.py +50 -0
  244. ko_pii-1.1.0/tests/unit/vault/test_encrypted.py +60 -0
  245. ko_pii-1.1.0/tests/unit/vault/test_reversible.py +114 -0
@@ -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