Lucrul cu fișierele MeSH din Python Legarea termenilor și numerelor

Acest tutorial arată cum putem folosi diferite aspecte ale Python (adică dicționare, liste și expresii regulate) împreună pentru a rezolva diferite probleme. Acesta arată, de asemenea, modul în care putem folosi Python pentru a lega relațiile din fișierul MeSH, facilitând înțelegerea ierarhiei și structurii acestuia.

Înainte de a merge mai departe cu acest tutorial, s-ar putea să te întrebi ce înțelegem prin MeSH. Deci, haideți să începem prin definirea mai întâi a acestui termen și apoi să facem mai multe detalii cu privire la structura sa.

Ce este MeSH?

MeSH este un acronim pentru Subiecte medicale. Se consideră că vocabularul (tezaurul) controlat al Bibliotecii Naționale a Medicinilor din S.U.A., care oferă uniformitate și consecvență indexării și catalogării literaturii biomedicale. MeSH, o caracteristică distinctivă a MEDLINE, este aranjată într-o manieră ierarhică denumită Structura arborescentă Mesh și este actualizată anual.

MeSH este astfel o nomenclatură a termenilor medicali disponibili de la Biblioteca Națională de Medicină din S.U.A., care urmărește să creeze noi cunoștințe prin exploatarea relațiilor dintre termenii care adnotă literatura biomedicală.  

Oamenii care caută MEDLINE / PubMed și alte baze de date fac uz de MeSH pentru a ajuta la căutarea subiectului. Indexatorii Bibliotecii Naționale de Medicină (NLM) folosesc MeSH pentru a descrie conținutul articolelor din reviste pentru MEDLINE. Catalogistii folosesc MeSH pentru a descrie carti si filme audiovizuale in NLM si alte colectii de biblioteci. Astfel, MeSH poate fi folosit pentru numeroase sarcini care implică indexarea, etichetarea, căutarea, recuperarea, analizarea, codarea, îmbinarea și partajarea textului biomedical.

Structura fișierului MeSH

Descriptorii MeSH sunt organizați în 16 categorii:

  • A: anatomie
  • B: organisme 
  • C: boli
  • D: medicamente și substanțe chimice
  • E: tehnici și echipamente analitice, de diagnostic și terapeutice
  • F: psihiatrie și psihologie
  • G: fenomene și procese 
  • H: discipline și ocupații
  • I: antropologie, educație, sociologie și fenomene sociale
  • J: tehnologie, industrie, agricultură
  • K: umanistică
  • L: știința informației
  • M: numite grupuri
  • N: sănătate
  • V: caracteristicile publicării
  • Z: geographicals

Puteți găsi mai multe informații despre categorii din Biblioteca Națională de Medicină din S.U.A. După cum se poate vedea, fiecare categorie este împărțită în continuare în subcategorii. Această structură nu este totuși considerată un sistem autoritar de clasificare a disciplinei, ci mai degrabă ca un aranjament de descriptori pentru îndrumarea și comoditatea persoanelor care atribuie titluri subiecte documentelor sau caută literatură. Prin urmare, nu este o clasificare exhaustivă a subiectului și conține doar termenii care au fost selectați pentru a fi incluși în acest tezaur.

Iată câteva informații despre structurile MeSH Tree:

Din cauza structurii ramificate a ierarhiilor, aceste liste sunt denumite uneori "copaci". Fiecare descriptor MeSH apare în cel puțin un loc din copaci și poate apărea în cât mai multe locuri suplimentare, după cum este cazul. Cei care indexează articole sau cărți de catalog sunt instruiți să găsească și să utilizeze cel mai specific descriptor MeSH disponibil pentru a reprezenta fiecare concept indexabil. 

Descărcarea unui fișier MeSH

În scopul acestui tutorial, avem nevoie de un fișier MeSH pentru a lucra cu Python. Puteți găsi fișierul MeSH pe site-ul de descărcare NLM.

Să mergem mai departe și să descarcăm cel mai recent fișier ASCII MeSH. Putem merge mai întâi la arhiva MeSH FTP: ftp://nlmpubs.nlm.nih.gov/online/mesh/, apoi alegeți 2017 director. În asciimesh / director, veți găsi trei .cos fișiere: c2017.bind2017.bin, și q2017.bin. Să descărcăm d2017.bin. Puteți descărca fișierul de la: ftp://nlmpubs.nlm.nih.gov/online/mesh/2017/asciimesh/d2017.bin (27.5 MB).

Conectarea termenilor la numere

Hai să intrăm în centrul acestui articol. Ceea ce încercăm să facem este să citim un fișier MeSH (adică. .cos fișierul pe care tocmai l-ați descărcat), navigați prin intrări, găsiți toate numerele MeSH pentru fiecare intrare și listați termenii împreună cu numerele lor relevante. 

Primul lucru pe care l-am face în mod normal este să citim .cos dosar, după cum urmează:

meshFile = 'd2017.bin' cu deschis (meshFile, mode = "rb") ca fișier: mesh = file.readlines ()

Observați că am folosit rb mod, ceea ce înseamnă că citim binar fără traducere de linie întreruptă.

De asemenea, trebuie să definim un fișier de ieșire în care să stocăm rezultatele (ieșirea):

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

În acest moment, vrem să verificăm liniile care încep cu MH = (Termenul MeSH) și MN = (Numărul MeSH). Nu ar trebui să fac asta acum, dar vă va arăta un instantaneu al fișierului MeSH pentru a avea o idee despre structură și pentru a elimina confuziile (MH și MN sunt înconjurate de dreptunghiuri roșii, respectiv).


Pentru a verifica liniile care încep cu MH = și MN =, trebuie să folosim expresii regulate. Deci, dacă vrem să verificăm liniile care încep MH = urmat de orice personaj, ne-ar face așa cum se arată în codul de mai jos (voi ajunge la ceea ce linia este într-un moment). Observați că am folosit b in loc de r pentru expresia regulată, deoarece aplicăm modelul pe un obiect octet și nu pe un obiect șir, deci ar trebui să folosim un model octet.

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

Același lucru se va aplica și pentru numărul MeSH, dar de data aceasta pentru liniile care încep cu MN =.

Revenind la linia, acest lucru se referă la liniile din fișierul MeSH. Așadar, vom merge prin linia de fișiere în linie, căutând termenii și numerele MeSH. După cum puteți vedea din fișierul MeSH de mai sus, termenul MeSH este înaintea numărului MeSH. Deci, în codul nostru, numărul MeSH va fi întotdeauna numărul corespunzător termenului MeSH capturat anterior. Vom face astfel:

pentru linia în rețea: meshTerm = re.search (b'MH = (. +) $ ', linie) dacă meshTerm: termen = meshTerm.group (1) meshNumber = re.search (b'MN = ', line) dacă meshNumber: number = meshNumber.group (1) numere [number.decode (' utf-8 ')] = term.decode (' utf-8 ' [termen] + "+ număr.decod (" utf-8 ") alt: termeni [termen] = număr.decod (" utf-8 ")

Să trecem prin codul de mai sus pas cu pas. Dacă ne uităm la expresia regulată MH = (+) $, acest lucru ne spune în principiu să găsim literalul MH = urmat de cel puțin un caracter. (.) Înseamnă orice caracter și + înseamnă că trebuie să fie una sau mai multe caractere și să returneze totul până la sfârșitul liniei ($). 

Paranteza din jur .+, acesta este (. +), este un grup de captare, astfel încât să putem prelua rezultatul. Deci, pentru termenul MeSH înconjurat de un dreptunghi roșu în imaginea de mai sus, termenul preluat va fi Calcomycin. Motivul pentru care folosim if-statements este că unele linii nu vor începe nici cu MH = nici MN =.

Pentru termenul MeSH capturat și numărul MeSH, vom crea o nouă pereche cheie-valoare pentru un obiect de dicționar, după cum se arată în acest rând de cod: numere [str (număr)] = termen.

Este important de menționat că un singur termen MeSH poate avea mai mult de un număr MeSH. Deci, concatenăm fiecare număr MeSH nou cu termenul relevant într-un șir, așa cum se arată în această porțiune a codului:

dacă termenul în termeni: termeni [termen] = termeni [termen] + "+ număr.decod (" utf-8 ") alt: termeni [termen] = number.decode ('utf-8')

Astfel, în acest caz, vom avea un obiect de dicționare cu perechi cheie-valoare care constau dintr-un termen MeSH ca cheie, și colecția de concatenare a tuturor numerelor MeSH corespunzătoare ca valoare.

Ceea ce vrem să facem acum este să enumerăm diferitele chei (termeni) și să avem valorile (numerele) relevante enumerate sub termenul relevant. Pentru a lista diferiți termeni, facem următoarele:

MeshNumberList = [] MeshTermList = terms.keys () pentru termenul în meshTermList: item_list = termeni [termen] .split (") pentru frază în item_list: meshNumberList.append (phrase) 

În cele din urmă, vom enumera termenul și numerele sale relevante după cum urmează:

(numere [element], '\ n', element, fișier = outputFile) used_items.add (numere [element]) else: print ( element, fișier = outputFile)

Înainte de a afișa rezultatul programului, să le punem împreună.

Punându-le pe toți împreună

În această secțiune, vă voi arăta care este programul nostru complet Python care leagă termenul MeSH de numerele sale:

importul termenilor =  numere =  meshFile = 'd2017.bin' cu deschis (meshFile, mode = "rb") ca fișier: mesh = file.readlines ') pentru linia în rețea: meshTerm = re.search (b'MH = (. +) $', linia) dacă meshTerm: termen = meshTerm.group (1) meshNumber = re.search (b'MN = $ ', line) dacă meshNumber: number = meshNumber.group (1) numere [number.decode (' utf-8 ')] = term.decode (' utf-8 ' = termeni [termen] + "+ număr.decod ('utf-8') alt: termeni [term] = number.decode ('utf-8') meshNumberList = [] meshTermList = : item_list = termeni [termen] .split (") pentru o expresie în item_list: meshNumberList.append (frază) meshNumberList.sort () used_items = set () pentru elementul în meshNumberList: [item], '\ n', element, fișier = outputFile) used_items.add (numere [item]) else: print (item, file = outputFile)

producție

Puteți descărca ieșirea din Dropbox (1,77 MB). Luând o mostră de ieșire după cum se arată mai jos, putem vedea cum un termen MeSH (Pseudopalatina Fossa) este listat cu numerele MeSH care sunt grupate imediat dedesubt.

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.165 A02.835.232.781.750.400

Concluzie

Tutorialul a arătat modul în care putem folosi diferite aspecte ale Python (adică. dicționare, liste și expresii regulate) împreună pentru a rezolva diferite probleme. Acesta arată, de asemenea, modul în care putem folosi Python pentru a lucra cu fișierele MeSH pentru a conecta anumite părți ale acestui fișier complex într-un mod care face mai ușor să înțeleagă ierarhia și structura acestuia, așa cum am făcut aici prin conectarea termenului MeSH la numerele MeSH relevante.

Cod