Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
@@ -211,21 +211,56 @@ def apply_masking(text, keyword_str, replace_word):
|
|
211 |
|
212 |
return final_text, mapping_table
|
213 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
214 |
|
215 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
216 |
with gr.Blocks() as demo:
|
217 |
gr.Markdown("""
|
218 |
🛡️ **민감정보 마스킹 [ver2]**
|
219 |
-
이름 + 민감정보 +
|
220 |
""")
|
221 |
-
|
222 |
-
input_text = gr.Textbox(lines=
|
223 |
keyword_input = gr.Textbox(lines=1, label="기관 키워드 (쉼표 구분)", value="굿네이버스, 사회복지법인 굿네이버스")
|
224 |
replace_input = gr.Textbox(lines=1, label="치환할 텍스트", value="우리기관")
|
225 |
-
|
226 |
run_button = gr.Button("🚀 마스킹 실행")
|
227 |
-
masked_output = gr.Textbox(lines=
|
228 |
-
mapping_output = gr.Textbox(lines=
|
229 |
|
230 |
run_button.click(
|
231 |
fn=apply_masking,
|
|
|
211 |
|
212 |
return final_text, mapping_table
|
213 |
|
214 |
+
def refactored_mask_names(text, names):
|
215 |
+
mapping = {}
|
216 |
+
for i, name in enumerate(names):
|
217 |
+
tag = f"N{i+1:03}"
|
218 |
+
text = text.replace(name, tag)
|
219 |
+
mapping[name] = tag
|
220 |
+
return text, mapping
|
221 |
+
|
222 |
+
def final_name_remask_exact_only(text, mapping):
|
223 |
+
for name, tag in mapping.items():
|
224 |
+
text = text.replace(name, tag)
|
225 |
+
return text
|
226 |
+
|
227 |
+
def sanitize_sensitive_info(text, keywords, replace_word):
|
228 |
+
# 기관 키워드 치환
|
229 |
+
for kw in keywords:
|
230 |
+
pattern = rf"{re.escape(kw)}(?=\W|$)" # 조사 대응
|
231 |
+
text = re.sub(pattern, replace_word, text, flags=re.IGNORECASE)
|
232 |
+
|
233 |
+
# 이메일 마스킹 예시
|
234 |
+
text = re.sub(r"\b[\w\.-]+@", "******@", text)
|
235 |
+
return text
|
236 |
+
|
237 |
+
|
238 |
+
# ✅ 핵심 apply_masking 함수
|
239 |
+
def apply_masking(text, keyword_str, replace_word):
|
240 |
+
keywords = [kw.strip() for kw in keyword_str.split(",") if kw.strip()]
|
241 |
|
242 |
+
names = extract_names(text)
|
243 |
+
masked_text, name_mapping = refactored_mask_names(text, names)
|
244 |
+
sanitized_text = sanitize_sensitive_info(masked_text, keywords, replace_word)
|
245 |
+
final_text = final_name_remask_exact_only(sanitized_text, name_mapping)
|
246 |
+
|
247 |
+
mapping_table = "\n".join(f"{k} → {v}" for k, v in name_mapping.items())
|
248 |
+
return final_text, mapping_table
|
249 |
+
|
250 |
+
|
251 |
+
# ✅ Gradio UI
|
252 |
with gr.Blocks() as demo:
|
253 |
gr.Markdown("""
|
254 |
🛡️ **민감정보 마스킹 [ver2]**
|
255 |
+
이름 + 민감정보 + 기관 키워드 마스킹기 (초성 기반 + 후처리 강화)
|
256 |
""")
|
257 |
+
|
258 |
+
input_text = gr.Textbox(lines=10, label="📅 원본 텍스트 입력")
|
259 |
keyword_input = gr.Textbox(lines=1, label="기관 키워드 (쉼표 구분)", value="굿네이버스, 사회복지법인 굿네이버스")
|
260 |
replace_input = gr.Textbox(lines=1, label="치환할 텍스트", value="우리기관")
|
|
|
261 |
run_button = gr.Button("🚀 마스킹 실행")
|
262 |
+
masked_output = gr.Textbox(lines=10, label="🔐 마스킹 결과")
|
263 |
+
mapping_output = gr.Textbox(lines=5, label="🏷️ 이름 태그 매핑", interactive=False)
|
264 |
|
265 |
run_button.click(
|
266 |
fn=apply_masking,
|