ZINK 소개
오늘날의 데이터 중심 사회에서 개인 정보를 보호하는 일은 그 어느 때보다 중요해졌습니다. 기업과 기관들은 고객 데이터를 수집하고 분석하는 과정에서, 법적·윤리적 책임을 피하기 위해 민감한 정보를 비식별화하는 기술을 적극적으로 도입하고 있습니다. 특히 자연어 데이터의 경우, 이름, 주소, 직업, 전화번호 등 다양한 형태의 민감정보가 포함될 수 있어 정교한 처리 기술이 필요합니다.
ZINK는 이러한 요구에 대응하여 개발된 파이썬 기반의 오픈소스 라이브러리로, 사전 학습이나 별도의 데이터 없이도 텍스트에서 민감정보를 탐지하고 제거 혹은 교체할 수 있는 ‘제로샷 비식별화’ 기능을 제공합니다. 사용자가 지정한 엔티티 레이블을 기준으로 동작하며, 쉽게 파이썬 프로젝트에 통합할 수 있도록 간단한 API를 제공합니다.
최근 ZINK는 0.4 버전부터 NER(Named Entity Recognition) 모델을 ONNX 버전으로 전환함으로써 처리 속도와 효율성을 크게 향상시켰으며, Faker 라이브러리를 이용한 더 자연스러운 데이터 대체 기능도 새롭게 추가되었습니다. 이러한 기능들은 연구용 데이터 전처리, AI 모델 학습용 텍스트 준비, 의료나 금융 데이터의 비식별화 등 다양한 상황에 적용할 수 있는 유연함을 제공합니다.
기존의 엔티티 인식 기반 비식별화 시스템들은 대부분 사전 학습된 모델이나 특정 도메인 데이터셋에 의존하는 구조입니다. 예를 들어, SpaCy나 Stanza는 고정된 엔티티 종류를 감지하는 데는 탁월하지만, 커스텀 엔티티나 유연한 대응이 어렵습니다. 반면, GPT 기반 LLM은 유연성과 정확성 면에서 뛰어나지만, 연산 자원이 많이 들고 비용이 높다는 단점이 있습니다.
ZINK는 이 두 방식의 장점을 흡수하고 단점을 보완하기 위해 ‘제로샷 NER’을 택했습니다. 사용자가 단지 감지하고 싶은 엔티티 이름을 텍스트와 함께 입력하면, 내부적으로 GLiNER와 NuNER Zero 같은 모델이 이를 분석하고 대응합니다. 이러한 접근은 LLM보다 훨씬 가볍고 빠르며, 기존 NER보다 훨씬 유연합니다.
ZINK 설치 및 사용법
ZINK 설치 방법
ZINK는 pip install zink
명령어만으로 간단히 설치할 수 있습니다. 설치 후, zink 모듈을 임포트하여 다양한 형태의 텍스트 비식별화를 수행할 수 있습니다.
pip install zink
엔티티 삭제 기능 (Redact)
redact 함수는 감지된 엔티티를 [LABEL]_REDACTED 형식으로 치환합니다. 예를 들어, 아래 예시와 같이 person, profession, sport, car 엔티티를 지정하면 텍스트에서 해당 정보를 제거합니다.
import zink as zn
text = "John works as a doctor and plays football after work and drives a toyota."
labels = ("person", "profession", "sport", "car")
result = zn.redact(text, labels)
print(result.anonymized_text)
# 결과: person_REDACTED works as a profession_REDACTED and plays sport_REDACTED after work and drives a car_REDACTED.
엔티티 교체 기능 (Replace)
replace 함수는 감지된 엔티티를 같은 유형의 무작위 값으로 대체합니다. 이는 분석이나 테스트 목적의 데이터 변환에 매우 유용합니다.
text = "John Doe dialled his mother at 992-234-3456 and then went out for a walk."
labels = ("person", "phone number", "relationship")
result = zn.replace(text, labels)
print(result.anonymized_text)
# 예시 출력: Warren Buffet dialled his Uncle at 2347789287 and then went out for a walk.
사용자 지정 데이터로 교체
자체 데이터셋을 활용하여 특정 엔티티를 직접 지정한 값으로 대체할 수 있습니다.
text = "Melissa works at Google and drives a Tesla."
labels = ("person", "company", "car")
custom_replacements = {
"person": "Alice",
"company": "OpenAI",
"car": ("Honda", "Toyota")
}
result = zn.replace_with_my_data(text, labels, user_replacements=custom_replacements)
print(result.anonymized_text)
# 출력 예: Alice works at OpenAI and drives a Honda.
ZINK의 내부 구성 및 기술적 배경
GLiNER
GLiNER는 BERT와 유사한 양방향 Transformer 기반 NER 모델로, 사전 정의된 엔티티 종류에 얽매이지 않고 자유로운 엔티티 감지가 가능합니다. 특히 LLM 대비 연산 자원 소모가 적고, 기존 NER보다 유연하게 다양한 텍스트를 처리할 수 있습니다.
NuNER Zero
NuNER_Zero는 GLiNER 기반으로 훈련된 고성능 경량 모델입니다. 엔티티 라벨을 소문자로 통일하고, 라벨과 텍스트를 하나로 합쳐 입력으로 사용합니다. NuNER v2.0 데이터셋에서 학습되었으며, GLiNER-large보다도 3% 이상 높은 F1-score를 보입니다.
Faker 통합 기능
Faker 라이브러리를 활용하여 현실적인 가짜 데이터를 생성합니다. 이름, 날짜, 국가, 직업 등의 엔티티에 대해 상황에 맞는 교체값을 생성할 수 있으며, 특정 위치나 날짜 형식 등도 고려하여 정교하게 작동합니다.
- 위치 처리: 외부 파일에서 국가 이름 목록을 읽어, 감지된 국가명을 임의의 다른 국가로 교체
- 날짜 처리: 숫자형 날짜는 Faker로 생성, 문자형은 사용자 정의 방식 적용
- 역할 인식: 의사, 환자 등 인간 역할을 인식해 맥락에 맞는 이름으로 교체
테스트 및 기여 방법
프로젝트 루트에서 pytest 명령어로 테스트를 실행할 수 있습니다. Pull Request나 이슈 등록을 통해 프로젝트 개선에 기여할 수 있습니다.
라이선스
ZINK 프로젝트는 Apache 2.0 라이선스로 공개 및 배포 되고 있습니다. 상업적 사용에 제한이 없으며, 자유롭게 수정 및 재배포가 가능합니다.
ZINK 프로젝트 GitHub 저장소
ZINK 공식 문서 사이트
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다.
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~