The Hospital Batch Processing Problem
Klinické poznámky — záznamy lekárov v zdravotníckom systéme — sú najčastejšie forrás PHI (Protected Health Information) úniku. Typická nemocnica spracováva:
- 500-2,000 klinických poznámok za deň
- Každá poznámka: 500-5,000 slov, 1-10 identifikátorov PHI (pacient, lekár, dátum, diagnóza)
- Regulácia: HIPAA § 164.502(b) vyžaduje pseudonymizácia či zmazaní PHI pred zdieľaní na výskum, účtovníctva, tréning
Tri riešenie:
- Ručné redakcie: Právnik alebo healthcare worker číta a redaktuje — 10-15 minút na poznámku = 80+ hodín na deň
- Cloud de-identification: Poslať do cloud (AWS, Azure, Google) — rýchly ale vypustí PHI mimo zdravotníckeho systému = HIPAA porušenie
- Lokálne de-identification: Spustit NLP/PII detektora na lokálneho servera — bezpečne, neprenáša PHI na cloud
Lokálne HIPAA De-identification
Riešenie: Spustit klasickú NLP na lokálneho servera bez cloud.
Technológia
Presidio (Microsoft, open-source):
- Detekuje HIPAA PHI identifikátorov: pacient, lekár, dátum, medicínske čísla, diagnóz, liekov
- Beží lokálne — žiadne cloud
- Výkon: 100-1,000 poznámok za minútu (závislý na servery)
- Presnosť: ~85-92% (vynecháva komplikované prípadmy)
Spacy (open-source NER):
- Detekuje mená, lokácii, organizácie
- Pretrenované modely za 11 jazykov
- Presnosť: ~88-95%
Regex patterns:
- Dátumy: "2024-01-15", "01/15/24", "January 15"
- Medicínske čísla: "Patient#123456", "MRN: 654321", "ICD-10: E10.9"
- Léková: "aspirin 500mg", "lisinopril 10mg"
Celkovo, všetky tri kombinované dosiahnu ~95%+ presnosť na HIPAA PHI.
Postup
- Čítajte poznámky: Ze zdravotníckého systému (Epic, Cerner, atď.)
- PII Detekcia: Spustit Presidio/Spacy/regex na každú poznámku
- Redakcia: [REDACTED-PATIENT], [REDACTED-DATE], atď.
- Výstup: Anonymizovaná poznámka do výskumnej databázy
- Log: Záznam kto anonymizoval, kedy
Príklad
Originálny:
Patient: John Smith, DOB: 1960-05-12
Doctor: Dr. Sarah Johnson
Date: 2025-02-15
Diagnosis: Type 2 Diabetes (ICD-10: E11.9)
Medications: Metformin 500mg BID, Lisinopril 10mg QD
Note: Patient presented with polyuria and polydipsia. Labs: HbA1c 8.2 (elevated). Recommended dietary changes and increased exercise. Follow-up in 4 weeks.
Anonymizovaný:
Patient: [REDACTED-PATIENT]
Doctor: [REDACTED-DOCTOR]
Date: [REDACTED-DATE]
Diagnosis: Type 2 Diabetes (ICD-10: E11.9)
Medications: Metformin 500mg BID, Lisinopril 10mg QD
Note: Patient presented with polyuria and polydipsia. Labs: HbA1c 8.2 (elevated). Recommended dietary changes and increased exercise. Follow-up in 4 weeks.
Note: Diagnóza a liekov ostávajú — sú medicínsky relevantný bez identifikácie pacienta. Ak potrebujete úplnú redakciu medicínskych údajov, použite masku namiesto redakcie.
Lokálne Deplyment
Option 1: anonym.legal Local
Stiahnite desktop app — spúšťa Presidio lokálne bez cloud. Batch upload DOCX/TXT, dostanete anonymizovaný výstup.
Option 2: Presidio Docker
docker run -p 8011:8011 mcr.microsoft.com/presidio/analyzer
POST /api/analyze
{
"text": "Patient John Smith, born 1960-05-12, diagnosed with Type 2 Diabetes.",
"language": "en"
}
Výstup: Vracia entity typu a súradnice (position).
Option 3: Custom Lokálny Server
Spustit Spacy + regex na vlastnom servera — bez závislostí.
import spacy
import re
from datetime import datetime
nlp = spacy.load("en_core_web_sm")
def redact_clinical_note(text):
doc = nlp(text)
# Extract entities
for ent in doc.ents:
if ent.label_ in ["PERSON", "ORG"]:
text = text.replace(ent.text, f"[REDACTED-{ent.label_}]")
# Regex patterns
text = re.sub(r"\b\d{1,2}/\d{1,2}/\d{2,4}\b", "[REDACTED-DATE]", text) # dates
text = re.sub(r"Patient#\d+", "[REDACTED-MRN]", text) # MRN
text = re.sub(r"ICD-10:?\s*[A-Z]\d{2}\.\d", "[REDACTED-DIAGNOSIS]", text) # ICD codes
return text
Metriky
- Throughput: 1,000 poznámok za 10-15 minút (vs 1,000+ hodín ručne)
- Presnosť: 95%+ PHI redakcia (vs 100% ale ručne)
- Náklady: $0-5,000 na server setup (vs $500K+ na ročnú ručnú redakciu)
- HIPAA Compliance: 100% — všetky PHI lokálne, žiadne cloud výstup