개인정보 익명화

2024년 6월 12일 수요일

Today I Learned

날짜

2024년 6월 12일 수요일

내용

개인정보 익명화하기

인스타그램 댓글을 위젯으로 만들때, 혹시나 댓글 내용에 개인정보가 있다면 익명화하는 기능을 추가하고자 한다. 집 주소, 계좌번호, 전화번호, 이름이 나타나면 별표처리를 해야했다. 개인정보를 내가 형태(글자 수 등)로 추적하는 것은 불가능했기 때문에 라이브러리를 찾았다. 영어로는 PII(Personally Identifying Information)라고 하는데, 개인을 식별할 수 있는 정보를 통칭한다.

Presidio

무려 마이크로소프트에서 제공하는 오픈소스다. 언어 관련해선 Analyzer와 Anonymizer 2가지가 있는데, 전자는 nltk 처럼 글을 쪼개 분석해주는 기능이고 후자는 특정 키워드를 대체해준다. 예를 들어,

My name is Bond, James Bond

라는 텍스트를 Analyzer로 분석하면 “Bond, James Bond” 이 부분이 “Name” 이라는 Entity에 속하고, 정확도는 0과 1중에 몇인지 말해준다. 이 결과를 바탕으로 Anonymizer는 어떤 엔티티를 어떻게 대체할 지 설정할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 분석과 익명화를 진행하는 함수 정의
def anonymization_text(text: str):
    # 텍스트에서 PII 감지
    analyzer_results = analyzer.analyze(
        text=text,
        entities=["PERSON", "PHONE_NUMBER", "LOCATION", "EMAIL_ADDRESS"],
        language="en",
    )

    # 감지된 PII를 ***로 익명화
    anonymized_text = anonymizer.anonymize(
        text=text,
        analyzer_results=analyzer_results,
        operators={"DEFAULT": OperatorConfig("replace", {"new_value": "***"})},
    ).text

    return anonymized_text
    
example = "John Doe’s credit card number is 1234-5678-1234-5678. 
He lives in New York and his phone number is (555) 123-4567"

# 예시
result = anoymization_text(text=example)
print(result)
>> *** credit card number is 1234-5678-1234-5678. 
>> He lives in *** and his phone number is ***

문제는 이 기능을 위해 불러와야 할 것이 너무 많다. nltk와 마찬가지로 텍스트를 감지하고 분석하는 기능은 모두 머신러닝을 이용해야 하기 떄문에, 제대로 작동하려면 훈련 데이터를 너무 많이 불러와야 한다. 이걸 감수하기엔 이 기능이 그다지 필수적이지 않다고 생각해서 우선 추가하지 않았다. 누가 인스타그램 댓글에 본인 사는 곳을 적겠어..

회고

해놓은건 아깝지만..