Presidio: Problem Lažnih Pozitiva i Preciznosti
Šta je Lažni Pozitiv?
Lažni pozitiv je kada Presidio označi nešto kao PII što to nije:
text = "Zajednica San Franciska je održala sastanak."
results = analyzer.analyze(text, language="sr")
# Presidio detektuje: "San Franciska" kao PERSON (lažni pozitiv)
# Stvarnost: To je LOCATION, ne osoba
Stope Lažnih Pozitiva
| Entitet | Lažni Pozitivi | Problem |
|---|---|---|
| PERSON | 18% | "San Francisco" detektovano kao osoba |
| EMAIL_ADDRESS | 8% | "admin@localhost" je test, ne pravi |
| PHONE_NUMBER | 22% | "800-FLOWERS" je slogan, ne broj |
| CREDIT_CARD | 5% | "1234 5678" u tekstualnom primeru |
Uzrok
Presidio koristi pattern matching + ML:
- Obrasci: Regex za brojeve (brz, ali neprецizан)
- ML: Kontekst analize (sporija, ali preciznija)
Default konfiguracija favorizuje visok recall (pronalaženje SVE PII) na račun preciznosti.
Rešenja
1. Povećaj Prag Pouzdanosti
def analyze_with_confidence(text):
results = analyzer.analyze(
text,
language="sr",
entities=["PERSON", "EMAIL_ADDRESS"]
)
# Filtrira samo rezultate sa visokim pouzdanjem
high_confidence = [
r for r in results
if r.score >= 0.85 # Default je 0.5
]
return high_confidence
2. Prilagođeni Prepoznavači
from presidio_analyzer import PatternRecognizer
email_recognizer = PatternRecognizer(
entity_type="EMAIL_ADDRESS",
patterns=[{"name": "email", "regex": "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-z]{2,}"}],
language="sr"
)
# Čuva preciznost - samo "name@domain.ext" obrasci
3. Kontekstni Filtri
def filter_false_positives(text, results):
filtered = []
for result in results:
entity_text = text[result.start:result.end]
# Preskočiti poznatih lažnih pozitiva
if entity_text.lower() in KNOWN_FALSE_POSITIVES:
continue
filtered.append(result)
return filtered
KNOWN_FALSE_POSITIVES = [
"san francisco",
"800-flowers",
"new york",
"admin@localhost"
]
Zaključak
Lažni pozitivi smanjuju poverenje u anonimizaciju. Kombinuj povećani prag pouzdanosti, prilagođene prepoznavače i kontekstne filtere.