[PYTHON] Lassen Sie uns ein RDF mithilfe der Papierinformationen von PubMed erstellen.

Viele Menschen wollten vielleicht einen schnellen Überblick geben (vorzugsweise im Zusammenhang mit vorhandenem Wissen), wenn sie zu beschäftigt sind, um die Papiere zu überprüfen, oder wenn sie etwas Neues beginnen. ..

Dieses Mal werde ich als Studie versuchen, etwas zu machen, das in einem solchen Fall mit RDF verwendet werden kann.

Über RDF

Abkürzung für Resource Description Framework. Es wird als gerichteter Graph unter Verwendung der drei Werte S (Subjekt), P (Prädikat) und O (Objekt) ausgedrückt. Es gibt auch einen Mechanismus, mit dem Sie Daten verbinden und die gewünschten Informationen durch Abfragen abrufen können.

Referenzartikel: Verschiedene Erklärungen zu RDF - Qiita [Intuitives RDF !! Teil 2 - Erstellen Sie ein benutzerfreundliches RDF und suchen Sie. - Qiita] (http://qiita.com/maoringo/items/0d48a3d967a35581cc24)

Aufbereitung von Papierdaten

Wenn Sie PubMed verwenden, das von NCBI bereitgestellt wird, können Sie die Informationen über die API abrufen, sodass ich versuchen werde, sie zu verwenden.

Es gibt vier Arten von APIs:

  1. ESearch: Gibt die Artikel-ID (PubMed ID) für das Suchwort zurück
  2. Zusammenfassung: Gibt den Titel und den Autorennamen für die Artikel-ID zurück
  3. EFetch: Gibt alle Informationen für die Artikel-ID zurück
  4. ESpell: Überprüfen Sie die Schreibweise des Suchworts

Zunächst scheint es so, als müssten Sie die Artikel-ID-Liste mit ESearch abrufen und die Details zu jeder Artikel-ID abrufen. ESpell scheint diesmal nicht benötigt zu werden.

Referenzartikel Zusammenfassung der PubMed-API

Lassen Sie uns den Papierausweis bekommen

Verwenden Sie ESearch, um die Artikel-ID abzurufen. Basierend auf dieser URL

http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=

Wenn Sie nach "term =" ein Suchwort eingeben, sollte diese ID zurückgegeben werden.

Versuchen Sie beispielsweise das Suchwort "Krebs".

http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=cancer

Wenn Sie die obige URL in Ihren Browser eingeben, wird ein solches Ergebnis angezeigt. f8abcec638e53612701c2c16d61103c4.png Sie haben die Papier-ID-Liste erhalten.

Es ist jedoch schwierig, dies jedes Mal manuell zu tun, und ich möchte unnötige Dinge löschen und nur die Artikel-ID verwenden. Also werde ich mit Python schreiben.

Umweltinformationen

  • Windows10

get_id.py


# coding: utf-8
import urllib.request

keyword = "cancer"
baseURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term="

def get_id(url):#Holen Sie sich die Artikel-ID
	result = urllib.request.urlopen(url)
	return result

def main():
	url = baseURL + keyword
	result = get_id(url)
	print(result.read())

if __name__ == "__main__":
    main()

Wenn du das machst

% python get_id.py
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE eSearchResult 
PUBLIC "-//NLM//DTD esearch20060628//EN""https://eutils.ncbi.n
lm.nih.gov/eutils/dtd/20060628/esearch.dtd"><eSearchResult><Cou
nt>3465235</Count><RetMax>20</RetMax><RetStart>0</RetStart><IdL
ist><Id>28420040</Id><Id>28420039</Id><Id>28420037</Id>
....

Ohne Zeilenumbrüche ist es schwer zu sehen, aber Sie können sehen, dass Sie dieselben Informationen erhalten können wie zuvor mit dem Browser.

Extrahieren Sie nur die Artikel-ID

XML ist im Grunde

<Element>Inhalt</Element>
<Element="Element名"Attribut="Attributwert">Inhalt</Element>

Es hat eine Struktur wie. Zum Beispiel, wenn die Artikel-ID

<Id>Papier-ID</Id>

Sie können sehen, dass es so aussieht, indem Sie sich die erfassten Informationen ansehen. Entfernen Sie unnötige Teile wie Elemente und extrahieren Sie nur die erforderliche Artikel-ID.

Es gibt eine Bibliothek namens ElementTree für den Umgang mit XML, daher werde ich sie verwenden.

get_id.py


from xml.etree.ElementTree import *

Schreiben Sie main nach dem Import wie folgt neu.

get_id.py


def main():
	url = baseURL + keyword
	result = get_id(url)
	element = fromstring(result.read())
	print(element.findtext(".//Id"))

Erstellen Sie zunächst ein Elementobjekt mit fromstring (). Das nachfolgende Element.findtext () gibt den ersten Inhalt zurück, der der Bedingung entspricht. Dieses Mal möchte ich "Id", also gebe ich es an, aber es gibt eine Regel zum Schreiben von ".// Id".

Wenn du das machst

% python get_id.py
28420040

Ich konnte nur den ersten Papierausweis extrahieren. Wenn Sie nicht nur den ersten, sondern alle übereinstimmenden Inhalte extrahieren möchten, verwenden Sie element.findall () und schreiben Sie wie folgt.

get_id.py


def main():
	url = baseURL + keyword
	result = get_id(url)
	element = fromstring(result.read())
	for e in element.findall(".//Id"):
		print(e.text)

Wenn du rennst

% python get_id.py
28420040
28420039
28420037
28420035
...

Ich konnte nur alle Papierausweise erfolgreich extrahieren.

Erstellen Sie im Hinblick auf eine zukünftige Verarbeitung eine Datei mit dem Namen "idlist_search word.txt" und speichern Sie die erfasste ID-Liste.

get_id.py


def main():
	url = baseURL + keyword
	result = get_id(url)
	element = fromstring(result.read())
	filename = "idlist_"+keyword+".txt"
	f = open(filename, "w")
	for e in element.findall(".//Id"):
		f.write(e.text)
		f.write("\n")
	f.close()

Referenzartikel So verarbeiten Sie XML mit ElementTree in Python --hikms Blog

Rufen Sie die Artikelzusammenfassung aus der Artikel-ID ab

Als nächstes erhalten wir eine Zusammenfassung unter Verwendung der erhaltenen Papier-ID. Die Basis-URL von ESummary lautet

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=

ist. Geben Sie genau wie beim Abrufen der Artikel-ID nach "id =" die Artikel-ID ein, für die Sie Informationen erhalten möchten. Geben Sie beispielsweise die erste Artikel-ID "28420040" ein, die wir zuvor erhalten haben.

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=28420040

Durch Eingabe dieser URL in den Browser können auf diese Weise Informationen zum Veröffentlichungsdatum, zum Autorennamen und zum Artikeltitel abgerufen werden. fe2324ab73ed344c3ee755869df3c06b.png

Wenn Sie hier in Python schreiben

get_summary.py


# coding: utf-8
import urllib.request
from xml.etree.ElementTree import *

keyword = "cancer"
idfile = "idlist_"+keyword+".txt"
baseURL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id="

def get_xml(url):#Holen Sie sich die Papierzusammenfassung
	result = urllib.request.urlopen(url)
	return result

def main():
	idlist = []
	f = open(idfile,"r")
	for i in f.readlines():
		idlist.append(i.strip())
	f.close()
	url = baseURL + idlist[0]
	result = get_xml(url)
	print(result.read())

if __name__ == "__main__":
    main()

Die Papier-ID hat ein Format, das aus der gespeicherten Datei gelesen werden kann. Obwohl ich es hier nicht verwendet habe, habe ich die ElementTree-Bibliothek bereits zuerst importiert, da ich sie bald verwenden werde. Wenn Sie es ausführen, sollte die Version ohne Zeilenumbrüche ausgegeben werden, wenn Sie es mit einem Browser ausführen, wie wenn Sie die Artikel-ID erhalten.

Extrahieren Sie nur den gewünschten Inhalt

Danach wird genau wie bei der Papier-ID nur der Teil des gewünschten Inhalts extrahiert. Im Gegensatz zur Artikel-ID sind Autor und Titel jedoch Attribute des Item-Elements. Daher wie im Fall der Papier-ID

for e in element.findall(".//Item"):
	    print(e.text)

Dann werden alle Papierinformationen auf diese Weise extrahiert.

% python get_summary.py
28420040
2017 Apr 18
2017 Apr 18
J Surg Oncol
None
Duan W
Liu K
Fu X
Shen X
...

Sie können dies damit verwenden, aber wir möchten auch wissen, wie Sie nur das extrahieren, was Sie möchten, z. B. Autor und Titel.

Das Elementobjekt, das durch Übergeben von XML-Text erstellt wurde, ist ein Objekt vom Typ Wörterbuch, auf das auf jedes Element zugegriffen werden kann. Hier sind einige Beispiele.

print(element[0][3].text)
print(element[0][4][2].text)
print(element[0][6].text)

Ausführungsergebnis
2017 Apr 18
Fu X
Semi-end-to-end esophagojejunostomy after laparoscopy-assisted total gastrectomy better reduces stricture and leakage than the conventional end-to-side procedure: A retrospective study.

Wenn Sie die Liste der Autoren extrahieren möchten, sieht es so aus.

for i in range(len(element[0][4])):
    print(element[0][4][i].text)

Ausführungsergebnis
Duan W
Liu K
Fu X
Shen X
...

Außerdem Elemente (Tags) und Attribute (Schlüssel) abrufen

print(element[0][4].tag)
print(element[0][4].attrib)
print(element[0][4].keys())

Ausführungsergebnis
Item
{'Name': 'AuthorList', 'Type': 'List'}
['Name', 'Type']

Sie können es so machen. Ich denke, es ist nützlich, sich zu erinnern.

Holen Sie sich das Abstract Ihrer Dissertation

Ich konnte Informationen über das Papier erhalten, aber der Titel und der Name des Autors reichen nicht aus. Ich wünschte, ich hätte Stichwörter im Zusammenhang mit dem Papier, aber es kann nicht geholfen werden. Daher werde ich EFetch verwenden, um die Zusammenfassung des Papiers zu erhalten.

Zunächst lautet die Basis-URL von EFetch

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=

Wenn Sie die im Browser angegebene Artikel-ID eingeben ff917c40f933192050fb9244e345b598.png

Es wurde in einem sehr unhandlichen Format zurückgegeben. Es scheint, dass Sie das XML-Format mit einem Parameter namens retmode angeben können.

Referenzartikel The E-utilities In-Depth: Parameters, Syntax and More - Entrez Programming Utilities Help - NCBI Bookshelf

Wenn Sie versuchen, die URL wie folgt auszuführen

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=28420040&retmode=xml

Jetzt im XML-Format! 94b3a32e62d51993b6eb30917d11f5fa.png

Bis zu diesem Punkt können Sie fast genauso schreiben wie ESearch.

get_abstract.py


# coding: utf-8
import urllib.request
from xml.etree.ElementTree import *

keyword = "cancer"
idfile = "idlist_"+keyword+".txt"
baseURL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id="

def get_xml(url):#Erhalten Sie Papierinformationen
	result = urllib.request.urlopen(url)
	return result

def main():
	idlist = []
	f = open(idfile,"r")
	for i in f.readlines():
		idlist.append(i.strip())
	f.close()
	url = baseURL + idlist[0] + "&retmode=xml"
	result = get_xml(url)
	print(result.read())#Zeigen Sie das Erfassungsergebnis so an, wie es ist

if __name__ == "__main__":
    main()

Da das Abstract des Papiers ein AbstractText-Element ist, ist es danach dasselbe wie beim Extrahieren der Papier-ID.

	element = fromstring(result.read())
	for e in element.findall(".//AbstractText"):
		print(e.text)#Zusammenfassung anzeigen

Sie sollten dazu in der Lage sein.

Als ich es versuchte, konnte ich nur die Zusammenfassung des Papiers erfolgreich extrahieren.

% python get_abstract.py
Laparoscopy-assisted total gastrectomy (LATG) has not 
gained popularity due to the technical difficulty of e
sophagojejunostomy (EJ) and the high incidence of EJ-r
elated complications. Herein, we compared two types of
 EJ for Roux-en-Y reconstruction to determine whether 
...

Wenn wir die Abstracts der auf diese Weise erhaltenen Arbeiten verarbeiten und das Wissen in RDF umwandeln können, können wir anscheinend etwas Interessantes machen. Es hat lange gedauert, bis ich die Papierinformationen erhalten habe, daher möchte ich mit dem nächsten Artikel fortfahren.

Ergänzung

Bei der Verarbeitung der einmal gespeicherten XML-Datei

element = fromstring(result.read())

Zu

tree = parse("efetch_result.xml")
element = tree.getroot()

Es ist möglich, indem Sie es durch ersetzen.

Recommended Posts

Lassen Sie uns ein RDF mithilfe der Papierinformationen von PubMed erstellen.
Erstellen wir eine REST-API mit SpringBoot + MongoDB