Arbeiten mit MeSH-Dateien in Python Verknüpfen von Begriffen und Zahlen

Dieses Tutorial zeigt, wie wir verschiedene Aspekte von Python (d. H. Wörterbücher, Listen und reguläre Ausdrücke) zusammen verwenden können, um verschiedene Probleme zu lösen. Es zeigt auch, wie wir Python verwenden können, um die Beziehungen in der MeSH-Datei zu verknüpfen, um deren Hierarchie und Struktur besser zu verstehen.

Bevor Sie mit diesem Tutorial fortfahren, fragen Sie sich vielleicht, was wir unter MeSH verstehen. Beginnen wir damit, zuerst diesen Begriff zu definieren und dann ein wenig detaillierter über seine Struktur zu sprechen.

Was ist MeSH??

MeSH ist ein Akronym für Medizinische Themenüberschriften. Es wird als kontrolliertes Vokabular der US-amerikanischen National Library of Medicine (Thesaurus) betrachtet, das der Indexierung und Katalogisierung biomedizinischer Literatur einheitliche und konsistente Eigenschaften verleiht. MeSH, ein charakteristisches Merkmal von MEDLINE, ist hierarchisch angeordnet und wird als MesH-Baumstruktur bezeichnet. Es wird jährlich aktualisiert.

MeSH ist somit eine Nomenklatur medizinischer Fachausdrücke, die von der US-amerikanischen National Library of Medicine erhältlich ist und die darauf abzielt, neues Wissen zu schaffen, indem die Beziehungen zwischen Begriffen verwendet werden, die die biomedizinische Literatur kommentieren.  

Personen, die MEDLINE / PubMed und andere Datenbanken durchsuchen, verwenden MeSH, um die Themensuche zu unterstützen. Die Indexer der National Library of Medicine (NLM) verwenden MeSH, um den Inhalt der Zeitschriftenartikel für MEDLINE zu beschreiben. Katalogisierer verwenden MeSH, um Bücher und audiovisuelle Medien im NLM und in anderen Bibliotheksbeständen zu beschreiben. So kann MeSH für zahlreiche Aufgaben verwendet werden, darunter das Indexieren, Markieren, Suchen, Abrufen, Analysieren, Codieren, Zusammenführen und Freigeben von biomedizinischem Text.

MeSH-Dateistruktur

MeSH-Deskriptoren sind in 16 Kategorien unterteilt:

  • EIN: Anatomie
  • B: Organismen 
  • C: Krankheiten
  • D: Drogen und Chemikalien
  • E: analytische, diagnostische und therapeutische Techniken und Ausrüstung
  • F: Psychiatrie und Psychologie
  • G: Phänomene und Prozesse 
  • H: Disziplinen und Berufe
  • ICH: Anthropologie, Bildung, Soziologie und soziale Phänomene
  • J: Technologie, Industrie, Landwirtschaft
  • K: Geisteswissenschaften
  • L: Informationswissenschaft
  • M: benannte Gruppen
  • N: Gesundheitsvorsorge
  • V: Publikationsmerkmale
  • Z: Geografien

Weitere Informationen zu den Kategorien finden Sie in der US-amerikanischen National Library of Medicine. Wie wir sehen können, ist jede Kategorie weiter in Unterkategorien unterteilt. Diese Struktur wird jedoch nicht als ein maßgebliches Subjektklassifizierungssystem angesehen, sondern als Anordnung von Deskriptoren für die Anleitung und Bequemlichkeit von Personen, die Subjekt-Überschriften Dokumenten zuordnen oder nach Literatur suchen. Es ist daher keine erschöpfende Klassifizierung des Themas und enthält nur die Begriffe, die für die Aufnahme in diesen Thesaurus ausgewählt wurden.

Hier finden Sie weitere Informationen zu den MeSH-Baumstrukturen:

Aufgrund der Verzweigungsstruktur der Hierarchien werden diese Listen manchmal als "Bäume" bezeichnet. Jeder MeSH-Deskriptor erscheint an mindestens einer Stelle in den Bäumen und kann an beliebig vielen zusätzlichen Stellen erscheinen. Diejenigen, die Artikel oder Katalogbücher indizieren, werden angewiesen, den spezifischsten MeSH-Deskriptor zu suchen und zu verwenden, der verfügbar ist, um jedes indizierbare Konzept darzustellen. 

Eine MeSH-Datei herunterladen

Für dieses Tutorial benötigen wir eine MeSH-Datei, um mit Python zu arbeiten. Sie finden die MeSH-Datei auf der NLM-Download-Site.

Lassen Sie uns die neueste ASCII-MeSH-Datei herunterladen. Wir können zuerst zum MeSH-FTP-Archiv gehen: ftp://nlmpubs.nlm.nih.gov/online/mesh/, und dann die Option 2017 Verzeichnis. In dem Asciimesh / Verzeichnis finden Sie drei .Behälter Dateien: c2017.bind2017.bin, und q2017.bin. Lass uns herunterladen d2017.bin. Sie können die Datei von folgender Website herunterladen: ftp://nlmpubs.nlm.nih.gov/online/mesh/2017/asciimesh/d2017.bin (27,5 MB).

Begriffe mit Zahlen verknüpfen

Lassen Sie uns in den Kern dieses Artikels einsteigen. Wir versuchen, eine MeSH-Datei zu lesen (d.h.. das .Behälter Datei, die Sie gerade heruntergeladen haben), durchsuchen Sie die Einträge, finden Sie alle MeSH-Nummern für jeden Eintrag und listen Sie die Begriffe mit den entsprechenden Nummern auf. 

Das erste, was wir normalerweise tun würden, ist das zu lesen .Behälter Datei wie folgt:

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

Beachten Sie, dass wir die verwendet haben rb Modus, was bedeutet, dass wir binär ohne Zeilenumbruchübersetzung lesen.

Wir müssen auch eine Ausgabedatei definieren, in der die Ergebnisse (Ausgabe) gespeichert werden sollen:

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

An dieser Stelle möchten wir die Zeilen überprüfen, die mit beginnen MH = (MeSH-Ausdruck) und MN = (MeSH-Nummer). Ich sollte das jetzt nicht tun, aber ich zeige Ihnen eine Momentaufnahme der MeSH-Datei, um eine Vorstellung von der Struktur zu erhalten und Verwirrungen zu beseitigen (MH und MN sind jeweils von roten Rechtecken umgeben).


Um zu überprüfen, welche Zeilen mit beginnen MH = und MN =, Wir müssen reguläre Ausdrücke verwenden. Also, wenn wir die Zeilen überprüfen wollen, die mit beginnen MH = gefolgt von beliebigen Zeichen würden wir wie im nachstehenden Code gezeigt tun (ich werde was erreichen Linie ist in einem Moment). Beachten Sie, dass ich verwendet habe b anstatt r Für den regulären Ausdruck, da wir das Muster auf ein Byte-Objekt und nicht auf ein Zeichenkettenobjekt anwenden, sollten wir ein Byte-Muster verwenden.

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

Das Gleiche gilt für die MeSH-Nummer, diesmal jedoch für Zeilen, die mit beginnen MN =.

Rückkehr zu Linie, Dies bezieht sich auf die Zeilen in der MeSH-Datei. Wir gehen also Zeile für Zeile durch die Datei und suchen nach den MeSH-Begriffen und -Zahlen. Wie Sie dem obigen Snapshot der MeSH-Datei entnehmen können, steht der Begriff MeSH vor der MeSH-Nummer. In unserem Code ist die MeSH-Nummer also immer die Nummer, die dem zuvor erfassten MeSH-Ausdruck entspricht. Wir werden also folgendes tun:

für Linie im Netz: meshTerm = re.search (b'MH = (. +) $ ', line) wenn meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = (. +) $ ', line) if meshNumber: number = meshNumber.group (1) numbers [number.decode (' utf-8 ')] = term.decode (' utf-8 '), wenn der Begriff in Begriffen ausgedrückt wird: terms [term] = terms [term] + "+ number.decode ('utf-8') else: terms [term] = number.decode ('utf-8')

Gehen wir den obigen Code Schritt für Schritt durch. Wenn wir uns den regulären Ausdruck anschauen MH = (. +) $, Das sagt uns im Grunde, das wörtliche zu finden MH = gefolgt von mindestens einem Zeichen. (.) Bedeutet ein beliebiges Zeichen und + bedeutet, dass es ein oder mehrere Zeichen sein muss und alles bis zum Ende der Zeile zurückkehren soll ($). 

Die Klammer herum .+, das ist (. +), ist eine Capture-Gruppe, mit der wir das Ergebnis abrufen können. Für den MeSH-Begriff, der in der obigen Momentaufnahme von einem roten Rechteck umgeben ist, gilt der abgerufene Begriff Calcomycin. Der Grund, warum wir if-Anweisungen verwenden, ist, dass einige Zeilen auch nicht mit beginnen MH = Noch MN =.

Für den erfassten MeSH-Begriff und die MeSH-Nummer erstellen wir ein neues Schlüsselwertpaar für ein Wörterbuchobjekt, wie in dieser Codezeile dargestellt: Zahlen [Str (Anzahl)] = Begriff.

Es ist wichtig zu beachten, dass ein einzelner MeSH-Begriff mehr als eine MeSH-Nummer haben kann. Wir verketten also jede neue MeSH-Nummer mit dem relevanten Begriff zu einer Zeichenfolge, wie in diesem Abschnitt des Codes dargestellt:

Wenn der Begriff in Begriffen ausgedrückt wird: terms [term] = terms [term] + "+ number.decode ('utf-8') else: terms [term] = number.decode ('utf-8')

In diesem Fall haben wir also ein Wörterbuchobjekt mit Schlüssel-Wert-Paaren, die aus einem MeSH-Term als Schlüssel, und die Verkettungssammlung aller entsprechenden MeSH-Nummern als Wert.

Was wir jetzt tun möchten, ist die Auflistung der verschiedenen Schlüssel (Begriffe) und die entsprechenden Werte (Zahlen) unter dem entsprechenden Begriff. Um die verschiedenen Begriffe aufzulisten, machen wir Folgendes:

meshNumberList = [] meshTermList = terms.keys () für den Begriff in meshTermList: item_list = terms [term] .split (") für den Ausdruck in item_list: meshNumberList.append (Ausdruck) 

Schließlich werden wir den Begriff und seine relevanten Nummern wie folgt aufführen:

used_items = set () für Element in meshNumberList: Wenn Zahlen [Item] nicht in Used_items enthalten sind: print (Zahlen [Item], '\ n', Element, Datei = Ausgabedatei) Used_items.add (Nummern [Element]) else: print ( Element, Datei = Ausgabedatei)

Bevor wir die Ausgabe des Programms anzeigen, lassen Sie uns alles zusammenfassen.

Alles zusammenfügen

In diesem Abschnitt zeige ich Ihnen, wie unser komplettes Python-Programm, das den MeSH-Begriff mit seinen Zahlen verknüpft, wie folgt aussieht:

import re terms =  numbers =  meshFile = 'd2017.bin' mit open (meshFile, mode = "rb") als Datei: mesh = file.readlines () outputFile = open ('mesh.txt', 'w ') für die Linie in mesh: meshTerm = re.search (b'MH = (. +) $', line) wenn meshTerm: term = meshTerm.group (1) meshNumber = re.search (b'MN = (. + ) $ ', line) if meshNumber: number = meshNumber.group (1) numbers [number.decode (' utf-8 ')] = term.decode (' utf-8 '), wenn der Begriff in Begriffen ausgedrückt wird: Begriffe [Begriff] = terms [term] + "+ number.decode ('utf-8') else: terms [term] = number.decode ('utf-8') meshNumberList = [] meshTermList = terms.keys () für den Begriff in meshTermList : item_list = terms [term] .split (") für Phrase in item_list: meshNumberList.append (Phrase) meshNumberList.sort () used_items = set () für item in meshNumberList: Wenn Zahlen [Item] nicht in Used_items: Print (Nummern) [item], '\ n', item, file = Ausgabedatei) used_items.add (Zahlen [item]) ansonsten: print (item, Datei = Ausgabedatei)

Ausgabe

Sie können die Ausgabe von Dropbox herunterladen (1,77 MB). Ein Beispiel für die Ausgabe wie unten gezeigt, können wir sehen, wie ein MeSH-Ausdruck (Pterygopalatine Fossa) wird mit seinen MeSH-Nummern aufgeführt, die unmittelbar darunter gruppiert sind.

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

Fazit

Das Tutorial zeigte, wie wir verschiedene Aspekte von Python nutzen können (d.h.. Wörterbücher, Listen und reguläre Ausdrücke) zusammen, um verschiedene Probleme zu lösen. Es zeigt auch, wie wir Python verwenden können, um mit MeSH-Dateien zu arbeiten, um einige Teile dieser komplexen Datei auf eine Weise zu verknüpfen, die das Verständnis der Hierarchie und Struktur erleichtert, wie dies hier geschehen ist, indem der MeSH-Begriff mit den entsprechenden MeSH-Nummern verknüpft wurde.