Verarbeiten Sie Pubmed .xml-Daten mit Python

Einführung

Dieser Artikel ist eine persönliche Anmerkung zur Verwendung von Python zum Lesen der Literaturdaten (XML-Format), die bei einer Suche in Pubmed erfasst wurden.

Ich würde mich freuen, wenn Sie auf Punkte hinweisen könnten, die Ihnen aufgefallen sind.

Daten, die Sie verarbeiten möchten

Ein Datenelement sieht wie folgt aus. Eigentlich möchte ich mehrere Daten verarbeiten, aber zuerst werde ich es möglich machen, eine nach der anderen zu verarbeiten.

001.xml


<PubmedArticle>
    <MedlineCitation Status="Publisher" Owner="NLM">
        <PMID Version="1">12345678</PMID>
        <DateRevised>
            <Year>2020</Year>
            <Month>03</Month>
            <Day>27</Day>
        </DateRevised>
        <Article PubModel="Print-Electronic">
            <Journal>
                <ISSN IssnType="Electronic">1873-3700</ISSN>
                <JournalIssue CitedMedium="Internet">
                    <PubDate>
                        <Year>2020</Year>
                        <Month>Mar</Month>
                    </PubDate>
                </JournalIssue>
                <Title>Journal of XXX</Title>
            </Journal>
            <ArticleTitle>Identification of XXX.</ArticleTitle>
            <AuthorList CompleteYN="Y">
                <Author ValidYN="Y">
                    <LastName>Sendai</LastName>
                    <ForeName>Shiro</ForeName>
                    <Initials>S</Initials>
                    <AffiliationInfo>
                        <Affiliation>Sendai, Japan.</Affiliation>
                    </AffiliationInfo>
                </Author>
                <Author ValidYN="Y">
                    <LastName>Tohoku</LastName>
                    <ForeName>Taro</ForeName>
                    <Initials>T</Initials>
                    <AffiliationInfo>
                        <Affiliation>Miyagi, Japan.</Affiliation>
                    </AffiliationInfo>
                </Author>
            </AuthorList>
            <Language>eng</Language>
            <PublicationTypeList>
                <PublicationType UI="D016428">Journal Article</PublicationType>
            </PublicationTypeList>
            <ArticleDate DateType="Electronic">
                <Year>2020</Year>
                <Month>03</Month>
                <Day>23</Day>
            </ArticleDate>
        </Article>
        <CitationSubset>IM</CitationSubset>
    </MedlineCitation>
    <PubmedData>
        <PublicationStatus>aheadofprint</PublicationStatus>
        <ArticleIdList>
            <ArticleId IdType="pubmed">32213359</ArticleId>
            <ArticleId IdType="pii">S0031-9422(19)30971-9</ArticleId>
            <ArticleId IdType="doi">10.1016/j.phytochem.2020.112349</ArticleId>
        </ArticleIdList>
    </PubmedData>
</PubmedArticle>

Grundlegende Verwendung verstehen

Laden Sie die Bibliothek zum Lesen von XML.

001.py


import xml.etree.ElementTree as ET

Lesen Sie XML-Daten aus der Datei. Es scheint, dass mehrere Daten mit zwei Zeilenumbrüchen ausgerichtet sind. Teilen Sie sie daher in eine Liste auf.

002.py


test_data = open("./xxxx/pubmed.xml", "r")
contents = test_data.read()
records = contents.split('\n\n')

Die ersten Dokumentdaten (Datensätze [0]) werden von ET.fromstring () gelesen und im Variablenstamm gespeichert. Wenn Sie root mit type () betrachten, werden Sie feststellen, dass es sich um ein Element-Objekt handelt.

003.py


root = ET.fromstring(records[0])
type(root)
#<class 'xml.etree.ElementTree.Element'>

Sie können das Tag mit root.tag überprüfen. Ich werde es prüfen.

004.py


root.tag
#'PubmedArticle'

Grob gesagt haben Daten die folgende Form. Ich konnte mit root.tag auf das äußerste Tag zugreifen.

002.xml


<PubmedArticle>
    <MedlineCitation>
    </MedlineCitation>
    <PubmedData>
    </PubmedData>
</PubmedArticle>

In \ <PubmedArticle > befinden sich zwei Elemente (MedlineCitation und PubmedData), auf die über Indizes zugegriffen werden kann. Greifen Sie mit Indizes zu und suchen Sie den Typ weiter.

005.py


root[0]
#<Element 'MedlineCitation' at 0x10a9d5b38>
type(root[0])
#<class 'xml.etree.ElementTree.Element'>

root[1]
#<Element 'PubmedData' at 0x10aa78868>
type(root[1])
#<class 'xml.etree.ElementTree.Element'>

Sie können sehen, dass beide Elementobjekte sind.

Kurz gesagt, es scheint, dass alle Knoten Elementobjekte sind. Elementobjekte können iteriert und untergeordnete Knoten einzeln abgerufen und verarbeitet werden.

for i in root:
    print(i.tag)

Element-Tags können in .tag nachgeschlagen werden, und .attrib kann die Attribute und Attributwerte nachschlagen, die diesem Tag zugeordnet sind.

root[0].tag
#'MedlineCitation'

root[0].attrib
#{'Status': 'Publisher', 'Owner': 'NLM'}
# root[0]Das Tag um ist wie folgt.
#    <MedlineCitation Status="Publisher" Owner="NLM">


type(root[0].attrib)
#<class 'dict'> #Wörterbuchklasse

So greifen Sie auf das Element-Objekt zu

Es werden wahrscheinlich drei sein. In jedem Fall können Sie ein oder mehrere Tags angeben. Schließen Sie das gesamte Tag in Anführungszeichen ein. Trennen Sie die Tags bei der Angabe mehrerer Tags durch einen Schrägstrich.

  1. find('tag1/tag2')
  2. findall('tag1/tag2')
  3. iter('tag1/tag2')

Wenn es 1 ist, wird das Element-Objekt zurückgegeben, wenn es 2 ist, wird die Liste der Element-Objekte zurückgegeben, und wenn es 3 ist, ist es ein Objekt für die Iteration? Wird zurückgegeben. Ich werde es prüfen.

root.find('MedlineCitation/DateRevised/Year')
#<Element 'Year' at 0x10a9f8ae8>

root.findall('MedlineCitation')
#[<Element 'MedlineCitation' at 0x10a9d5b38>]

root.iter('Author')
#<_elementtree._element_iterator object at 0x10aa65990>

#Lassen Sie uns mit der for-Anweisung iterieren.
for i in root.iter('Author'):
    print(i)
#<Element 'Author' at 0x10aa6e9f8>
#<Element 'Author' at 0x10aa6ec28>

Es scheint, dass findall () nur die untergeordneten Knoten des Element-Objekts und iter () alle untergeordneten Knoten, Enkelknoten, Urenkelknoten ... des Element-Objekts betrachtet.

Zugriff auf den Wert des Element-Objekts

Das Element-Objekt hat zwei Werte. Attributwert und Textdaten. Attributwerte können mit .get ('* Eigenschaftsname ') für Elementobjekte abgerufen werden. Alternativ scheint .attrib [' Eigenschaftsname *'] in Ordnung zu sein.

#.get()Oder
root.find('MedlineCitation').get('Status')
#'Publisher'

#.attrib()Oder
root.find('MedlineCitation').attrib['Status']
#'Publisher'

Sie können Textdaten auch abrufen, indem Sie .text für das Element-Objekt verwenden.

Die Textdaten hier sind der Teil, der im folgenden Beispiel von Tags 2020 umgeben ist. <Year>2020</Year>

Versuchen Sie, den Wert zu ermitteln, indem Sie mit find () den Pfad zum Element-Objekt angeben.

root.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/Year').text
#'2020'

Um Informationen über mehrere Autoren zu erhalten, durchlaufen Sie die mit findall () erhaltene Liste.

Korrigiert unter Berücksichtigung mehrerer Autorenzugehörigkeiten (31. März 2020).

for x in root.findall('MedlineCitation/Article/AuthorList/Author'):
    x.find('LastName').text   #Nachname des Autors
    x.find('ForeName').text    #Name des Autors
    for y in x.findall('AffiliationInfo'):
        y.find('Affiliation').text

Die doi (Dokumentkennung) ist im Tag ELocationID beschrieben, aber das Tag ELocationID hat einige Attributwerte, und im Fall von EIdType = "doi" müssen die Textdaten abgerufen werden.

for x in root.findall('MedlineCitation/Article/ELocationID'):
    if(x.get('EIdType') == 'doi'):
        x.text

Es muss unterschieden werden, ob es sich bei dem Datensatz um eine Rezension oder einen Zeitschriftenartikel handelt, der im Publikationstyp beschrieben ist. Es gibt jedoch normalerweise mehrere Veröffentlichungstypen, und wenn einer von ihnen den Wert "Überprüfung" hat, scheint es sich um "Überprüfung" zu handeln.

Wenn Sie sich beispielsweise den Überprüfungsdatensatz ansehen, sieht er folgendermaßen aus:

.xml


<PublicationTypeList>
    <PublicationType UI="D016428">Journal Article</PublicationType>
    <PublicationType UI="D016454">Review</PublicationType>
    <PublicationType UI="D013485">Research Support, Non-U.S. Gov't</PublicationType>
</PublicationTypeList>

Also, ob es sich um eine Bewertung handelt oder nicht

isReview = False
for x in root.findall('MedlineCitation/Article/PublicationTypeList'):
    if (x.text == 'Review'):
        isReview = TRUE

Ich finde es gut, das zu tun.

Um das oben Gesagte zusammenzufassen, einschließlich anderer Informationen, die Sie möglicherweise erhalten möchten

import xml.etree.ElementTree as ET

test_data = open("./pubmed.xml", "r")
contents = test_data.read()
records = contents.split('\n\n')
root = ET.fromstring(records[0])#Vorerst nur der erste Fall.

#Informationen zum Autor
for x in root.findall('MedlineCitation/Article/AuthorList/Author'):
    x.find('LastName').text   #Nachname des Autors
    x.find('ForeName').text    #Name des Autors
    for y in x.findall('AffiliationInfo'):
        y.find('Affiliation').text#Fest.

#Beurteilung, ob es sich um eine Überprüfung handelt
isReview = False
for x in root.findall('MedlineCitation/Article/PublicationTypeList'):
    if (x.text == 'Review'):
        isReview = TRUE

# doi
for x in root.findall('MedlineCitation/Article/ELocationID'):
    if(x.get('EIdType') == 'doi'):
        x.text

#PMID
root.find('MedlineCitation/PMID').text
#Papiertitel
root.find('MedlineCitation/Article/ArticleTitle').text
#Journalname
root.find('MedlineCitation/Article/Journal/Title').text
#Veröffentlichungsjahr
root.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/Year').text
#Erscheinungsmonat
root.find('MedlineCitation/Article/Journal/JournalIssue/PubDate/Month').text
#Sprache
root.find('MedlineCitation/Article/Language').text

Ich denke, es sollte getan werden. Im obigen Code gibt es nur einen Prozess:

for record in records:
    root = ET.fromstring(record)
    #Beschreiben Sie den Prozess

Sie sollten es als tun.

Wenn Sie nun über XML-Daten verfügen, können Sie die erforderlichen Informationen sofort extrahieren. Alles, was Sie tun müssen, ist darüber nachzudenken, wie Sie es gestalten können.

Jetzt wissen Sie, wie Sie mit XML-Daten umgehen.

Recommended Posts

Verarbeiten Sie Pubmed .xml-Daten mit Python
Verarbeiten Sie Pubmed .xml-Daten mit Python [Teil 2]
Verarbeiten Sie Feedly-XML mit Python.
Verarbeiten Sie Big Data mit Dataflow (ApacheBeam) + Python3
Datenanalyse mit Python 2
Datenanalyse mit Python
Mit Python erstellte Beispieldaten
Generieren Sie XML (RSS) mit Python
Holen Sie sich Youtube-Daten mit Python
Lesen von JSON-Daten mit Python
Verarbeiten Sie CSV-Daten mit Python (Zählverarbeitung mit Pandas)
[Python] Mit DataReader Wirtschaftsdaten abrufen
Visualisieren Sie Ihre Daten ganz einfach mit Python Seaborn.
Datenanalyse beginnend mit Python (Datenvisualisierung 1)
Datenanalyse beginnend mit Python (Datenvisualisierung 2)
Anwendung von Python: Datenbereinigung Teil 2: Datenbereinigung mit DataFrame
Holen Sie sich mit Python zusätzliche Daten zu LDAP
Datenpipeline-Aufbau mit Python und Luigi
Empfangen Sie Textdaten von MySQL mit Python
[Hinweis] Mit Python Daten von PostgreSQL abrufen
Versuchen Sie, mit Binärdaten in Python zu arbeiten
Generieren Sie japanische Testdaten mit Python faker
Konvertieren Sie Excel-Daten mit Python in JSON
Laden Sie japanische Aktienkursdaten mit Python herunter
Verarbeiten Sie mehrere Listen mit for in Python
Empfehlung von Altair! Datenvisualisierung mit Python
Datenanalyse beginnend mit Python (Datenvorverarbeitung - maschinelles Lernen)
Lassen Sie uns MySQL-Daten mit Python bearbeiten
Organisieren Sie mit Python nach Ordnern getrennte Daten
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Datenanalyse Python
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
[Python] Daten lesen
Mikrocomputer mit Python
Mit Python besetzen
Erstellen Sie solche Testdaten mit Python (Teil 1)
Lesen Sie Python-CSV-Daten mit Pandas ⇒ Graph mit Matplotlib
Lesen Sie Tabellendaten in einer PDF-Datei mit Python
Holen Sie sich Aktienkursdaten mit Quandl API [Python]
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Eine Geschichte über den Umgang mit Binärdaten in Python
Vergleichen Sie die XML-Parsing-Geschwindigkeiten mit Python und Go
Schreiben Sie CSV-Daten mit AWS-Lambda + Python in AWS-S3
Ich habe mit der maschinellen Vorverarbeitung von Python Data begonnen
Extrahieren Sie mit Python Daten von einer Webseite
Serielle Kommunikation mit Python