OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3194|回复: 0

Python:利用Entrez库筛选下载PubMed文献摘要

[复制链接]

143

主题

145

帖子

0

精华

高级会员

Rank: 4

积分
585
金钱
585
注册时间
2020-5-25
在线时间
42 小时
发表于 2020-11-24 17:24:05 | 显示全部楼层 |阅读模式
此处有几种选择可以达到目的:
(1)官网上匹配筛选条件(注:匹配快速,但是下载下来的数量受到限制,每次只能下载10000条数据,甚至更少。)
可以看到,我需要的数据是有三十多万条,但是每次只能下载10000条,那我岂不是要手动n次。。很明显,在大批量下载文献的情况下,官网不是很友好。
(2)R语言有个R包,叫做easyPubMed,这里我也给大家贴上学习指南(https://cran.r-project.org/web/packages/easyPubMed/vignettes/getting_started_with_easyPubMed.html
由于我不喜欢用R写代码,所以我写一半还是换了Python,熟练R的小伙伴可以自行根据指南走通需求。
(3)重量级库来了,Python自带的Bio包中的Entrez检索库,简直就是我的救星,以下是我的代码:
  注:Entrez在Bio包中,Bio的安装请移步 https://www.cnblogs.com/xiaolan-Lin/p/14023147.html
1 import numpy as np 2 from Bio import Medline, Entrez  # 一般是通过BioPython的Bio.Entrez模块访问Entrez 3 from collections import Counter 4 5 Entrez.email = "(此处写你自己在官网注册的邮箱账号)"  # 应用自己的账号访问NCBI数据库 6 7 # 此处需将服务器协议指定为1.0,否则会出现报错。http.client.IncompleteRead: IncompleteRead(0 bytes read) 8 # 服务器http协议1.0,而python的是1.1,解决办法就是指定客户端http协议版本 9 import http.client10 http.client.HTTPConnection._http_vsn = 1011 http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'12 13 """14 Entrez 是一个检索系统,可以用其访问NCBI数据库,比如说PubMed,GenBank,GEO等。15 获得有关 global PBDE 的所有文献的PubMed IDs16 """17 # handle_0 = Entrez.esearch(db="pubmed", term="drug therapy[Subheading] AND adverse effects[Subheading] AND humans[MeSH Terms]", retmax=306431)18 handle_0 = Entrez.esearch(db="pubmed", term="drug therapy[MeSH Subheading] AND adverse effects[MeSH Subheading] AND humans[MeSH Terms] AND (2000/01/01[Date - Publication] : 2021/12/31[Date - Publication])",19                           ptyp="Review", usehistory="y", retmax=306431)20 record = Entrez.read(handle_0)  # 获取检索条件的所有文献21 idlist = record["IdList"]  # 提取出文献id22 print ("Total: ", record["Count"])23 No_Papers = len(idlist)    # 共306431篇文献 2000-01-01:2021-12-3124 webenv = record['WebEnv'25 query_key = record['QueryKey'26 27 total = No_Papers28 step = 130029 print("Result items:", total)30 with open("./Data_PubMed/PBDE1.txt", 'w') as f:31     for start in range(0, total, step):32         print("Download record %i to %i" % (start + 1, int(start + step)))33         handle_1 = Entrez.efetch(db="pubmed", retstart=start, rettype="medline", retmode="text",34                                  retmax=step, webenv=webenv, query_key=query_key)  # 获取上述所有文献的PubMed IDs35         records = Medline.parse(handle_1)36         records = list(records)  # 将迭代器转换至列表(list)37         for index in np.arange(len(records)):38             id = records[index].get("PMID", "?")39             title = records[index].get("TI", "?")40             title = title.replace('[', '').replace('].', '')  # 若提取的标题出现[].符号,则去除41             abstract = records[index].get("AB", "?")42             f.write(id)43             f.write("\n")44             f.write(title)45             f.write("\n")46             f.write(abstract)47             f.write("\n")
话不多说,结果跑出来了我真的很快乐~
最后的结果是存放在txt文件中,大伙儿根据自己的需求改变代码所需字段啊。

现在我来解释一下,我贴上的这串代码的实现原理,首先是通过Entrez检索到符合我筛选条件的文献,里边的限制条件包括了几个词汇匹配以及时间限制,时间我限制在了2000年1月1日到2021年的12月31日(这里的时间我选用的是Date - Publication,时间选取Date - Completion、Date - Modification还是Date - Publication其实还是有争议的,大家自行考虑选取)。
Entrez.esearch的作用就是用来检索的,里边的参数db指向你要检索的数据库,代码中的注释也写了,Entrez作为一个接口检索,除了能够检索PubMed中的文献,也能去到别的数据库检索文献;term是写你的筛选语句,注意你写的检索语句不能带有引号,单引号也不行,否则会检索不到,如果不知道检索语句怎么写,或者是不知道字段是否被定义,可以在官网的检索那里https://pubmed.ncbi.nlm.nih.gov/advanced/选择字段输入内容自动生成query,但是生成的语句是不太智能的,会有很多括号是你不需要的,自己写代码的时候要适当去掉;ptyp我这里用的是Review,usehistory是y,意思是后边我的检索要记住这个语句,根据历史查询来检索;retmax如果不进行设置的话,默认给你的最大数据量好像是只有1000,我要的检索内容是超过这个值的,因此我需要自定义检索的数量。
Entrez.read是对Entrez.esearch检索到的内容进行读取,里边包含了9种元素,我们主要是想从中得到文献的id号,只有拿到了文献的id号,我们后面进行摘要的提取才能准确定位。
最后是循环当中步长的设置,这里就要根据自己的需求来定义了,包括内容的提取,因为我只需要PMID、标题(TI)、摘要(AB),所以我就没有加载别的内容进来,这里也有一点要注意,标题下载下来是大部分带有[ ].的,方便操作我直接就在下载的时候给去除了,这也是上面replace代码的由来。

附上我参考的链接,如果我这篇文章解决不了你的问题,那么希望下面的渠道能够帮助到你

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表