Масштаб проблеми хибних спрацьовувань
Microsoft Presidio — потужна відкрита платформа аналізу PII — з'явилася від Microsoft Research і стала стандартом де-факто у багатьох організаціях. Але у виробничих середовищах виникає реальна проблема: хибні спрацьовування.
Хибне спрацьовування відбувається, коли Presidio позначає невинний фрагмент тексту як PII. У юридичних і медичних документах, де точність критична, це має реальні наслідки:
- Юрист виправляє 200+ помилкових редакцій у великому контракті
- Медичний кодувальник витрачає 3 години на огляд «анонімізованого» запису, де заредаговано медичні терміни
- Команда відповідності повертає документи через надмірну анонімізацію
- Системи машинного навчання навчаються на деградованих даних
Чому Presidio дає хибні спрацьовування
1. Regex-патерни без контексту
Presidio використовує комбінацію regex та NLP. Regex-патерни за визначенням не розуміють контексту.
Приклад: Патерн для US_PHONE_NUMBER відповідає (555) 867-5309, але також спрацьовує на:
- Коди продуктів:
(MOD) 867-5309 - Посилання на нормативні акти:
CFR 867-5309 - Порядкові номери в документах:
Додаток (B) 867-5309
2. Перетин числових форматів
Числові шаблони різних сутностей перекриваються:
- 9-значне число може бути SSN, PHONE без коду країни, або просто ідентифікатором
- 16-значне число може бути кредитною карткою або кодом продукту
- 6-цифровий код може бути ZIP або медичним кодом
3. Медичні терміни vs Персональні дані
У медичних документах числові значення повсюдні:
- Дозування:
50 мг кожні 8 годин→ 8 може збігатися з патернами дат - Показники тиску крові:
120/80→ схоже на IP-адресу або дату - Коди МКХ-10:
J12.89→ схоже на деякі ідентифікатори - Ваги, зріст, лабораторні значення — все може хибно спрацювати
4. Юридичні посилання vs Персональні дані
У юридичних документах:
- Посилання на статті законів:
Стаття 17(2)(b)— може збігатися з патернами дат - Номери справ:
2024 WL 1234567— схоже на SSN - Цитати зі свідоцтв: «Позивач, п-н X» — якщо X є реальним іменем у базі
- Географічні юрисдикції: «округ Майамі» — «Майамі» як ім'я особи
5. Проблема порогу впевненості
Presidio дає кожній сутності оцінку впевненості від 0 до 1. Низький поріг = більше виявлень = більше хибних спрацьовувань. Високий поріг = менше хибних спрацьовувань = ризик пропустити реальну PII.
Підбір порогу — це постійний компроміс, специфічний для кожного типу документів.
Кількісне оцінювання проблеми
Дослідження в реальних юридичних і медичних контекстах показали:
| Тип документа | Хибні спрацьовування (%) | Ручна корекція (хв/сторінку) |
|---|---|---|
| Юридичні контракти | 15-25% | 8-15 |
| Медичні записи | 20-35% | 12-25 |
| Фінансова звітність | 10-20% | 5-10 |
| Корпоративне листування | 8-15% | 3-8 |
При масштабуванні: 1 000 сторінок медичних записів × 20 хв/сторінку = 333 години ручної роботи тільки через хибні спрацьовування.
Стратегії зменшення хибних спрацьовувань
1. Контекстне покращення (Context Enhancement)
Presidio підтримує context words — слова, що підвищують або знижують впевненість при появі поруч з сутністю.
from presidio_analyzer import PatternRecognizer, Pattern
# Знизити впевненість для чисел, що виглядають як SSN, але поруч із медичними термінами
medical_context_words = ["мг", "мл", "mmHg", "bpm", "g/dl", "мкМ"]
ssn_recognizer = PatternRecognizer(
supported_entity="US_SSN",
deny_list_terms=medical_context_words, # знижує впевненість
patterns=[Pattern("SSN", r"\b\d{3}-\d{2}-\d{4}\b", 0.5)]
)
2. Постобробка та фільтрація
Після аналізу — фільтрація результатів за контекстом:
def filter_false_positives(results, original_text):
filtered = []
for result in results:
context = original_text[max(0, result.start-50):result.end+50]
# Виключити юридичні посилання
if "CFR" in context or "USC" in context or "§" in context:
continue
# Виключити медичні дозування
if any(term in context for term in ["мг", "мл", "мкг", "МО"]):
continue
filtered.append(result)
return filtered
3. Ансамблеві підходи
Використання кількох моделей і відбір лише спільних результатів:
- Presidio як основний детектор
- Додаткова ML-модель (fine-tuned BERT)
- Правило: позначати лише те, що виявили обидві системи
Це знижує хибні спрацьовування за рахунок деякого зниження recall.
4. Навчання специфічного для домену
Тонке налаштування NLP-моделей Presidio на доменно-специфічних даних:
Для юридичних документів: навчання на анотованих юридичних текстах, де юридичні терміни і посилання помічені як не-PII.
Для медичних записів: навчання на MIMIC-III або i2b2 datasets з медичними анотаціями.
5. Whitelist для доменних термінів
Списки виключень, специфічні для організації:
# Виключити внутрішні коди продуктів зі сканування PII
PRODUCT_CODE_WHITELIST = [
r"PRD-\d{6}",
r"SKU[A-Z]{2}\d{8}",
r"LOT-\d{4}-[A-Z]{2}",
]
Коли керований сервіс кращий за self-hosted Presidio
Self-hosted Presidio дає максимальний контроль, але вимагає значної роботи з тонким налаштуванням.
Managed PII сервіси, такі як anonym.legal, надають попередньо налаштовані профілі для різних галузей — юридичний, медичний, фінансовий — зі зменшеним рівнем хибних спрацьовувань «з коробки».
Компроміс:
- Self-hosted: максимальний контроль, вища точність після налаштування, вищі початкові витрати
- Managed: швидше впровадження, регулярні оновлення моделей, нижчий бар'єр входу
Висновок
Хибні спрацьовування у Presidio — не помилка, а властивість будь-якої системи виявлення PII загального призначення. У спеціалізованих доменах (юридичний, медичний) вони є реальним операційним викликом.
Рішення: контекстне налаштування, постобробка, доменна спеціалізація — або перехід до managed сервісу з доменними профілями.
Джерела: