## Objectif UMLS !
@Vincent-Maladiere @RomainB
Pour l'instant, EDS-NLP ne permet d'extraire et normaliser les entités que vers l'ATC (via ROMEDI), et la CIM10.
L'UMLS étant une resource internationale et rassemblant de nombreuses terminologies (dont la SnomedCT) dans de nombreuses langues, l'intégrer bénéficierait grandement à la bibliothèque et à ses utilisateurs pour:
- catégoriser automatiquement les textes d'un corpus selon différents concepts IDs
- faire de la recherche d'entités
- créer des règles de traitement (si ent.concept_id est un enfant de CUIXXXXX alors, ...)
- faire de la pré-annotation de corpus
- etc
Plusieurs points sont visés:
### Téléchargement de la ressource
L'UMLS contient plusieurs tables. C'est essentiellement la table MRCONSO qui nous intéresse et qui contient les synonymes et les concepts IDs (2Go pour la version 2022AA). Il ne parait pas raisonnable de demander aux utilisateurs de la télécharger eux-même, la procédure état longue et pénible. Heureusement, il existe la petite (mais très bien faite) librairie `umls_downloader` qui permet d'automatiser ce processus à condition de détenir une license umls (ce qui est nécessaire de toute façon), et de stocker les tables dans un dossier cache partagé.
Il faudrait donc:
- tester cette librairie
- décider de quand se fait le téléchargement (à l'installation ? à l'instantiation de la pipeline eds.umls ?)
- voir comment pourrait se généraliser le téléchargement et caching de resources (comme la cim10) pour edsnlp
### Matching exact & approximatif
Une fois la ressource téléchargée, il faut repérer les synonymes de l'UMLS (table MRCONSO) dans les textes. Pour cela, on peut utiliser le EDSPhraseMatcher d'edsnlp pour du matching exact et le SimstringMatcher pour du matching approximatif.
Le plus simple consiste à adapter un des deux autres TerminologyMatcher implémenté pour la CIM10 ou pour l'ATC.
Il faudrait donc:
- prétraiter la table MRCONSO téléchargée à l'étape d'avant (avec par exemple des filtres en option sur certaines colonnes)
- la charger dans un TerminologyMatcher
### Normalisation
Une fois les synonymes repérés, il faut se fixer sur la manière dont on présente les informations extraites à l'utilisateur. L'UMLS aligne les synonymes avec un identifiant unique, le CUI, mais offre également des alignements vers les IDs de toutes les terminologies qu'il contient. Pour l'instant, l'attribut `ent.kb_id_` contient les différents identifiants pêle-mêle (ATC / CIM10), ce qui rend difficile son utilisation si on se met à mélanger les terminologies dans un pipeline.
Une solution plus robuste (après discussion avec Thomas, Adam, Ariel, etc) consisterait à stocker dans différentes extensions les IDs proposés par une terminologie.
Ex:
- la pipeline `eds.drugs` trouve une entité paracétamol et lui assigne l'ID N02BE01 (ATC): on stocke dans `ent._.atc` le code N02BE01
- puis la pipeline `eds.umls` trouve la même entité, mais dispose elle à la fois du code ATC (N02BE01) et du code CUI (C0000970) : on stocke `ent._.atc="N02BE01"` et `ent._.cui = "C0000970"`