blueradiance commited on
Commit
ed684ca
·
verified ·
1 Parent(s): c43236e

Upload 4 files

Browse files
Files changed (4) hide show
  1. LICENSE +5 -12
  2. README.md +4 -32
  3. app.py +11 -34
  4. requirements.txt +1 -1
LICENSE CHANGED
@@ -1,12 +1,5 @@
1
- Copyright (c) 2025 blueradiance
2
-
3
- 소프트웨어는 개인적, 비영리적 목적에 한해 자유롭게 사용 및 공유가 가능합니다.
4
- 단, 다음 조건을 반드시 따라야 합니다:
5
-
6
- 1. 상업적 이용은 금지됩니다. (유료 서비스, 상업 배포 포함)
7
- 2. 본 소프트웨어의 내용을 임의로 수정하여 재배포하는 행위는 금지됩니다.
8
- 3. 사용 시 반드시 아래와 같이 출처를 명시해야 합니다:
9
- 👉 출처: blueradiance / masking-app
10
- 4. 소프트웨어는 "있는 그대로" 제공되며, 사용에 따른 책임은 사용자에게 있습니다.
11
-
12
- 이 조건에 동의하지 않는 경우, 본 소프트웨어를 사용할 수 없습니다.
 
1
+ MIT License (내부용)
2
+ 본 앱은 개인 및 비영리 목적으로 자유롭게 사용할 수 있으며,
3
+ 치환 결과에 대한 법적 책임은 사용자에게 있습니다.
4
+ 임의 수정 재배포를 금지합니다.
5
+ 출처 명시: blueradiance / masking-app
 
 
 
 
 
 
 
README.md CHANGED
@@ -1,38 +1,10 @@
1
  ---
2
- title: 이름 + 민감정보 + 초/중/고 마스킹기 (초성 기반)
3
- emoji: 🔐
4
  colorFrom: indigo
5
  colorTo: blue
6
  sdk: gradio
7
- sdk_version: "3.50.2"
8
  app_file: app.py
9
  pinned: false
10
- ---
11
-
12
- # 🔐 이름 + 민감정보 + 초/중/고 마스킹기 (초성 기반)
13
-
14
- - 민감정보 마스킹 (땡땡이 마스킹)
15
- - 초등학교/중학교/고등학교 이름 자동 초성 변환
16
- - 학과/학년/반 정보 마스킹
17
- - 이름은 NER 기반 자동 태그
18
- - 사용자 지정 키워드 → "우리기관" 등 커스터마이징 가능
19
-
20
- ---
21
-
22
- **제작자: blueradiance**
23
-
24
- 이 앱은 KoELECTRA 모델을 활용하여 이름을 자동 탐지하고,
25
- 정규식 기반으로 민감정보 및 기관명을 마스킹합니다.
26
-
27
- ---
28
-
29
- ## 🔒 라이선스
30
-
31
- 본 앱은 다음 조건을 따릅니다:
32
-
33
- - ✅ 개인적, 비영리적 사용 허용
34
- - ❌ 상업적 사용 금지
35
- - ❌ 임의 수정 후 재배포 금지
36
- - ✅ 출처 명시 필수: `출처: blueradiance / masking-app`
37
-
38
- 전체 라이선스는 LICENSE 파일을 참조하세요.
 
1
  ---
2
+ title: 민감정보 마스킹기
3
+ emoji: 🛡️
4
  colorFrom: indigo
5
  colorTo: blue
6
  sdk: gradio
7
+ sdk_version: 4.16.0
8
  app_file: app.py
9
  pinned: false
10
+ ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import gradio as gr
2
  from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline
3
  import re
@@ -8,7 +9,6 @@ tokenizer = AutoTokenizer.from_pretrained(model_name)
8
  model = AutoModelForTokenClassification.from_pretrained(model_name)
9
  ner_pipeline = pipeline("ner", model=model, tokenizer=tokenizer, grouped_entities=True)
10
 
11
- # 이름 추출
12
  def extract_names(text):
13
  results = ner_pipeline(text)
14
  names = []
@@ -19,7 +19,6 @@ def extract_names(text):
19
  names.append(name)
20
  return names
21
 
22
- # 이름 마스킹
23
  def refactored_mask_names(original_text, names, start_counter=100):
24
  korean_josa = ['이가','를','은','는','을','도','만','과','와','에게','에서','으로',
25
  '까지','조차','마저','이며','이다','이나','이나마','밖에','이든','이라도',
@@ -50,7 +49,6 @@ def refactored_mask_names(original_text, names, start_counter=100):
50
  counter += 1
51
  return masked, mapping
52
 
53
- # 민감정보 마스킹
54
  def sanitize_sensitive_info(text):
55
  text = re.sub(r"(\d{3})-(\d{4})-(\d{4})", r"\1-****-\3", text)
56
  text = re.sub(r"(\d{4})년 (\d{1,2})월 (\d{1,2})일", r"19**년 \2월 *일", text)
@@ -67,14 +65,12 @@ def sanitize_sensitive_info(text):
67
  text = re.sub(r"\b(good neighbors|굿네이버스|사회복지법인 굿네이버스|gn)\b", "우리기관", text, flags=re.IGNORECASE)
68
  return text
69
 
70
- # 이름이 다시 살아나면 재마스킹
71
  def final_name_remask_exact_only(text, mapping_dict):
72
  for tag, name in mapping_dict.items():
73
  pattern = rf'(?<![\w가-힣]){re.escape(name)}(?![\w가-힣])'
74
  text = re.sub(pattern, tag, text)
75
  return text
76
 
77
- # 통합 처리
78
  def full_pipeline(text):
79
  names = extract_names(text)
80
  masked, mapping = refactored_mask_names(text, names)
@@ -83,32 +79,13 @@ def full_pipeline(text):
83
  mapping_table = "\n".join([f"{k} → {v}" for k, v in mapping.items()])
84
  return sanitized, mapping_table
85
 
86
- with gr.Blocks(title="이름 + 민감정보 + 초/중/고 마스킹기") as demo:
87
- gr.Markdown("""### 💡 민감정보 마스킹 [땡땡이 마스킹]
88
- **제작**: blueradiance""")
89
-
90
- with gr.Row():
91
- input_text = gr.Textbox(lines=16, label="📥 원본 텍스트 입력")
92
- with gr.Row():
93
- run_btn = gr.Button("🚀 마스킹 실행")
94
- with gr.Row():
95
- output1 = gr.Textbox(label="🔐 마스킹된 텍스트", lines=16)
96
- output2 = gr.Textbox(label="🏷️ 이름 태그 매핑 (NXXX → 이름)", lines=16)
97
- run_btn.click(fn=full_pipeline, inputs=input_text, outputs=[output1, output2])
98
-
99
- gr.Markdown("""---
100
- ### 🛠 사용법
101
-
102
- 성명은 `N001` 등으로 치환됩니다.
103
- 초중고 학교명은 초성으로 마스킹되고, 학과/과, 학년·반 정보도 자동으로 처리됩니다.
104
- 기관명도 설정해서 수정하면 `"우리기관"` 같은 식으로 바꿀 수 있어요!
105
- (기본값은 굿네이버스 계열 키워드 → 우리기관)
106
-
107
- 왼쪽 입력창에 마스킹할 원문을 붙여넣고
108
- 아래 🚀 마스킹 실행 버튼 클릭!
109
- 오른쪽 창에 결과와 이름 태그 매핑이 표시됩니다.
110
-
111
- ⚠️ **완벽하지 않을 수 있습니다. 사용 전 반드시 검토해 주세요.**
112
- """)
113
-
114
- demo.launch()
 
1
+
2
  import gradio as gr
3
  from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline
4
  import re
 
9
  model = AutoModelForTokenClassification.from_pretrained(model_name)
10
  ner_pipeline = pipeline("ner", model=model, tokenizer=tokenizer, grouped_entities=True)
11
 
 
12
  def extract_names(text):
13
  results = ner_pipeline(text)
14
  names = []
 
19
  names.append(name)
20
  return names
21
 
 
22
  def refactored_mask_names(original_text, names, start_counter=100):
23
  korean_josa = ['이가','를','은','는','을','도','만','과','와','에게','에서','으로',
24
  '까지','조차','마저','이며','이다','이나','이나마','밖에','이든','이라도',
 
49
  counter += 1
50
  return masked, mapping
51
 
 
52
  def sanitize_sensitive_info(text):
53
  text = re.sub(r"(\d{3})-(\d{4})-(\d{4})", r"\1-****-\3", text)
54
  text = re.sub(r"(\d{4})년 (\d{1,2})월 (\d{1,2})일", r"19**년 \2월 *일", text)
 
65
  text = re.sub(r"\b(good neighbors|굿네이버스|사회복지법인 굿네이버스|gn)\b", "우리기관", text, flags=re.IGNORECASE)
66
  return text
67
 
 
68
  def final_name_remask_exact_only(text, mapping_dict):
69
  for tag, name in mapping_dict.items():
70
  pattern = rf'(?<![\w가-힣]){re.escape(name)}(?![\w가-힣])'
71
  text = re.sub(pattern, tag, text)
72
  return text
73
 
 
74
  def full_pipeline(text):
75
  names = extract_names(text)
76
  masked, mapping = refactored_mask_names(text, names)
 
79
  mapping_table = "\n".join([f"{k} → {v}" for k, v in mapping.items()])
80
  return sanitized, mapping_table
81
 
82
+ gr.Interface(
83
+ fn=full_pipeline,
84
+ inputs=gr.Textbox(lines=15, label="📥 원본 텍스트 입력"),
85
+ outputs=[
86
+ gr.Textbox(lines=15, label="🔐 마스킹된 텍스트"),
87
+ gr.Textbox(lines=10, label="🏷️ 이름 태그 매핑 (NXXX → 이름)")
88
+ ],
89
+ title="🛡️ 민감정보 마스킹 [땡땡이 마스킹] : 이름 + 민감정보 + 초/중/고 마스킹기 (초성 기반)",
90
+ description=""
91
+ ).launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -1,3 +1,3 @@
1
  gradio>=4.16.0
2
- transformers
3
  torch
 
 
1
  gradio>=4.16.0
 
2
  torch
3
+ transformers