Lavorare con i file MeSH in Python collegamento di termini e numeri

Questo tutorial mostra come possiamo usare diversi aspetti di Python (cioè dizionari, elenchi ed espressioni regolari) insieme per risolvere diversi problemi. Mostra anche come possiamo usare Python per collegare le relazioni nel file MeSH, facilitando la comprensione della sua gerarchia e struttura.

Prima di andare avanti con questo tutorial, ti starai chiedendo cosa intendiamo per MeSH. Iniziamo definendo questo termine per primo e poi approfondiremo la sua struttura.

Cosa è MeSH?

MeSH è l'acronimo di Titolo soggetto medico. È considerato il vocabolario controllato (Thesaurus) della National Library of Medicine degli Stati Uniti, che conferisce uniformità e coerenza all'indicizzazione e alla catalogazione della letteratura biomedica. MeSH, una caratteristica distintiva di MEDLINE, è organizzato in modo gerarchico chiamato MesH Tree Structure e viene aggiornato annualmente.

MeSH è quindi una nomenclatura di termini medici disponibile presso la Biblioteca Nazionale di Medicina degli Stati Uniti, che mira a creare nuove conoscenze sfruttando le relazioni tra termini che annettono la letteratura biomedica.  

Le persone che cercano MEDLINE / PubMed e altri database fanno uso di MeSH per assistere nella ricerca di soggetti. Gli indicizzatori della National Library of Medicine (NLM) utilizzano MeSH per descrivere il contenuto degli articoli di riviste per MEDLINE. I catalogatori utilizzano MeSH per descrivere libri e audiovisivi nel NLM e in altre raccolte di biblioteche. Quindi MeSH può essere utilizzato per numerose attività che includono l'indicizzazione, l'etichettatura, la ricerca, il recupero, l'analisi, la codifica, l'unione e la condivisione di testo biomedico.

Struttura del file MeSH

I descrittori MeSH sono organizzati in 16 categorie:

  • UN: anatomia
  • B: organismi 
  • C: malattie
  • D: droghe e prodotti chimici
  • E: tecniche e attrezzature analitiche, diagnostiche e terapeutiche
  • F: psichiatria e psicologia
  • G: fenomeni e processi 
  • H: discipline e occupazioni
  • IO: antropologia, educazione, sociologia e fenomeni sociali
  • J: tecnologia, industria, agricoltura
  • K: umanistiche
  • L: scienza dell'informazione
  • M: gruppi nominati
  • N: assistenza sanitaria
  • V: caratteristiche di pubblicazione
  • Z: geographicals

Puoi trovare ulteriori informazioni sulle categorie dalla National Library of Medicine degli Stati Uniti. Come possiamo vedere, ogni categoria è ulteriormente suddivisa in sottocategorie. Questa struttura, tuttavia, non è considerata un sistema di classificazione soggetto autorevole, ma piuttosto come un insieme di descrittori per la guida e la convenienza di persone che assegnano intestazioni di soggetto a documenti o che cercano letteratura. Non è quindi una classificazione esauriente del soggetto e contiene solo i termini che sono stati selezionati per l'inclusione in questo thesaurus.

Ecco alcune ulteriori informazioni su MeSH Tree Structures:

A causa della struttura ramificata delle gerarchie, questi elenchi vengono a volte definiti "alberi". Ogni descrittore MeSH appare in almeno un punto tra gli alberi e può apparire in tanti posti aggiuntivi che potrebbero essere appropriati. Coloro che indicizzano articoli o libri di catalogo sono istruiti a trovare e utilizzare il descrittore MeSH più specifico disponibile per rappresentare ciascun concetto indicizzabile. 

Download di un file MeSH

Ai fini di questo tutorial, abbiamo bisogno di un file MeSH con cui lavorare in Python. È possibile trovare il file MeSH sul sito di download NLM.

Andiamo avanti e scarica l'ultimo file MeSH ASCII. Possiamo prima andare all'archivio FTP MeSH: ftp://nlmpubs.nlm.nih.gov/online/mesh/, quindi scegliere il 2017 directory. Nel asciimesh / directory, ne troverai tre .bidone File: c2017.bind2017.bin, e q2017.bin. Scarichiamo d2017.bin. È possibile scaricare il file da: ftp://nlmpubs.nlm.nih.gov/online/mesh/2017/asciimesh/d2017.bin (27,5 MB).

Collegamento dei termini ai numeri

Passiamo al nocciolo di questo articolo. Quello che stiamo cercando di fare è leggere un file MeSH (vale a dire. il .bidone file appena scaricato), sfoglia le voci, trova tutti i numeri MeSH per ogni voce ed elenca i termini insieme ai relativi numeri. 

La prima cosa che faremmo normalmente è leggere il .bidone file, come segue:

meshFile = 'd2017.bin' con open (meshFile, mode = "rb") come file: mesh = file.readlines ()

Si noti che abbiamo usato il rb modalità, il che significa che stiamo leggendo binari senza traduzione di interruzione di riga.

Dobbiamo inoltre definire un file di output in cui archiviamo i risultati (output):

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

A questo punto, vogliamo verificare le linee che iniziano con MH = (Termine MeSH) e MN = (Numero MeSH). Non dovrei farlo ora, ma ti mostrerò un'istantanea del file MeSH per avere un'idea della struttura e rimuovere eventuali confusioni (MH e MN sono circondati da rettangoli rossi, rispettivamente).


Per controllare le righe che iniziano con MH = e MN =, abbiamo bisogno di usare espressioni regolari. Quindi, se vogliamo controllare le linee che iniziano con MH = seguito da qualsiasi carattere, faremmo come mostrato nel codice qui sotto (arriverò a cosa linea è in un momento). Notare che ho usato B invece di r per l'espressione regolare, poiché applichiamo il modello su un oggetto byte e non su un oggetto stringa, quindi dovremmo usare un modello di byte.

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

La stessa cosa si applica al numero MeSH, ma questa volta per le righe che iniziano con MN =.

Tornando a linea, questo si riferisce alle linee nel file MeSH. Quindi dovremmo percorrere il file riga per riga, cercando i termini e i numeri di MeSH. Come puoi vedere dallo snapshot del file MeSH sopra, il termine MeSH viene prima del numero MeSH. Quindi, nel nostro codice, il numero MeSH sarà sempre il numero corrispondente al termine MeSH precedentemente acquisito. Faremo quindi quanto segue:

per riga in mesh: meshTerm = re.search (b'MH = (. +) $ ', riga) se meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = (. +) $ ', riga) se meshNumber: numero = meshNumber.group (1) numeri [numero.decode (' utf-8 ')] = term.decode (' utf-8 ') se termine in termini: termini [termine] = termini [term] + "+ number.decode ('utf-8') else: termini [term] = number.decode ('utf-8')

Passiamo attraverso il codice sopra passo dopo passo. Se osserviamo l'espressione regolare MH = (. +) $, questo fondamentalmente ci sta dicendo di trovare il letterale MH = seguito da almeno un personaggio. (.) Significa qualsiasi carattere, e + significa che deve essere uno o più caratteri e restituire tutto alla fine della riga ($). 

La parentesi intorno .+, questo è (. +), è un gruppo di acquisizione in modo che possiamo recuperare il risultato. Quindi, per il termine MeSH circondato da un rettangolo rosso nell'istantanea sopra, il termine recuperato sarà Calcomycin. Il motivo per cui utilizziamo le if-statement è che alcune linee non inizieranno con MH = né MN =.

Per il termine MeSH catturato e il numero MeSH, creiamo una nuova coppia valore-chiave per un oggetto dizionario, come mostrato in questa riga di codice: numeri [str (numero)] = termine.

È importante notare che un singolo termine MeSH potrebbe avere più di un numero MeSH. Quindi concateniamo ogni nuovo numero MeSH con il termine pertinente in una stringa, come mostrato in questa parte del codice:

se termini in termini: termini [termine] = termini [termine] + "+ numero.decode ('utf-8') altro: termini [termine] = numero.decode ('utf-8')

Quindi in questo caso avremo un oggetto dizionario con coppie chiave-valore che consistono in un termine MeSH come il chiave, e la raccolta di concatenazione di tutti i numeri MeSH corrispondenti come valore.

Quello che vogliamo fare ora è elencare le diverse chiavi (termini), e avere i valori rilevanti (numeri) elencati sotto il termine pertinente. Per elencare i diversi termini, facciamo quanto segue:

meshNumberList = [] meshTermList = termini.keys () per il termine in meshTermList: item_list = termini [term] .split (") per la frase in lista_serie: meshNumberList.append (frase) 

Infine, elencheremo il termine e i relativi numeri rilevanti come segue:

used_items = set () per item in meshNumberList: se numeri [item] non in used_items: print (numeri [elemento], '\ n', item, file = outputFile) used_items.add (numeri [elemento]) else: print ( item, file = outputFile)

Prima di mostrare l'output del programma, mettiamo tutto insieme.

Mettere tutto insieme

In questa sezione, ti mostrerò che aspetto ha il nostro programma Python completo che collega il termine MeSH ai suoi numeri:

import re terms =  numbers =  meshFile = 'd2017.bin' con open (meshFile, mode = "rb") come file: mesh = file.readlines () outputFile = open ('mesh.txt', 'w ') per la riga in mesh: meshTerm = re.search (b'MH = (. +) $', riga) se meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = (. + ) $ ', riga) se meshNumber: numero = meshNumber.group (1) numeri [numero.decode (' utf-8 ')] = term.decode (' utf-8 ') se termine in termini: termini [termine] = termini [term] + "+ number.decode ('utf-8') else: termini [term] = number.decode ('utf-8') meshNumberList = [] meshTermList = termini.keys () per termine in meshTermList : item_list = terms [term] .split (") per la frase in lista_disc: meshNumberList.append (frase) meshNumberList.sort () used_items = set () per l'elemento in meshNumberList: se numeri [elemento] non in used_items: print (numeri [item], '\ n', item, file = outputFile) used_items.add (numeri [elemento]) else: print (item, file = outputFile)

Produzione

È possibile scaricare l'output da Dropbox (1,77 MB). Prendendo un esempio dell'output come mostrato di seguito, possiamo vedere come un termine MeSH (Fossa pterigopalatina) è elencato con i suoi numeri MeSH raggruppati immediatamente sotto.

Fossa pterigopalatina 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

Conclusione

Il tutorial ha mostrato come possiamo usare diversi aspetti di Python (vale a dire. dizionari, elenchi ed espressioni regolari) insieme per risolvere diversi problemi. Mostra anche come possiamo usare Python per lavorare con i file MeSH per collegare alcune parti di questo file complesso in un modo che rende più facile comprenderne la gerarchia e la struttura, come abbiamo fatto qui collegando il termine MeSH ai suoi numeri MeSH rilevanti.