Travailler avec des fichiers MeSH en Python lier des termes et des nombres

Ce tutoriel montre comment utiliser ensemble différents aspects de Python (dictionnaires, listes et expressions régulières) pour résoudre différents problèmes. Il montre également comment nous pouvons utiliser Python pour lier les relations dans le fichier MeSH, facilitant ainsi la compréhension de sa hiérarchie et de sa structure..

Avant de poursuivre avec ce tutoriel, vous vous demandez peut-être ce que nous entendons par MeSH. Commençons donc par définir ce terme d’abord, puis nous détaillerons un peu plus sa structure..

Qu'est-ce que MeSH??

MeSH est un acronyme pour Sous-titres médicaux. Il est considéré comme le vocabulaire contrôlé (thésaurus) de la National Library of Medicine des États-Unis, qui uniformise et uniformise l’indexation et le catalogage de la littérature biomédicale. MeSH, caractéristique distinctive de MEDLINE, est organisé de manière hiérarchique, appelé structure arborescente MesH, et est mis à jour chaque année..

MeSH est donc une nomenclature de termes médicaux disponible à la Bibliothèque nationale de médecine des États-Unis, qui vise à créer de nouvelles connaissances en exploitant les relations entre les termes qui annotent la littérature biomédicale..  

Les personnes effectuant des recherches dans MEDLINE / PubMed et d’autres bases de données utilisent MeSH pour faciliter la recherche par sujet. Les indexeurs de la National Library of Medicine (NLM) utilisent MeSH pour décrire le contenu des articles de revues dans MEDLINE. Les catalogueurs utilisent MeSH pour décrire des livres et des documents audiovisuels de la NLM et d'autres collections de bibliothèques. Ainsi, MeSH peut être utilisé pour de nombreuses tâches impliquant l'indexation, le balisage, la recherche, la récupération, l'analyse, le codage, la fusion et le partage de texte biomédical..

Structure de fichier MeSH

Les descripteurs MeSH sont organisés en 16 catégories:

  • UNE: anatomie
  • B: organismes 
  • C: maladies
  • RÉ: médicaments et produits chimiques
  • E: techniques et équipements analytiques, diagnostiques et thérapeutiques
  • F: psychiatrie et psychologie
  • G: phénomènes et processus 
  • H: disciplines et professions
  • JE: anthropologie, éducation, sociologie et phénomènes sociaux
  • J: technologie, industrie, agriculture
  • K: sciences humaines
  • L: science de l'information
  • M: groupes nommés
  • N: soins de santé
  • V: caractéristiques de publication
  • Z: géographiques

Vous trouverez plus d’informations sur les catégories dans la National Library of Medicine des États-Unis. Comme on peut le constater, chaque catégorie est ensuite divisée en sous-catégories. Cependant, cette structure n'est pas considérée comme un système de classification par matières faisant autorité, mais plutôt comme un ensemble de descripteurs destinés à guider et à faciliter la tâche des personnes qui attribuent des vedettes-matières à des documents ou qui recherchent une littérature. Il ne s'agit donc pas d'une classification exhaustive du sujet et ne contient que les termes qui ont été sélectionnés pour être inclus dans ce thésaurus..

Voici quelques informations supplémentaires sur les structures d'arbres MeSH:

En raison de la structure de branchement des hiérarchies, ces listes sont parfois appelées "arbres". Chaque descripteur MeSH apparaît à au moins un endroit dans les arbres et peut apparaître à autant d'endroits supplémentaires que nécessaire. Ceux qui indexent des articles ou des livres de catalogues doivent trouver et utiliser le descripteur MeSH le plus spécifique disponible pour représenter chaque concept indexable.. 

Télécharger un fichier MeSH

Pour les besoins de ce tutoriel, nous avons besoin d’un fichier MeSH avec lequel travailler en Python. Vous pouvez trouver le fichier MeSH sur le site de téléchargement de la NLM.

Continuons et téléchargez le dernier fichier ASCII MeSH. Nous pouvons d’abord accéder à l’archive FTP MeSH: ftp://nlmpubs.nlm.nih.gov/online/mesh/, puis choisir le 2017 annuaire. dans le asciimesh / répertoire, vous trouverez trois .poubelle des dossiers: c2017.bind2017.bin, et q2017.bin. Téléchargeons d2017.bin. Vous pouvez télécharger le fichier à partir de: ftp://nlmpubs.nlm.nih.gov/online/mesh/2017/asciimesh/d2017.bin (27,5 Mo).

Relier les termes aux nombres

Passons au cœur de cet article. Ce que nous essayons de faire est de lire un fichier MeSH (c'est à dire. la .poubelle fichier que vous venez de télécharger), parcourez les entrées, trouvez tous les numéros MeSH pour chaque entrée et dressez la liste des termes avec leurs numéros correspondants. 

La première chose que nous ferions normalement est de lire le .poubelle fichier, comme suit:

meshFile = 'd2017.bin' avec open (meshFile, mode = "rb") en tant que fichier: mesh = file.readlines ()

Notez que nous avons utilisé le rb mode, ce qui signifie que nous lisons des fichiers binaires sans traduction en saut de ligne.

Nous devons également définir un fichier de sortie dans lequel nous stockerions les résultats (sortie):

outputFile = open ('mesh.txt', 'w')

À ce stade, nous voulons vérifier les lignes qui commencent par MH = (Terme MeSH) et MN = (Numéro MeSH). Je ne devrais pas le faire maintenant, mais je vais vous montrer un instantané du fichier MeSH pour avoir une idée de la structure et pour dissiper toute confusion (MH et MN sont entourés de rectangles rouges, respectivement).


Pour vérifier les lignes commençant par MH = et MN =, nous devons utiliser des expressions régulières. Donc, si nous voulons vérifier les lignes qui commencent par MH = suivi de tous les caractères, nous ferions comme indiqué dans le code ci-dessous (je vais arriver à ce que ligne est dans un instant). Notez que j'ai utilisé b au lieu de r pour l'expression régulière, puisque nous appliquons le motif à un objet octet et non à un objet chaîne, nous devrions donc utiliser un motif octet.

import re meshTerm = re.search (b'MH = (. +) $ ', ligne)

La même chose s’appliquerait pour le numéro MeSH, mais cette fois pour les lignes commençant par MN =.

Revenir à ligne, cela fait référence aux lignes du fichier MeSH. Nous parcourons donc le fichier ligne par ligne, en recherchant les termes et les chiffres de MeSH. Comme vous pouvez le constater à partir de l'instantané de fichier MeSH ci-dessus, le terme MeSH précède le numéro MeSH. Ainsi, dans notre code, le numéro MeSH sera toujours le numéro correspondant au terme MeSH précédemment capturé. Nous allons donc faire ce qui suit:

pour une ligne dans un maillage: meshTerm = re.search (b'MH = (. +) $ ', ligne) si meshTerm: terme = mailleTerm.groupe (1) meshNumber = re.search (b'MN = (. +) $ ', ligne) si meshNumber: number = meshNumber.group (1) nombres [numéro.decode (' utf-8 ')] = terme.decode (' utf-8 ') si terme en termes: termes [terme] = termes [term] + "+ number.decode ('utf-8') sinon: termes [term] = number.decode ('utf-8')

Passons en revue le code ci-dessus, étape par étape. Si nous regardons l'expression régulière MH = (. +) $, c'est essentiellement nous dire de trouver le littéral MH = suivi d'au moins un personnage. (.) Désigne n'importe quel caractère, et + signifie qu'il doit y avoir un ou plusieurs caractères et tout retourner à la fin de la ligne ($). 

La parenthèse autour .+, C'est (. +), est un groupe de capture afin que nous puissions récupérer le résultat. Ainsi, pour le terme MeSH entouré d’un rectangle rouge dans l’instantané ci-dessus, le terme récupéré sera Calcomycine. La raison pour laquelle nous utilisons if-statement est que certaines lignes ne commenceront ni par MH = ni MN =.

Pour le terme MeSH et le numéro MeSH capturés, nous créons une nouvelle paire clé-valeur pour un objet du dictionnaire, comme indiqué dans cette ligne de code: nombres [str (nombre)] = terme.

Il est important de noter qu'un même terme MeSH peut avoir plus d'un numéro MeSH. Nous concaténons donc chaque nouveau numéro MeSH avec le terme approprié dans une chaîne, comme indiqué dans cette partie du code:

si terme en termes: termes [terme] = termes [terme] + "+ numéro.decode ('utf-8') sinon: termes [terme] = numéro.decode ('utf-8')

Ainsi, dans ce cas, nous aurons un objet dictionnaire avec des paires clé-valeur consistant en un terme MeSH en tant que clé, et la collection de concaténation de tous les numéros MeSH correspondants en tant que valeur.

Ce que nous voulons faire maintenant est de lister les différentes clés (termes) et d’avoir les valeurs pertinentes (nombres) sous le terme approprié. Pour lister les différents termes, nous procédons comme suit:

meshNumberList = [] meshTermList = terms.keys () pour un terme dans meshTermList: item_list = terms [term] .split (") pour une phrase dans item_list: meshNumberList.append (phrase) 

Enfin, nous énumérerons le terme et ses numéros pertinents comme suit:

used_items = set () pour l'élément dans meshNumberList: if numbers [item] pas dans used_items: print (numbers [item], '\ n', item, fichier = fichier de sortie) used_items.add (numbers [item]) sinon: print ( item, fichier = fichier de sortie)

Avant de montrer le résultat du programme, rassemblons-le.

Mettre tous ensemble

Dans cette section, je vais vous montrer à quoi ressemble notre programme Python complet qui relie le terme MeSH à ses nombres:

import re termes =  numbers =  meshFile = 'd2017.bin' avec open (meshFile, mode = "rb") en tant que fichier: mesh = file.readlines () outputFile = ouvert ('mesh.txt', 'w ') pour la ligne dans le maillage: meshTerm = re.search (b'MH = (. +) $', ligne) si meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = (. + ) $ ', ligne) si meshNumber: nombre = meshNumber.group (1) nombres [numéro.decode (' utf-8 ')] = terme.decode (' utf-8 ') si terme en termes: termes [terme] = termes [terme] + "+ numéro.decode ('utf-8') sinon: termes [terme] = nombre.decode ('utf-8') meshNumberList = [] meshTermList = termes.keys () pour terme dans meshTermList : item_list = terms [term] .split (") pour une phrase dans item_list: meshNumberList.append (phrase) meshNumberList.sort () used_items = set () pour un élément dans meshNumberList: if numer [item] pas dans used_items: print (numbers [item], '\ n', item, fichier = fichier_sortie) used_items.add (nombres [article]) else: print (article, fichier = fichier_sortie)

Sortie

Vous pouvez télécharger le résultat depuis Dropbox (1,77 Mo). En prenant un échantillon de la sortie comme indiqué ci-dessous, nous pouvons voir comment un terme MeSH (Fossa de ptérygopalatine) est répertorié avec ses numéros MeSH qui sont regroupés immédiatement sous.

Pterygopalatine Fossa A02.835.232.781.670 A02.835.232.781.750 A02.835.232.781.750.150 A02.835.232.781.750.165 A02.835.232.781.750.400

Conclusion

Le tutoriel a montré comment utiliser différents aspects de Python (c'est à dire. dictionnaires, listes et expressions régulières) pour résoudre différents problèmes. Il montre également comment nous pouvons utiliser Python pour utiliser des fichiers MeSH afin de relier certaines parties de ce fichier complexe de manière à faciliter la compréhension de sa hiérarchie et de sa structure, comme nous l’avons fait ici en liant le terme MeSH à ses numéros MeSH pertinents..