Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Normalize the annotator input and dictionnary with TreeTager #4

Closed
jonquet opened this issue Nov 18, 2016 · 18 comments
Closed

Normalize the annotator input and dictionnary with TreeTager #4

jonquet opened this issue Nov 18, 2016 · 18 comments

Comments

@jonquet
Copy link

jonquet commented Nov 18, 2016

This task consists in using TreeTager to normalize the text being sent to the Annotator and therefore also use it to normalize the content of the dictionary.
This task is divided into 3 specific issues:

This is followed by @amineabdaoui

@jonquet
Copy link
Author

jonquet commented Jan 31, 2017

Note for later:
The plural problem is 2-way:
melanoma in the dico and melanomas in the text
melanomas in the dico and melanoma in the text (ex: patients dans MSHFRE)

@amineabdaoui
Copy link

Lemmatization resolves this kind of problems.
It converts each verb to its infinitive form and each name/adjective to the third person singular (singulier masculin).

To resolve the above mentioned problem in its two ways (and more), we should lemmatize the queried text and use a lemmatized dictionary.

@amineabdaoui
Copy link

The three steps mentioned here have been implemented.
However, when the parameter lemmatize=true the obtained annotation indexes ("from" and "to") correspond to the lemmatized text and not the original one.
This is problematic for the UI which uses these indexes to highlight the part of the original that has been annotated.

Therefore, I added a fourth step which converts the indexes of the lemmatized text to indexes of the original one.

I am using the same jar to lemmatize both the dictionary and the input text (an option allows to make the difference between these two modes).
When lemmatizing the dictionary, the jar copies each termId and replaces the original concepts with their lemmas.
When lemmatizing the input text, the jar generates a mapping key (which i explain bellow) and put it in the output file with the lemmatized text.

The mapping key encodes the indexes of all the words in the lemmatized text and in the original one as the following:

fromLem1-fromWor1:toLem1-toWor1_fromLem2-fromWor2:toLem2-toWor2_ ...

For example:
Original text = les anorexies mentales
Lemmatized text = le anorexie mental
Mapping key = 1-1:2-3_4-5:11-13_13-15:18-22

I am using this key to convert the lemmatized indexes into original ones. The changes are stored in branch "developAmine".
I tested it locally and it works well!

@jonquet
Copy link
Author

jonquet commented Feb 15, 2017

Great!, one more thing to push on staging server for us all to test.
How does it look in terms of results obtained ?

@jonquet
Copy link
Author

jonquet commented Feb 17, 2017

Super.
On remarque que cela ralenti pas mal l'appel au web service quand on active la lemmatisation... sans doute le fait de changer la chaine de traitement.
J'ai essayé avec un texte plus long c'est de l'ordre de 2 secondes de plus.

http://services.stageportal.lirmm.fr/annotator/?text=Le%20m%C3%A9lanome%20ou%20les%20m%C3%A9lanomes%20font%20mal%20en%20g%C3%A9n%C3%A9ral%20surtout%20les%20m%C3%A9lanomes%20malins.%20Le%20m%C3%A9lanome%20est%20un%20cancer%20de%20la%20peau%20ou%20des%20muqueuses%2C%20d%C3%A9velopp%C3%A9%20aux%20d%C3%A9pens%20des%20m%C3%A9lanocytes%20(tumeur%20m%C3%A9lanocytaire).%20Son%20si%C3%A8ge%20initial%20est%20la%20peau%20dans%20l%27immense%20majorit%C3%A9%20des%20cas.%20Il%20existe%20toutefois%20des%20m%C3%A9lanomes%20de%20l%27%C5%93il%20(m%C3%A9lanome%20choro%C3%AFdien)%2C%20des%20muqueuses%20(bouche%2C%20canal%20anal%2C%20vagin)%2C%20et%20plus%20rarement%20encore%20des%20organes%20internes.%20En%20d%C3%A9pit%20de%20ce%20que%20son%20nom%20sugg%C3%A8re%2C%20un%20m%C3%A9lanome%20n%27est%20pas%20toujours%20fonc%C3%A9%20%3A%205%20%25%20environ%20des%20m%C3%A9lanomes%20nodulaires%20sont%20%C2%AB%20achromiques%20%C2%BB%20(de%20la%20couleur%20normale%20de%20la%20peau%20chez%20les%20personnes%20autres%20qu%27%C3%A0%20peau%20noire).%20On%20parle%20parfois%20de%20%C2%AB%20m%C3%A9lanome%20malin%20%C2%BB%20%3A%20il%20s%27agit%20alors%20d%27un%20pl%C3%A9onasme%2C%20le%20m%C3%A9lanome%20n%27%C3%A9tant%20jamais%20b%C3%A9nin.&ontologies=MSHFRE&lemmatize=true&display_links=false&apikey=c0549e2b-f41f-4764-8779-20a3c949ebba

Faudra garder un oeuil la dessus. Mais bien evidement, la lemmatisation du texte a un coup.

@jonquet
Copy link
Author

jonquet commented Feb 17, 2017

Sur l'exemple suivant:
http://services.stageportal.lirmm.fr/annotator/?text=m%C3%A9lanocytes&ontologies=MSHFRE&lemmatize=false&display_links=false&apikey=c0549e2b-f41f-4764-8779-20a3c949ebba
On a un seul match. Car dans ce cas la version pluriel est (par chance) dans le dictionnaire grace a un synonyme dans l'ontologie.

Mais du coup, sur le même appel avec lemmatize=true on a 2 annotations une avec le pref label et l'autre avec le synonyme (et le même offset). Comment éviter cela ?

Est-ce que dans "mélanome choroïdien" on aurait une chance de matcher: "choroïde" dans MESH avec la lemmatisation ?

FYI: avec "n'est jamais bénin" on voit se pointer le prochain problème de désambiguïsation ;).

@amineabdaoui
Copy link

Effectivement la lémmatisation ralenti l'appel. Je pense que TreeTagger est légèrement plus rapide que la solution actuelle.

Si on veut éviter d'avoir le meme concept annoté deux fois avec les memes offsets, je propose de rajouter une fonction qui filtre les annotations dans ncbo_annotator/ncbo_annotator.rb

La lemmatisation ne permet pas d'extraire le nom (choroïde) à partir de l'adjectif (choroïdien). Par contre, la stemmatisation permet d'extraire la racine des mots (choroid).

@jonquet
Copy link
Author

jonquet commented Feb 17, 2017

D'ou vient la double annotation ? Est ce que cela ne vient pas tout simplement de doublon dans le dictionnaire lemmatizé ?
Quand le dico d'origine contient "mélanocyte" et "mélanocytes" le nouveau contient 2 fois "mélanocyte" avec deux termID... non ? Dans ce cas, il s'agirait d'en garder qu'un... sans doute celui qui resout au pref label (plutot qu'au synonyme) car cela semble plus logique.

Ok pour la stemmatisation, on garde cela pour plus tard alors ;)

@twktheainur
Copy link

La double annotation vient précisément de cela. Il n'est pas forcément désirable de n'en garder qu'un dans le sens où souvent le concept au pluriel n'est pas vraiment le même concept au pluriel, mais un autre concept plus général dans la hiérarchie je pense. C'est le cas de cancers/cancer dans MEDLINEFRE. Donc dans un cas comme ça l'annotation au pluriel pourrait être pertinente non?

@jonquet
Copy link
Author

jonquet commented Feb 17, 2017

C'est effectivement un cas qui peu se produire. Mais je ne trouve pas cela très logique comme formalisation. La relation is-a n'est pas censé capturer la différence entre les pluriels et singulier. D'ailleurs, la version d'origine de MEDLINEPLUS n'a pas cette situation:
http://bioportal.bioontology.org/ontologies/MEDLINEPLUS?p=classes&conceptid=http%3A%2F%2Fpurl.bioontology.org%2Fontology%2FMEDLINEPLUS%2FC0006826

Pour diminuer le nombre d'annotation, je recommande quand même qu'on se sépare des doublons dans le dictionnaire lemmatisé. Historiquement les pluriels sont nécessaire si on a pas de NLP pour les traiter, mais si on ajoute le NLP pour les traiter, alors on est redondant en les gardant dans le dico.

Je ne pense pas que ce soit très fréquent. Mais on peut faire un double check dans le dictionnaire.

@amineabdaoui
Copy link

amineabdaoui commented Feb 17, 2017

Je m'en occupe, je vais modifier le jar qui génère le dico lemmatisé pour qu'il ne met pas la meme entrée deux fois (meme termId et meme concept lemmatisé).

@amineabdaoui
Copy link

J'ai recrée le jar mais je viens de me rendre compte que le termID n'est pas le meme pour le prefLab et les synonymes du meme concept (du coup pas de doublons dans le dictionnaire lemmatisé car chacun a son termID). On peut pas non plus supprimé les concepts qui se répètent car on risque de tomber sur des concepts venant d'autres ontologies.

Pour éviter d'avoir les synonymes et les preflab dans la meme annotation avec les memes offset, je pense qu'on doit juste les filtrer au moment de l'annotation.
https://github.com/sifrproject/ncbo_annotator/blob/master/lib/ncbo_annotator.rb#L354

@jonquet
Copy link
Author

jonquet commented Feb 17, 2017

En effet je n'avais pas pensé a cela. Les termID différents c'est normal, mais oui on pourrait écraser/enlever des termes d'autres ontologies. C'est bête c'est l'endroit ou cela aurait été le plus efficace. Impossible de faire ca dans le cache ? au moment de la résolution des termID en URI ?

Sinon, oui, il faut filtrer.

@amineabdaoui
Copy link

Résolu dans 331df4f
On obtiens une seule annotation maintenant pour le terme "mélanocytes" meme lorsque l'option lemmatize=true.
http://services.stageportal.lirmm.fr/annotator/?text=m%C3%A9lanocytes&ontologies=MSHFRE&lemmatize=true&display_links=false&apikey=c0549e2b-f41f-4764-8779-20a3c949ebba

J'ai modifié la fonction add_annotation de annotation.rb.

@jonquet
Copy link
Author

jonquet commented Feb 22, 2017

J'assigne a @vemonet pour qu'on ajoute ce paramètre aussi dans l'UI sur stageportal. Pour pouvoir tester de plus près .

@twktheainur
Copy link

@jonquet Je l'ai fait et c'est disponible dans l'interface stage. Pour le moment j'ai fait sur la base de la branche lirmm, je suis en train de merger avec SIFR. C'est pour ça que tu verras le style d'interface générique de la branche lirmm. Après le merge ça revendra à l'interface sifr

@jonquet
Copy link
Author

jonquet commented Mar 30, 2017

Fait. Passer en prod fin mars.
A l'avenir, utiliser TreeTager quand le kernel de la VA sera mis à jour.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants