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.
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)
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:
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
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. 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.
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
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.
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.
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.
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
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!
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.
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.