[PYTHON] Créons un RDF en utilisant les informations papier de PubMed - L'acquisition d'informations papier -

Je pense que beaucoup de gens ont voulu donner un aperçu rapide (de préférence en relation avec les connaissances existantes) lorsqu'ils sont trop occupés pour vérifier les papiers ou lorsqu'ils commencent quelque chose de nouveau. ..

Cette fois, à titre d'étude, je vais essayer de faire quelque chose qui puisse être utilisé dans un tel cas en utilisant RDF.

À propos de RDF

Abréviation de Resource Description Framework. Il est exprimé sous la forme d'un graphe orienté utilisant trois valeurs, S (Sujet), P (Prédicat) et O (Objet). Il existe également un mécanisme qui vous permet de connecter des données et de récupérer les informations que vous souhaitez connaître en les interrogeant.

Article de référence: Explications diverses sur RDF --Qiita [RDF intuitif !! Partie 2 - Créez un RDF facile à utiliser et recherchez. --Qiita] (http://qiita.com/maoringo/items/0d48a3d967a35581cc24)

Préparation des données papier

Si vous utilisez PubMed fourni par NCBI, vous pouvez obtenir les informations par API, je vais donc essayer de l'utiliser.

Il existe quatre types d'API fournis:

  1. ESearch: renvoie l'ID d'article (PubMed ID) du mot recherché
  2. ESummary: renvoie le titre et le nom de l'auteur de l'ID d'article.
  3. EFetch: renvoie toutes les informations relatives à l'ID d'article
  4. ESpell: vérifiez l'orthographe du mot recherché

Tout d'abord, il semble que vous deviez obtenir la liste des ID d'article avec ESearch et obtenir les détails sur chaque ID d'article. ESpell ne semble pas nécessaire cette fois.

Article de référence Résumé de l'API PubMed

Obtenons l'ID papier

Utilisez ESearch pour obtenir l'ID d'article. Basé sur cette URL

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

Si vous entrez un mot-clé de recherche après "term =", cet ID doit être renvoyé.

Par exemple, essayez le mot-clé de recherche: "cancer".

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

Si vous entrez l'URL ci-dessus dans votre navigateur, vous verrez un résultat comme celui-ci. f8abcec638e53612701c2c16d61103c4.png Vous avez obtenu la liste d'identité papier.

Cependant, il est difficile de le faire manuellement à chaque fois, et je veux effacer les choses inutiles et utiliser uniquement l'ID d'article. Je vais donc écrire en utilisant python.

Informations environnementales

  • 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):#Obtenez l'ID d'article
	result = urllib.request.urlopen(url)
	return result

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

if __name__ == "__main__":
    main()

Quand tu fais ça

% 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>
....

C'est difficile à voir sans sauts de ligne, mais vous pouvez voir que vous pouvez obtenir les mêmes informations que vous l'avez fait avec le navigateur plus tôt.

Extraire uniquement l'ID d'article

XML est fondamentalement

<élément>Contenu</élément>
<élément="élément名"attribut="Valeur d'attribut">Contenu</élément>

Il a une structure comme. Par exemple, si l'ID d'article

<Id>ID papier</Id>

Vous pouvez voir que cela ressemble à ceci en regardant les informations acquises. Supprimez les parties inutiles telles que les éléments et extrayez uniquement l'ID d'article requis.

Il existe une bibliothèque appelée ElementTree pour gérer XML, je vais donc l'utiliser.

get_id.py


from xml.etree.ElementTree import *

Après l'importation, réécrivez main comme suit.

get_id.py


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

Tout d'abord, créez un objet Element avec fromstring (). L'élément suivant.findtext () retournera le premier contenu qui correspond à la condition. Cette fois je veux "Id", donc je le spécifie, mais il y a une règle pour écrire ".// Id".

Quand tu fais ça

% python get_id.py
28420040

Je n'ai pu extraire que la première pièce d'identité papier. Si vous voulez extraire non seulement le premier mais tout le contenu correspondant, utilisez element.findall () et écrivez comme suit.

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)

Quand tu cours

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

J'ai réussi à extraire uniquement toutes les pièces d'identité papier.

En considérant le traitement futur, créez un fichier appelé "idlist_search word.txt" et enregistrez la liste d'identifiants acquise.

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()

Article de référence Comment traiter XML en utilisant ElementTree en Python - le blog dehikm

Obtenir le résumé de l'article à partir de l'ID d'article

Ensuite, obtenons un résumé en utilisant l'ID papier obtenu. L'URL de base de ESummary est

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

est. Tout comme lorsque vous obtenez l'ID d'article, saisissez l'ID d'article que vous souhaitez obtenir après "id =". Par exemple, entrons le premier ID d'article "28420040" que nous avons obtenu précédemment.

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

En entrant cette URL dans le navigateur, des informations sur la date de publication, le nom de l'auteur et le titre de l'article peuvent être obtenues de cette manière. fe2324ab73ed344c3ee755869df3c06b.png

Si vous écrivez ici en Python

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):#Obtenez le résumé papier
	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()

L'ID papier est dans un format qui peut être lu à partir du fichier enregistré. De plus, même si je ne l'ai pas utilisé ici, j'ai déjà importé la bibliothèque ElementTree en premier car je vais l'utiliser bientôt. Lorsque vous l'exécutez, la version sans saut de ligne doit être sortie lorsque vous l'exécutez avec un navigateur, comme lorsque vous obtenez l'ID d'article.

Extrayez uniquement le contenu que vous souhaitez

Après cela, tout comme dans le cas de l'ID papier, seule la partie du contenu souhaité est extraite. Cependant, contrairement à l'ID d'article, l'auteur et le titre sont des attributs de l'élément Item. Par conséquent, comme dans le cas de l'ID papier

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

Ensuite, toutes les informations papier seront extraites de cette manière.

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

Vous pouvez l'utiliser avec cela, mais savons également comment extraire uniquement ce que vous voulez, comme l'auteur et le titre.

L'objet Element créé en passant du texte XML est un objet de type dictionnaire, et chaque élément est accessible. Voici quelques exemples.

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

Résultat d'exécution
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.

Si vous souhaitez extraire la liste des auteurs, cela ressemble à ceci.

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

Résultat d'exécution
Duan W
Liu K
Fu X
Shen X
...

Aussi, obtenir des éléments (balises) et des attributs (clés)

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

Résultat d'exécution
Item
{'Name': 'AuthorList', 'Type': 'List'}
['Name', 'Type']

Vous pouvez le faire comme ça. Je pense qu'il est utile de se souvenir.

Obtenez le résumé de votre thèse

J'ai pu obtenir des informations sur l'article, mais le titre et le nom de l'auteur ne suffisent pas. J'aurais aimé avoir des mots-clés liés au papier, mais cela ne peut pas être aidé. Par conséquent, j'utiliserai EFetch pour obtenir le résumé de l'article.

Tout d'abord, l'URL de base d'EFetch est

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

Lorsque vous saisissez l'ID d'article donné dans le navigateur ff917c40f933192050fb9244e345b598.png

Il a été renvoyé dans un format très peu maniable. Il semble que vous puissiez spécifier le format XML avec un paramètre appelé retmode.

Article de référence The E-utilities In-Depth: Parameters, Syntax and More - Entrez Programming Utilities Help - NCBI Bookshelf

Si vous essayez d'exécuter l'URL comme suit

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

Maintenant au format XML! 94b3a32e62d51993b6eb30917d11f5fa.png

Jusqu'à présent, vous pouvez écrire presque de la même manière que 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):#Obtenir des informations sur le papier
	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())#Afficher le résultat d'acquisition tel quel

if __name__ == "__main__":
    main()

Après cela, puisque le résumé du papier est un élément AbstractText, c'est le même que lors de l'extraction de l'ID du papier.

	element = fromstring(result.read())
	for e in element.findall(".//AbstractText"):
		print(e.text)#Voir le résumé

Vous devriez pouvoir le faire.

Lorsque je l'ai essayé, j'ai réussi à extraire uniquement le résumé de l'article.

% 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 
...

Si nous pouvons traiter les résumés des articles obtenus de cette manière et convertir les connaissances en RDF, il semble que nous pouvons faire quelque chose d'intéressant. Il a fallu beaucoup de temps pour obtenir les informations sur papier, je voudrais donc continuer avec l'article suivant.

Supplément

Lors du traitement du fichier XML une fois enregistré

element = fromstring(result.read())

À

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

C'est possible en le remplaçant par.

Recommended Posts

Créons un RDF en utilisant les informations papier de PubMed - L'acquisition d'informations papier -
Créons une API REST en utilisant SpringBoot + MongoDB