Werken met MeSH-bestanden in Python voorwaarden en nummers koppelen

Deze tutorial laat zien hoe we verschillende aspecten van Python (zoals woordenboeken, lijsten en reguliere expressies) samen kunnen gebruiken om verschillende problemen op te lossen. Het laat ook zien hoe we Python kunnen gebruiken om de relaties in het MeSH-bestand te koppelen, waardoor het makkelijker wordt om de hiërarchie en structuur ervan te begrijpen.

Voordat je verder gaat met deze tutorial, vraag je je wellicht af wat we met MeSH bedoelen. Dus laten we beginnen met het eerst definiëren van deze term, en dan in iets meer detail ingaan op de structuur ervan.

Wat is MeSH?

MeSH is een acroniem voor Medische Onderwerp Koppen. Het wordt beschouwd als het gecontroleerde vocabulaire van de U.S. National Library of Medicine (thesaurus), dat uniformiteit en consistentie biedt voor het indexeren en catalogiseren van biomedische literatuur. MeSH, een onderscheidend kenmerk van MEDLINE, is gerangschikt op een hiërarchische manier, de MesH Boomstructuur, en wordt jaarlijks bijgewerkt.

MeSH is dus een terminologie van medische termen verkrijgbaar bij de U.S. National Library of Medicine, die tot doel heeft nieuwe kennis te creëren door gebruik te maken van de relaties tussen termen die de biomedische literatuur annoteren..  

Mensen die zoeken in MEDLINE / PubMed en andere databases maken gebruik van MeSH om te helpen bij het zoeken naar onderwerpen. De indexeerders van de National Library of Medicine (NLM) gebruiken MeSH om de inhoud van tijdschriftartikelen voor MEDLINE te beschrijven. Catalogi gebruiken MeSH om boeken en audiovisuals in de NLM en andere bibliotheekcollecties te beschrijven. Dus MeSH kan worden gebruikt voor tal van taken met betrekking tot het indexeren, labelen, zoeken, ophalen, analyseren, coderen, samenvoegen en delen van biomedische tekst.

MeSH-bestandsstructuur

MeSH-descriptors zijn onderverdeeld in 16 categorieën:

  • EEN: anatomie
  • B: organismen 
  • C: ziekten
  • D: drugs en chemicaliën
  • E: analytische, diagnostische en therapeutische technieken en apparatuur
  • F: psychiatrie en psychologie
  • G: verschijnselen en processen 
  • H: disciplines en beroepen
  • IK: antropologie, onderwijs, sociologie en sociale verschijnselen
  • J: technologie, industrie, landbouw
  • K: geesteswetenschappen
  • L: informatie wetenschap
  • M: benoemde groepen
  • N: gezondheidszorg
  • V: publicatiekarakteristieken
  • Z: geographicals

U kunt meer informatie over de categorieën vinden in de Amerikaanse National Library of Medicine. Zoals we kunnen zien, is elke categorie verder onderverdeeld in subcategorieën. Deze structuur wordt echter niet beschouwd als een gezaghebbend subjectclassificatiesysteem, maar eerder als een rangschikking van descriptoren voor de begeleiding en het gemak van mensen die onderwerpkopjes aan documenten toewijzen of literatuur zoeken. Het is dus geen uitputtende classificatie van het onderwerp en bevat alleen de termen die zijn geselecteerd voor opname in deze thesaurus.

Hier is wat meer informatie over de MeSH Tree Structures:

Vanwege de vertakkingsstructuur van de hiërarchieën worden deze lijsten soms "bomen" genoemd. Elke MeSH-descriptor verschijnt op ten minste één plaats in de bomen en kan op zoveel mogelijk plaatsen verschijnen. Degenen die artikelen of catalogusboeken indexeren, krijgen de opdracht om de meest specifieke MeSH-descriptor te vinden en te gebruiken die beschikbaar is om elk indexeerbaar concept te vertegenwoordigen. 

Een MeSH-bestand downloaden

Voor deze tutorial hebben we een MeSH-bestand nodig om mee te werken in Python. Je kunt het MeSH-bestand vinden op de NLM-downloadsite.

Laten we doorgaan en het nieuwste ASCII MeSH-bestand downloaden. We kunnen eerst naar het MeSH FTP-archief gaan: ftp://nlmpubs.nlm.nih.gov/online/mesh/, en vervolgens de 2017 directory. In de asciimesh / map, je zult er drie vinden .bak bestanden: c2017.bind2017.bin, en q2017.bin. Laten we downloaden d2017.bin. Je kunt het bestand downloaden van: ftp://nlmpubs.nlm.nih.gov/online/mesh/2017/asciimesh/d2017.bin (27,5 MB).

Koppelingsvoorwaarden aan nummers

Laten we in de kern van dit artikel springen. Wat we proberen te doen is een MeSH-bestand lezen (d.w.z. de .bak bestand dat u zojuist hebt gedownload), blader door de vermeldingen, vind alle MeSH-nummers voor elk item en vermeld de voorwaarden samen met hun relevante nummers. 

Het eerste dat we normaal zouden doen, is het lezen van de .bak bestand, als volgt:

meshFile = 'd2017.bin' met open (meshFile, mode = "rb") als bestand: mesh = file.readlines ()

Merk op dat we de rb modus, wat betekent dat we binair lezen zonder vertaling van de regelafbreking.

We moeten ook een uitvoerbestand definiëren waar we de resultaten (output) zouden opslaan:

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

Op dit punt willen we de regels controleren die beginnen MH = (MeSH-term) en MN = (MeSH-nummer). Ik zou dit nu niet moeten doen, maar zal u een momentopname van het MeSH-bestand laten zien om een ​​idee te hebben van de structuur en om eventuele verwarring weg te nemen (MH en MN zijn omgeven door rode rechthoeken, respectievelijk).


Om regels te controleren die beginnen MH = en MN =, we moeten reguliere expressies gebruiken. Dus, als we de regels willen zien die beginnen MH = gevolgd door willekeurige tekens, zouden we doen zoals aangegeven in de onderstaande code (ik zal wat krijgen lijn is in een ogenblik). Merk op dat ik heb gebruikt b in plaats van r voor de reguliere expressie, omdat we het patroon toepassen op een byte-object en niet op een string-object, dus we moeten een bytepatroon gebruiken.

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

Hetzelfde zou gelden voor het MeSH-nummer, maar dit keer voor regels die beginnen met MN =.

Terugkomend op lijn, dit verwijst naar de regels in het MeSH-bestand. Dus zouden we regel voor regel door het bestand lopen, op zoek naar de MeSH-termen en -nummers. Zoals je kunt zien aan de hand van de bovenstaande momentopname van MeSH, komt de MeSH-term voor het MeSH-nummer. In onze code is het MeSH-nummer dus altijd het nummer dat overeenkomt met de eerder vastgelegde MeSH-term. We zullen dus het volgende doen:

voor regel in mesh: meshTerm = re.search (b'MH = (. +) $ ', regel) als meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = (. +) $ ', regel) als meshNumber: number = meshNumber.group (1) numbers [number.decode (' utf-8 ')] = term.decode (' utf-8 ') als term in termen: terms [term] = terms [term] + "+ number.decode ('utf-8') else: terms [term] = number.decode ('utf-8')

Laten we de bovenstaande code stap voor stap doorlopen. Als we kijken naar de reguliere expressie MH = (. +) $, dit vertelt ons in feite om het letterlijke te vinden MH = gevolgd door minstens één karakter. (.) Betekent elk teken, en + betekent dat het een of meer tekens moet zijn en dat alles naar het einde van de regel moet worden teruggestuurd ($). 

De haakjes rond .+, dat is (. +), is een capture-groep, zodat we het resultaat kunnen ophalen. Dus voor de MeSH-term omgeven door een rode rechthoek in de bovenstaande momentopname, zal de opgehaalde term zijn Calcomycin. De reden dat we if-statements gebruiken, is dat sommige regels niet mee beginnen MH = noch MN =.

Voor de vastgelegde MeSH-term en het MeSH-nummer maken we een nieuw sleutel / waarde-paar voor een woordenboekobject, zoals weergegeven in deze regel code: getallen [str (getal)] = term.

Het is belangrijk op te merken dat een enkele MeSH-term meer dan één MeSH-nummer kan hebben. We koppelen dus elk nieuw MeSH-nummer met de relevante term in een tekenreeks, zoals weergegeven in dit gedeelte van de code:

if term in terms: terms [term] = terms [term] + "+ number.decode ('utf-8') anders: terms [term] = number.decode ('utf-8')

Dus in dit geval hebben we een woordenboekobject met sleutel / waarde-paren die bestaan ​​uit een MeSH-term als de sleutel, en de concatenatie verzameling van alle overeenkomstige MeSH nummers als de waarde.

Wat we nu willen doen, is een lijst maken van de verschillende sleutels (termen) en de relevante waarden (nummers) laten weergeven onder de relevante term. Om de verschillende termen te vermelden, doen we het volgende:

meshNumberList = [] meshTermList = terms.keys () voor term in meshTermList: item_list = terms [term] .split (") voor phrase in item_list: meshNumberList.append (phrase) 

Ten slotte zullen we de term en de relevante nummers als volgt vermelden:

used_items = set () voor item in meshNumberList: als nummers [item] niet in used_items: print (nummers [item], '\ n', item, file = outputFile) used_items.add (nummers [item]) else: print ( item, bestand = outputFile)

Voordat we de uitvoer van het programma tonen, laten we het allemaal samenvoegen.

Alles samenvoegen

In deze sectie zal ik je laten zien wat ons volledige Python-programma dat de MeSH-term met zijn getallen verbindt eruit ziet als:

importeer termen =  nummers =  meshFile = 'd2017.bin' met open (meshFile, mode = "rb") als bestand: mesh = file.readlines () outputFile = open ('mesh.txt', 'w ') voor regel in mesh: meshTerm = re.search (b'MH = (. +) $', regel) als meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = (. + ) $ ', regel) als meshNumber: number = meshNumber.group (1) numbers [number.decode (' utf-8 ')] = term.decode (' utf-8 ') als term in termen: terms [term] = terms [term] + "+ number.decode ('utf-8') else: terms [term] = number.decode ('utf-8') meshNumberList = [] meshTermList = terms.keys () voor term in meshTermList : item_list = terms [term] .split (") voor phrase in item_list: meshNumberList.append (phrase) meshNumberList.sort () used_items = set () voor item in meshNumberList: if numbers [item] not in used_items: print (numbers [item], '\ n', item, file = outputFile) used_items.add (nummers [item]) else: print (item, file = outputFile)

uitgang

Je kunt de uitvoer downloaden van Dropbox (1,77 MB). Door een voorbeeld van de uitvoer te nemen zoals hieronder getoond, kunnen we zien hoe een MeSH-term (Pterygopalatine Fossa) wordt vermeld met zijn MeSH-nummers die direct eronder zijn gegroepeerd.

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

Conclusie

De tutorial liet zien hoe we verschillende aspecten van Python kunnen gebruiken (d.w.z. woordenboeken, lijsten en reguliere expressies) samen om verschillende problemen op te lossen. Het laat ook zien hoe we Python kunnen gebruiken om met MeSH-bestanden te werken om sommige delen van dit complexe bestand te koppelen op een manier die het gemakkelijker maakt om de hiërarchie en structuur ervan te begrijpen, zoals we hier deden door de MeSH-term te koppelen aan de relevante MeSH-nummers.