Arbeide med MeSH-filer i Python Koblingsvilkår og numre

Denne opplæringen viser hvordan vi kan bruke forskjellige aspekter av Python (dvs. ordbøker, lister og vanlige uttrykk) sammen for å løse forskjellige problemer. Det viser også hvordan vi kan bruke Python til å knytte sammenhenger i MeSH-filen, noe som gjør det lettere å forstå sitt hierarki og struktur.

Før du går videre med denne opplæringen, lurer du kanskje på hva vi mener med MeSH. Så la oss starte med å definere denne termen først, og deretter gå inn i litt mer detaljert på strukturen.

Hva er MeSH?

MeSH er et akronym for Medisinsk emneoverskrift. Det anses som det amerikanske nasjonalbiblioteket for medisinens kontrollerte ordforråd (tesaurus), som gir ensartethet og konsistens til indeksering og katalogisering av biomedisinsk litteratur. MeSH, et karakteristisk trekk ved MEDLINE, arrangeres på en hierarkisk måte kalt MesH Tree Structure, og oppdateres årlig.

MeSH er således en nomenklatur av medisinske termer som er tilgjengelig fra U.S. National Library of Medicine, som har som mål å skape ny kunnskap ved å utnytte forholdene mellom begreper som annoterer biomedisinsk litteratur.  

Personer som søker MEDLINE / PubMed og andre databaser benytter MeSH for å bistå med emnesøk. The National Library of Medicine (NLM) indeksere bruker MeSH til å beskrive innholdet i journalartikler for MEDLINE. Katalogister bruker MeSH til å beskrive bøker og audiovisuelle medier i NLM og andre bibliotekssamlinger. Så MeSH kan brukes til mange oppgaver som involverer indeksering, merking, søking, henting, analyse, koding, sammenslåing og deling av biomedisinsk tekst.

MeSH filstruktur

MeSH-beskrivere er organisert i 16 kategorier:

  • EN: anatomi
  • B: organismer 
  • C: sykdommer
  • D: narkotika og kjemikalier
  • E: analytiske, diagnostiske og terapeutiske teknikker og utstyr
  • F: psykiatri og psykologi
  • G: fenomener og prosesser 
  • H: disipliner og yrker
  • JEG: antropologi, utdanning, sosiologi og sosiale fenomener
  • J: teknologi, industri, landbruk
  • K: humaniora
  • L: informasjonsvitenskap
  • M: navngitte grupper
  • N: helsevesen
  • V: publiseringsegenskaper
  • Z: geographicals

Du finner mer informasjon om kategoriene fra U.S. National Library of Medicine. Som vi kan se, er hver kategori videre delt inn i underkategorier. Denne strukturen er imidlertid ikke ansett som et autoritativt fagklassifiseringssystem, men snarere som et arrangement av beskrivere for veiledning og bekvemmelighet for personer som tilordner emner til dokumenter eller søker litteratur. Det er således ikke en uttømmende klassifisering av emnet og inneholder bare de vilkårene som er valgt for inkludering i denne tesaurusen.

Her er litt mer informasjon om MeSH Tree Structures:

På grunn av forgreningsstrukturen til hierarkiene, blir disse listene noen ganger referert til som "trær". Hver MeSH-deskriptor vises på minst ett sted i trærne, og kan vises på så mange andre steder som det er hensiktsmessig. De som indekserer artikler eller katalogbøker, blir instruert til å finne og bruke den mest spesifikke MeSH-beskrivelsen som er tilgjengelig for å representere hvert indeksert konsept. 

Laster ned en MeSH-fil

For formålet med denne opplæringen, trenger vi en MeSH-fil for å jobbe med i Python. Du kan finne MeSH-fil på NLM-nedlastingsstedet.

La oss gå videre og laste ned den siste ASCII MeSH-filen. Vi kan først gå til MeSH FTP-arkivet: ftp://nlmpubs.nlm.nih.gov/online/mesh/, og velg deretter 2017 katalogen. I asciimesh / katalog finner du tre .bin filer: c2017.bind2017.bin, og q2017.bin. La oss laste ned d2017.bin. Du kan laste ned filen fra: ftp://nlmpubs.nlm.nih.gov/online/mesh/2017/asciimesh/d2017.bin (27.5 MB).

Koble vilkår til tall

La oss hoppe inn i kjernen i denne artikkelen. Det vi prøver å gjøre er å lese en MeSH-fil (dvs. de .bin fil du nettopp lastet ned), bla gjennom oppføringene, finn alle MeSH-tallene for hver oppføring, og oppgi vilkårene sammen med deres relevante tall. 

Det første vi normalt ville gjøre er å lese .bin fil, som følger:

meshFile = 'd2017.bin' med åpen (meshFile, modus = "rb") som fil: mesh = file.readlines ()

Legg merke til at vi har brukt rb modus, noe som betyr at vi leser binær uten linjeoverskridende oversettelse.

Vi må også definere en utdatafil der vi lagrer resultatene (utdata):

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

På dette punktet vil vi sjekke linjene som starter med MH = (MeSH term) og MN = (MeSH-nummer). Jeg burde ikke gjøre dette nå, men vil vise deg et øyeblikksbilde av MeSH-filen for å få en ide om strukturen og fjerne eventuelle forvirringer (MH og MN er omgitt av røde rektangler, henholdsvis).


For å sjekke linjer som starter med MH = og MN =, vi må bruke vanlige uttrykk. Så, hvis vi vil sjekke linjene som starter med MH = etterfulgt av noen tegn, ville vi gjøre som vist i koden under (jeg kommer til hva linje er på et øyeblikk). Legg merke til at jeg har brukt b i stedet for r for det vanlige uttrykket, siden vi bruker mønsteret på et byteobjekt og ikke en strengobjekt, så bør vi bruke et byte mønster.

importere re meshTerm = re.search (b'MH = (. +) $ ', linje)

Det samme ville gjelde for MeSH-nummeret, men denne gangen for linjer som begynner med MN =.

Kommer tilbake til linje, Dette refererer til linjene i MeSH-filen. Så vi ville gå gjennom fillinjen etter linje, på jakt etter MeSH-vilkårene og tallene. Som du kan se fra det ovennevnte MeSH-filbildet, kommer MeSH-termen foran MeSH-nummeret. Så, i vår kode, vil MeSH-nummeret alltid være nummeret som svarer til det tidligere fanget MeSH-uttrykket. Vi vil således gjøre følgende:

for linje i mesh: meshTerm = re.search (b'MH = (. +) $ ', linje) hvis meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = (. +) $ ', linje) hvis masknummer: nummer = masknummer.gruppe (1) tall [number.decode (' utf-8 ')] = term.decode (' utf-8 ') hvis termen i termen [term] + "+ number.decode ('utf-8') annet: vilkår [term] = number.decode ('utf-8')

La oss gå gjennom koden ovenfor for steg. Hvis vi ser på det vanlige uttrykket MH = (. +) $, dette er egentlig fortelle oss om å finne det bokstavelige MH = etterfulgt av minst ett tegn. (.) Betyr ethvert tegn, og + betyr at det må være ett eller flere tegn, og returnere alt til slutten av linjen ($). 

Parentesen rundt .+, det er (. +), er en fangstgruppe slik at vi kan hente resultatet. Så, for MeSH-siktet omgitt av et rødt rektangel i det ovennevnte øyeblikksbilde, vil den hentede termen være Calcomycin. Grunnen til at vi bruker if-uttalelser er at noen linjer ikke vil starte med MH = eller MN =.

For det fangede MeSH-begrepet og MeSH-nummeret oppretter vi et nytt nøkkelverdierpar for et ordbordsobjekt, som vist i denne linjen med kode: tall [str (tall)] = term.

Det er viktig å merke seg at et enkelt MeSH-uttrykk kan ha mer enn ett MeSH-nummer. Så sammenkaller vi hvert nytt MeSH-nummer med det relevante uttrykket i en streng, som vist i denne delen av koden:

hvis term i termer: vilkår [term] = vilkår [term] + "+ number.decode ('utf-8') annet: vilkår [term] = number.decode ('utf-8')

Således vil vi i dette tilfellet ha et ordbordsobjekt med nøkkelverdige par som består av et MeSH-uttrykk som nøkkel, og sammenkoblingssamlingen av alle tilsvarende MeSH-tall som verdi.

Det vi vil gjøre nå, er å oppgi de ulike nøklene (vilkårene), og ha de relevante verdiene (tallene) som er oppført under den aktuelle termen. For å oppgi de forskjellige vilkårene gjør vi følgende:

meshNumberList = [] meshTermList = terms.keys () for term i meshTermList: item_list = vilkår [term] .split (") for setning i item_list: meshNumberList.append (frase) 

Til slutt vil vi oppgi begrepet og dets relevante tall som følger:

used_items = set () for element i maskNumberList: hvis tall [element] ikke i used_items: print (tall [item], '\ n', item, file = outputFile) used_items.add (tall [element]) annet: print element, fil = outputFile)

Før vi viser utgangen av programmet, la oss sette alt sammen.

Sette alt sammen

I denne delen vil jeg vise deg hva vårt fulle Python-program som knytter MeSH-termen til tallene ser ut som:

import re terms =  numbers =  meshFile = 'd2017.bin' med åpen (meshFile, mode = "rb") som fil: mesh = file.readlines () outputFile = open ('mesh.txt', 'w ') for linje i mesh: meshTerm = re.search (b'MH = (. +) $', linje) hvis meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = ) $ ', linje) hvis masknummer: nummer = masknummer.gruppe (1) tall [nummer.dekode (' utf-8 ')] = term.decode (' utf-8 ') hvis uttrykket i termen: = vilkår [term] + "+ number.decode ('utf-8') annet: vilkår [term] = number.decode ('utf-8') meshNumberList = [] meshTermList = terms.keys () for term i meshTermList : item_list = terms [term] .split (") for setning i item_list: maskNumberList.append (setning) maskNumberList.sort () used_items = set () for element i maskNumberList: hvis tall [element] ikke i used_items: print [item], '\ n', item, file = outputFile) used_items.add (tall [element]) annet: print (item, file = outputFile)

Produksjon

Du kan laste ned produksjonen fra Dropbox (1,77 MB). Ta et utvalg av produksjonen som vist nedenfor, og vi kan se hvordan et MeSH-uttrykk (Pterygopalatin Fossa) er oppført med sine MeSH-tall som er gruppert umiddelbart under.

Pterygopalatin 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

Konklusjon

Opplæringen viste hvordan vi kan bruke forskjellige aspekter av Python (dvs. ordbøker, lister og vanlige uttrykk) sammen for å løse forskjellige problemer. Det viser også hvordan vi kan bruke Python til å jobbe med MeSH-filer for å koble deler av denne komplekse filen på en måte som gjør det lettere å forstå dets hierarki og struktur, slik vi gjorde her ved å koble MeSH-uttrykket til de relevante MeSH-nummerene.