PresidioEntityExtractor
PresidioEntityExtractor
PresidioEntityExtractor는 문서에서 개인 식별 정보(PII)를 감지하고, 문서 텍스트는 수정하지 않은 채 감지된 엔티티를 "entities" 키 아래의 구조화된 메타데이터로 저장해요. 각 항목은 엔티티 타입, 문자 오프셋, 신뢰 점수를 담고 있죠.
출처: 문서
본문
| 항목 | 내용 |
|---|---|
| 파이프라인에서 가장 흔한 위치 | 인덱싱 파이프라인에서 Document Store에 문서를 쓰기 전 |
| 필수 run 변수 | documents: Document 객체 목록 |
| 출력 변수 | documents: PII 메타데이터가 추가된 Document 객체 목록 |
| API reference | Presidio |
| GitHub 링크 | presidio 통합 |
| 패키지 이름 | presidio-haystack |
개요
Microsoft Presidio는 PII 감지와 익명화를 위한 오픈소스 프레임워크예요. PresidioEntityExtractor는 Presidio의 Analyzer Engine을 사용해 문서 텍스트를 스캔하고 이름, 이메일 주소, 전화번호 등 엔티티를 식별해요.
이 추출기는 문서 텍스트를 수정하지 않아요. 대신 감지된 엔티티를 구조화된 메타데이터로 추가해서, 원본 내용을 바꾸지 않고 PII 발견 결과를 검사하거나 조치할 수 있게 해 주죠. 어떤 PII가 있는지 감사한 뒤 어떻게 처리할지 결정하고 싶을 때 유용해요. 예를 들어 문서를 검토 큐로 라우팅하거나, PII 발견을 로깅하거나, 조건부로 익명화를 적용할 때 말이에요.
PII를 주석으로 다는 대신 직접 교체하고 싶다면, 문서용 PresidioDocumentCleaner 또는 일반 문자열용 PresidioTextCleaner를 보세요.
구성
| 파라미터 | 기본값 | 설명 |
|---|---|---|
language |
"en" |
PII 감지를 위한 ISO 639-1 언어 코드. 지원 언어에 대해 적절한 spaCy 모델이 자동 선택돼요. Presidio 지원 언어 참고 |
entities |
None |
감지할 PII 엔티티 타입 목록 (예: ["PERSON", "EMAIL_ADDRESS"]). None이면 지원되는 모든 타입을 감지해요. 지원 엔티티 참고 |
score_threshold |
0.35 |
감지된 엔티티가 포함되기 위한 최소 신뢰 점수(0–1) |
models |
None |
고급 오버라이드: spaCy 모델 구성의 명시적 목록 (예: [{"lang_code": "fr", "model_name": "fr_core_news_md"}]). 특정 모델 변형이나 내장 매핑에 없는 언어가 필요할 때만 사용하세요. None이면 language에 따라 모델이 자동 선택돼요 |
사용법
PresidioEntityExtractor를 사용하려면 presidio-haystack 패키지를 설치하세요.
pip install presidio-haystack
단독으로 사용하기
from haystack import Document
from haystack_integrations.components.extractors.presidio import PresidioEntityExtractor
extractor = PresidioEntityExtractor()
result = extractor.run(
documents=[Document(content="Contact Alice at [email protected]")],
)
print(result["documents"][0].meta["entities"])
# [{"entity_type": "PERSON", "start": 8, "end": 13, "score": 0.85},
# {"entity_type": "EMAIL_ADDRESS", "start": 17, "end": 34, "score": 1.0}]
파이프라인에서 사용하기
from haystack import Document, Pipeline
from haystack.components.writers import DocumentWriter
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack_integrations.components.extractors.presidio import PresidioEntityExtractor
document_store = InMemoryDocumentStore()
indexing_pipeline = Pipeline()
indexing_pipeline.add_component("extractor", PresidioEntityExtractor())
indexing_pipeline.add_component("writer", DocumentWriter(document_store=document_store))
indexing_pipeline.connect("extractor", "writer")
indexing_pipeline.run(
{
"extractor": {
"documents": [
Document(content="Alice Smith's email is [email protected]"),
Document(content="Call Bob at 212-555-9876"),
],
},
},
)
# Documents are stored with detected PII in doc.meta["entities"]
커스텀 파라미터 사용하기
entities를 사용해 실제로 관심 있는 PII 타입에만 감지를 제한할 수 있어요. 필요 없는 recognizer를 건너뛰므로 오탐을 줄이고 성능도 높여 주죠.
score_threshold로 정밀도-재현율 트레이드오프를 조정할 수 있어요. 기본값 0.35는 넓게 잡기 때문에 일부 오탐을 포함할 수 있어요. 각 감지 엔티티에 높은 신뢰도가 필요하면 높이고요(예: 0.7), PII를 놓치는 것이 더 큰 위험이라면 낮추면 돼요.
from haystack_integrations.components.extractors.presidio import PresidioEntityExtractor
extractor = PresidioEntityExtractor(
language="de",
entities=["PERSON", "EMAIL_ADDRESS"], # only detect names and emails
score_threshold=0.7, # higher precision, fewer false positives
)
비영어 언어
내장 매핑에 있는 언어라면 language만 설정하면 돼요. 적절한 spaCy 모델이 워밍업 시점에 자동으로 선택되고 로드되죠.
from haystack import Document
from haystack_integrations.components.extractors.presidio import PresidioEntityExtractor
# No `models` parameter needed — de_core_news_lg is selected automatically
extractor = PresidioEntityExtractor(language="de")
result = extractor.run(
documents=[Document(content="Kontaktieren Sie Hans Müller unter [email protected]")],
)
지원 언어와 기본 모델은 PresidioEntityExtractor.SPACY_DEFAULT_MODELS에 나열돼 있어요. 그 매핑에 없는 언어를 models 없이 사용하면 워밍업 시점에 지원 언어 코드 목록과 함께 ValueError가 발생해요.
기본이 아닌 모델 변형이나 내장 매핑 밖의 언어를 사용하려면 models를 명시적으로 전달하세요:
extractor = PresidioEntityExtractor(
language="fr",
models=[{"lang_code": "fr", "model_name": "fr_core_news_md"}],
)