A settembre 2010 esce su JAMIA il paper architetturale di cTAKES (clinical Text Analysis and Knowledge Extraction System), un sistema Open Source che estrae informazione dal testo libero delle cartelle cliniche, sviluppato alla Mayo Clinic sopra il framework Apache UIMA e il toolkit OpenNLP (Savova et al., JAMIA 17(5):507-513). Il paper misura ogni componente separatamente su un corpus annotato di note Mayo, ed è la prima documentazione peer-reviewed di una pipeline NLP clinica generale distribuita come software riusabile.

Contesto

Lo strumento di riferimento per estrarre concetti dal testo biomedico è MetaMap della National Library of Medicine, tarato sulla letteratura indicizzata in MEDLINE. Il testo clinico — note di reparto, lettere di dimissione, referti — ha tutt’altre caratteristiche: frasi telegrafiche, abbreviazioni di dosaggio, valori numerici (120/80 mmHg, 500 mg BID), negazioni a ogni riga. Un finding scritto come “no evidence of pneumonia” contiene la stringa pneumonia, ma afferma l’assenza della condizione. Un sistema che mappa le stringhe sui concetti senza modellare la negazione e lo stato finisce per ribaltare il senso del referto.

cTAKES nasce dentro la Mayo intorno al 2006 per macinare grandi volumi di note del sistema informativo aziendale. Il paper del 2010 ne fissa l’architettura e ne misura i componenti.

Architettura

cTAKES è una pipeline di annotator Apache UIMA. UIMA (Unstructured Information Management Architecture) è un framework Java nato in IBM Research e poi donato all’Apache Software Foundation, dove entra in incubazione nel 2006; la specifica UIMA 1.0 diventa standard OASIS a marzo 2009 (docs.oasis-open.org/uima/v1.0). Il modello dati al centro è il CAS (Common Analysis Structure): una struttura condivisa che tiene insieme il documento e tutte le annotazioni aggiunte via via. Ogni annotator legge le annotazioni già presenti nel CAS e ne deposita di nuove; un Type System dichiarato in XML definisce le classi (Token, Sentence, NamedEntity e simili). Concatenando gli annotator si ottiene un Aggregate Analysis Engine.

Costruire su UIMA porta con sé una conseguenza concreta: i componenti sono moduli indipendenti, sostituibili e riordinabili, e ciascuno si valuta da solo. Il paper sfrutta proprio questo e riporta un’accuratezza separata per ogni stadio.

La sequenza degli annotator descritta nel paper è questa:

  • sentence boundary detector e tokenizer, derivati da OpenNLP e adattati al clinico (abbreviazioni come Dr. o q.d. non chiudono la frase);
  • normalizer, che riporta le forme flesse a una forma canonica;
  • POS tagger (part-of-speech) e shallow parser (chunker), che assegna le unitĂ  sintattiche di primo livello — frasi nominali, verbali, preposizionali — senza tentare l’analisi sintattica completa;
  • dictionary lookup, che mappa i sintagmi sui concetti UMLS;
  • named entity recognizer, che struttura le menzioni in tipi clinici;
  • negation e status annotator, che assegnano gli attributi di asserzione.

Il punto critico

Il dictionary lookup non interroga tutto l’UMLS Metathesaurus. cTAKES usa un sottoinsieme della versione 2008AB di UMLS, ristretto ai concetti che vengono da SNOMED CT e RxNorm (i primi per disturbi, procedure e anatomia, il secondo per i farmaci). È il filtro per terminologia e per tipo semantico a calare il sistema sul dominio clinico: invece di pescare ogni concetto biomedico, il lookup guarda solo le famiglie di entità che servono in una nota di cartella.

Sulle menzioni pescate in questo modo lavorano i due annotator di asserzione. La negazione usa il metodo NegEx di Chapman et al. (J Biomed Inform 34(5):301-310, 2001): un algoritmo a pattern che cerca i termini di negazione in una finestra di sette token a sinistra e a destra della menzione, con una lista di pseudo-negazioni (per esempio “not ruled out”) da escludere perché ingannano. Lo status assegna a ogni menzione un valore tra current, history of, family history of, possible. Sono questi due stadi, dopo il riconoscimento, a separare “il paziente ha la diagnosi X” da “la diagnosi X è assente, pregressa, in famiglia o solo ipotizzata”.

Cosa ne segue

Le cifre sul corpus Mayo si leggono una per componente, ed è la parte di documentazione più utile a chi deve decidere se adottare il sistema. Le annotazioni linguistiche di riferimento vengono da 273 note (circa 100.650 token, 7.299 frasi); l’annotazione di named entity copre 160 note (47.975 token, 1.466 menzioni di disturbo).

Sui componenti di base il paper riporta: sentence boundary detector e tokenizer con accuratezza 0,949, POS tagger 0,936, shallow parser con F-score 0,924. Sul riconoscimento di entità: F-score 0,715 in exact match (confini esatti) e 0,824 in overlapping (span sovrapposti). La negazione arriva a un’accuratezza di 0,943, lo status si ferma a 0,859. Il salto fra exact e overlapping sulle entità — una decina di punti — dice quanto spesso il sistema trova il concetto giusto ma sbaglia i confini dello span: una distinzione che pesa a valle, perché un concetto corretto con span impreciso si recupera, un concetto mancato no.

Ogni stadio è un annotator UIMA misurabile e sostituibile: questo fa della pipeline una base da cui partire per adattarla, non un risultato chiuso. Chi lavora su testo diverso da quello Mayo eredita l’architettura e il Type System, poi riaddestra o sostituisce gli stadi che dipendono dai dati.

Limiti

I componenti sono tarati sull’inglese e su note in stile Mayo: telegrafiche, statunitensi. Le cifre qui sopra valgono su quel corpus; usarlo su testo diverso — pediatrico, specialistico, o in un’altra lingua — vuol dire rimisurare ogni stadio, senza dare per scontato che i numeri reggano altrove. Per l’italiano gli stadi che dipendono dalla lingua (tokenizer, POS tagger, la stessa lista NegEx) andrebbero rifatti, e un dictionary lookup utile presuppone una copertura terminologica clinica italiana che oggi è frammentaria. cTAKES poi non de-identifica il testo: togliere le informazioni personali è un problema a parte, da risolvere prima di condividere i dati. Lo status si ferma a quattro valori discreti e non modella il ragionamento temporale fine (quando una condizione è iniziata, se si è risolta, se è pianificata), che resta fuori dalla pipeline descritta.

Resta da capire se l’output di un lookup ristretto a SNOMED CT e RxNorm basti per i casi d’uso a valle (identificazione di coorti, codifica assistita) o se il sottoinsieme 2008AB vada allargato ad altre fonti UMLS man mano che il dominio si espande.


Immagine di copertina: Il complesso della Mayo Clinic a Rochester, Minnesota: in primo piano l’edificio basso della Mayo Medical School, dietro il… — foto di Jonathunder, CC BY-SA 3.0 — https://commons.wikimedia.org/wiki/File:MayoClinic&MedSchool2006-05-07.JPG