Arbeta med MeSH-filer i Python länkvillkor och nummer

Denna handledning visar hur vi kan använda olika aspekter av Python (dvs ordböcker, listor och reguljära uttryck) tillsammans för att lösa olika problem. Det visar också hur vi kan använda Python för att länka relationerna i MeSH-filen, vilket gör det lättare att förstå dess hierarki och struktur.

Innan du fortsätter med denna handledning kanske du undrar vad vi menar med MeSH. Så låt oss börja med att definiera denna term först och sedan gå in lite mer detaljerad om dess struktur.

Vad är MeSH?

MeSH är en akronym för Medical Subject Headings. Det anses vara det amerikanska nationella biblioteket för medicinens kontrollerade ordförråd (tesaurus), vilket ger enhetlighet och konsistens till indexering och katalogisering av biomedicinsk litteratur. MeSH, ett särdrag hos MEDLINE, arrangeras på hierarkiskt sätt, kallat MesH Tree Structure, och uppdateras årligen.

MeSH är således en nomenklatur av medicinska termer som är tillgängliga från U.S. National Library of Medicine, som syftar till att skapa ny kunskap genom att utnyttja relationerna mellan termer som annoterar den biomedicinska litteraturen.  

Personer som söker MEDLINE / PubMed och andra databaser använder sig av MeSH för att hjälpa till med ämnesökning. Nationella biblioteket för medicin (NLM) indexers använder MeSH för att beskriva ämnesinnehållet i journalartikel för MEDLINE. Katalogister använder MeSH för att beskriva böcker och audiovisuella medier i NLM och andra bibliotekssamlingar. Så MeSH kan användas för många uppgifter om indexering, märkning, sökning, hämtning, analys, kodning, sammanslagning och delning av biomedicinsk text.

MeSH-filstruktur

MeSH-beskrivare är organiserade i 16 kategorier:

  • EN: anatomi
  • B: organismer 
  • C: sjukdomar
  • D: droger och kemikalier
  • E: analytiska, diagnostiska och terapeutiska tekniker och utrustning
  • F: psykiatri och psykologi
  • G: fenomen och processer 
  • H: discipliner och yrken
  • JAG: antropologi, utbildning, sociologi och sociala fenomen
  • J: teknik, industri, jordbruk
  • K: humaniora
  • L: informationsvetenskap
  • M: namngivna grupper
  • N: sjukvård
  • V: publikationsegenskaper
  • Z: geographicals

Du kan hitta mer information om kategorierna från U.S. National Library of Medicine. Som vi kan se är varje kategori vidare indelad i underkategorier. Denna struktur anses emellertid inte som ett auktoritativt ämnes klassificeringssystem, utan snarare som ett arrangemang av deskriptorer för vägledning och bekvämlighet hos personer som tilldelar ämnesrubriker till handlingar eller söker litteratur. Det är således inte en uttömmande klassificering av ämnet och innehåller endast de termer som har valts för inkludering i denna tesaurus.

Här är lite mer information om MeSH Tree Structures:

På grund av hierarkiernas förgreningsstruktur kallas dessa listor ibland som "träd". Varje MeSH-deskriptor visas på minst en plats i träden och kan förekomma på så många ytterligare ställen som kan vara lämpliga. De som indexerar artiklar eller katalogböcker instrueras att hitta och använda den mest specifika MeSH-deskriptorn som är tillgänglig för att representera varje indexerbart koncept. 

Hämtar en MeSH-fil

För syftet med denna handledning behöver vi en MeSH-fil att arbeta med i Python. Du kan hitta MeSH-fil på NLM-nedladdningssidan.

Låt oss fortsätta och hämta den senaste ASCII MeSH-filen. Vi kan först gå till MeSH FTP-arkivet: ftp://nlmpubs.nlm.nih.gov/online/mesh/, och välj sedan 2017 katalogen. I asciimesh / katalog hittar du tre .bin filer: c2017.bind2017.bin, och q2017.bin. Låt oss ladda ner d2017.bin. Du kan ladda ner filen från: ftp://nlmpubs.nlm.nih.gov/online/mesh/2017/asciimesh/d2017.bin (27.5 MB).

Länka villkor till nummer

Låt oss hoppa in i kärnan i den här artikeln. Vad vi försöker göra är att läsa en MeSH-fil (d.v.s.. de .bin fil du just laddade ner), bläddra igenom posterna, hitta alla MeSH-nummer för varje post och lista villkoren tillsammans med deras relevanta nummer. 

Det första vi normalt gör är att läsa .bin fil, enligt följande:

meshFile = 'd2017.bin' med öppen (meshFile, mode = "rb") som fil: mesh = file.readlines ()

Observera att vi har använt rb läge, vilket betyder att vi läser binär utan någon översättnings översättnings.

Vi måste också definiera en utdatafil där vi skulle lagra resultaten (utdata):

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

Vid denna punkt vill vi kolla de linjer som börjar med MH = (MeSH term) och MN = (MeSH-nummer). Jag borde inte göra det nu, men visar dig en bild av MeSH-filen för att få en uppfattning om strukturen och att ta bort eventuella förvirringar (MH och MN är omgivna av röda rektanglar).


Att kontrollera linjer som börjar med MH = och MN =, vi behöver använda vanliga uttryck. Så, om vi vill kontrollera de linjer som börjar med MH = följt av några tecken, skulle vi göra som visas i koden nedan (jag kommer till vad linje är på ett ögonblick). Observera att jag har använt b istället för r för det reguljära uttrycket, eftersom vi tillämpar mönstret på ett byteobjekt och inte ett strängobjekt, så borde vi använda ett byte mönster.

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

Samma sak gäller för MeSH-numret, men den här gången för linjer som börjar med MN =.

Kommer tillbaka till linje, Detta hänvisar till linjerna i MeSH-filen. Så vi skulle gå igenom fillinjen för rad, letar efter MeSH-termerna och numren. Som du kan se från ovanstående MeSH-filbild, kommer MeSH-termen före MeSH-numret. Så, i vår kod, kommer MeSH-numret alltid att vara det nummer som motsvarar den tidigare tagit MeSH-termen. Vi gör således följande:

för linje i mask: meshTerm = re.search (b'MH = (. +) $ ', linje) om meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = (. +) $ ', line) if meshNumber: number = meshNumber.group (1) siffror [number.decode (' utf-8 ')] = term.decode (' utf-8 ') om termen i termer: termer [term] = termer [term] + "+ number.decode ('utf-8') annat: termer [term] = number.decode ('utf-8')

Låt oss gå igenom ovanstående kod steg för steg. Om vi ​​tittar på det reguljära uttrycket MH = (. +) $, Detta berättar i grund och botten oss att hitta den bokstavliga MH = följt av minst ett tecken. (.) Betyder varje tecken, och + betyder att det måste vara en eller flera tecken och returnera allt till slutet av linjen ($). 

Parentesen runt .+, det är (. +), är en fångstgrupp så att vi kan hämta resultatet. Så, för MeSH-termen omgiven av en röd rektangel i ovanstående ögonblicksbild, kommer den hämtade termen att vara Calcomycin. Anledningen till att vi använder if-uttalanden är att vissa linjer inte kommer att börja med MH = inte heller MN =.

För det fångade MeSH-termen och MeSH-numret skapar vi en ny nyckelvärdespar för ett ordlighetsobjekt, vilket visas i denna kodrad: siffror [str (nummer)] = term.

Det är viktigt att notera att en enda MeSH-term kan ha mer än ett MeSH-nummer. Så vi sammanfogar varje nytt MeSH-nummer med relevant term i en sträng, som visas i denna del av koden:

om termen i termer: termer [term] = termer [term] + "+ number.decode ('utf-8') annat: termer [term] = number.decode ('utf-8')

Således kommer vi att ha ett ordbordsobjekt med nyckelvärdespar som består av en MeSH-term som nyckel-, och sammanlänkningsuppsamlingen av alla motsvarande MeSH-nummer som värde.

Vad vi vill göra nu är att lista de olika nycklarna (termerna) och ha de relevanta värdena (nummer) som anges under den relevanta termen. För att lista de olika termerna gör vi följande:

meshNumberList = [] meshTermList = terms.keys () för term i meshTermList: item_list = termer [term] .split (") för fras i item_list: meshNumberList.append (fras) 

Slutligen kommer vi att lista termen och dess relevanta nummer enligt följande:

used_items = set () för objekt i maskNumberList: om siffror [item] not in used_items: print (siffror [item], '\ n', item, file = outputFile) used_items.add objekt, fil = outputFile)

Innan vi visar programmets utmatning, låt oss sätta allt ihop.

Få alltid att falla på plats

I det här avsnittet kommer jag att visa dig hur vårt fulla Python-program som länkar MeSH-termen till dess nummer ser ut som:

importreferenser =  numbers =  meshFile = 'd2017.bin' med öppna (meshFile, mode = "rb") som fil: mesh = file.readlines () outputFile = open ('mesh.txt', 'w ') för linje i mask: meshTerm = re.search (b'MH = (. +) $', linje) om meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = ) $ ', line) om meshNumber: number = meshNumber.group (1) nummer [number.decode (' utf-8 ')] = term.decode (' utf-8 ') om termen i termer: termer [term] = villkor [term] + "+ number.decode ('utf-8') annat: villkor [term] = number.decode ('utf-8') meshNumberList = [] meshTermList = terms.keys () för term i meshTermList : item_list = terms [term] .split (") för fras i item_list: meshNumberList.append (fras) meshNumberList.sort () used_items = set () för objekt i maskNumberList: om siffror [item] not in used_items: print [item], '\ n', item, file = outputFile) used_items.add (nummer [item]) annars: print (item, file = outputFile)

Produktion

Du kan ladda ner utmatningen från Dropbox (1,77 MB). Med ett urval av produktionen enligt nedan kan vi se hur en MeSH-term (Pterygopalatin Fossa) är listad med sina MeSH-nummer som är grupperade omedelbart 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

Slutsats

Handledningen visade hur vi kan använda olika aspekter av Python (d.v.s.. ordböcker, listor och regelbundna uttryck) tillsammans för att lösa olika problem. Det visar också hur vi kan använda Python för att arbeta med MeSH-filer för att länka vissa delar av den här komplexa filen på ett sätt som gör det lättare att förstå dess hierarki och struktur, som vi gjorde här genom att länka MeSH-termen till dess relevanta MeSH-nummer.