Pubmed Parser: 用于解析PubMed开放获取XML子集和MEDLINE XML数据集的Python解析器
Pubmed Parser是一个Python库,用于解析PubMed开放获取(OA)子集、MEDLINE XML资源库和Entrez Programming Utilities(E-utils)。它使用lxml
库将这些信息解析成Python字典,方便在研究中使用,例如文本挖掘和自然语言处理管道中。
有关可用API和数据集的详细信息,请参见我们的wiki页面或文档页面。以下是一些核心功能和代码示例。
可用的解析器
以下是pubmed_parser
中可用的解析器列表。
- 解析PubMed OA XML信息
- 解析PubMed OA引用参考文献
- 解析PubMed OA图像和标题
- 解析PubMed OA段落
- 解析PubMed OA表格[WIP]
- 解析MEDLINE XML
- 解析MEDLINE资助ID
- 从eutils网站解析MEDLINE XML
- 从网站解析MEDLINE XML引文
- 从网站解析Outgoing XML引文
解析PubMed OA XML信息
我们为PubMed开放获取子集创建了一个简单的解析器,你可以将XML路径或字符串传递给parse_pubmed_xml
函数,它将返回包含以下信息的字典:
full_title
: 文章标题abstract
: 摘要journal
: 期刊名称pmid
: PubMed IDpmc
: PubMed Central IDdoi
: 文章的DOIpublisher_id
: 出版商IDauthor_list
: 包含附属机构键的作者列表,格式如下
[['last_name_1', 'first_name_1', 'aff_key_1'],
['last_name_1', 'first_name_1', 'aff_key_2'],
['last_name_2', 'first_name_2', 'aff_key_1'], ...]
affiliation_list
: 附属机构键和附属机构字符串列表,格式如下
[['aff_key_1', 'affiliation_1'],
['aff_key_2', 'affiliation_2'], ...]
publication_year
: 出版年份subjects
: 分号分隔的文章列出的主题列表。有时,它只包含文章的类型,如研究文章、评论文章等。
import pubmed_parser as pp
dict_out = pp.parse_pubmed_xml(path)
解析PubMed OA引用参考文献
函数parse_pubmed_references
将处理一个Pubmed开放获取XML文件,并返回它引用的PMID列表。每个字典的键如下
pmid
: 文章的PubMed IDpmc
: 文章的PubMed Central IDarticle_title
: 被引用文章的标题journal
: 期刊名称journal_type
: 期刊类型pmid_cited
: 被引用文章的PubMed IDdoi_cited
: 被引用文章的DOIyear
: 参考文献中出现的出版年份(可能包括字母后缀,例如2007a)
dicts_out = pp.parse_pubmed_references(path) # 返回字典列表
解析PubMed OA图像和标题
函数parse_pubmed_caption
可以从给定的XML文件路径解析图像标题。它将返回可以参考实际图像的引用索引。该函数将返回包含以下键的字典列表
pmid
: PubMed IDpmc
: PubMed Central IDfig_caption
: 标题字符串fig_id
: 图形的参考ID(用于在XML文章中引用)fig_label
: 图形的标签graphic_ref
: 从Pubmed OA提供的图像文件名称参考
dicts_out = pp.parse_pubmed_caption(path) # 返回字典列表
解析PubMed OA段落
对于可能有兴趣解析引用周围文本的人,该库也提供了此功能。你可以使用parse_pubmed_paragraph
解析文本和参考PMIDs。此函数将返回字典列表,每个条目具有以下键:
pmid
: PubMed IDpmc
: PubMed Central IDtext
: 段落的全文reference_ids
: 该段落中的参考代码列表。
这些ID可以与parse_pubmed_references
的输出合并。
section
: 段落的部分(例如,背景、讨论、附录等)
dicts_out = pp.parse_pubmed_paragraph('data/6605965a.nxml', all_paragraph=False)
解析PubMed OA表格[在进行中]
你可以使用parse_pubmed_table
从XML文件中解析表格。此函数将返回字典列表,每个字典具有以下键:
pmid
: PubMed IDpmc
: PubMed Central IDcaption
: 表格标题label
: 表格标签table_columns
: 列名称列表table_values
: 表格内部的值列表table_xml
: 表格的原始XML文本(如果return_xml=True
则返回)
dicts_out = pp.parse_pubmed_table('data/medline16n0902.xml.gz', return_xml=False)
解析MEDLINE XML
MEDLINE XML与PubMed开放获取的XML格式不同。XML文件结构可在MEDLINE/PubMed DTD这里找到。你可以使用parse_medline_xml
函数解析该格式。此函数将返回字典列表,每个元素包含:
pmid
: PubMed IDpmc
: PubMed Central IDdoi
: DOIother_id
: 找到的其他ID,每个用;
分隔title
: 文章标题abstract
: 文章摘要authors
: 作者,每个用;
分隔mesh_terms
: 包含相应MeSH ID的MeSH术语列表,每个用;
分隔,例如'D000161:Acoustic Stimulation; D000328:Adult; ...
publication_types
: 出版类型列表,每个用;
分隔,例如'D016428:Journal Article'
keywords
: 关键词列表,每个用;
分隔chemical_list
: 化学术语列表,每个用;
分隔pubdate
: 出版日期。默认为仅年份信息。journal
: 给定论文的期刊medline_ta
: 这是期刊名称的缩写nlm_unique_id
: NLM唯一标识issn_linking
: ISSN链接,通常用于与Web of Science数据集关联country
: 从期刊信息字段提取的国家reference
: 每个用;
分隔的PMID字符串或文章引用的参考文献列表delete
: 布尔值,如果为False
表示论文已更新,因此你可能有两个languages
: 语言列表,以;
分隔vernacular_title
: 俗名标题。默认为空字符串(若不可用)。
同一篇文章的XML。你可以删除被删除的论文记录,因为它已更新。
dicts_out = pp.parse_medline_xml('data/medline16n0902.xml.gz',
year_info_only=False,
nlm_category=False,
author_list=False,
reference_list=False) # 返回字典列表
要从PubDate中提取月份和日期信息,请设置year_info_only=True
。我们还允许解析结构化摘要,可以通过更改nlm_category
参数来控制每个部分或标签的显示。
解析MEDLINE资助ID
使用parse_grant_id
解析XML文件中的MEDLINE资助ID。此函数将返回包含以下键的字典列表:
pmid
: PubMed IDgrant_id
: 资助IDgrant_acronym
: 资助缩写country
: 资助来源的国家agency
: 资助机构
如果没有找到资助ID,它将返回None
。
从eutils网站解析MEDLINE XML
你可以使用PubMed解析器从E-Utilities解析XML文件,使用parse_xml_web
。对于此函数,你可以提供一个pmid
作为输入,并得到一个包含以下键的字典:
title
: 标题abstract
: 摘要journal
: 期刊affiliation
: 第一作者的附属机构authors
: 作者字符串,用;
分隔year
: 出版年份keywords
: 文章的关键词或MESH术语
dict_out = pp.parse_xml_web(pmid, save_xml=False)
从网站解析MEDLINE XML引文
函数 parse_citation_web
允许您获取给定 PubMed ID 或 PubMed Central ID 的引文。这将返回一个包含以下键的字典:
pmc
: PubMed Central IDpmid
: PubMed IDdoi
: 文章的 DOIn_citations
: 给定文章的引用数量pmc_cited
: 引用给定 PMC 的 PMC 列表
dict_out = pp.parse_citation_web(doc_id, id_type='PMC')
从网站解析传出 XML 引文
函数 parse_outgoing_citation_web
允许您获取给定文章引用的文章,给定一个 PubMed ID 或 PubMed Central ID。这将返回一个包含以下键的字典:
n_citations
: 引用的文章数量doc_id
: 给定的文档标识符id_type
: 给定标识符的类型。'PMID'
或'PMC'
pmid_cited
: 文章引用的 PMID 列表
dict_out = pp.parse_outgoing_citation_web(doc_id, id_type='PMID')
标识符应作为字符串传递。PubMed Central ID 默认为默认值,应作为字符串传递,不带有 'PMC'
前缀。如果未找到引用,或者在所指示的数据库中未找到与 doc_id
匹配的文章,则返回 None
。
安装
您可以直接从存储库安装包的最新版本:
pip install git+https://github.com/titipata/pubmed_parser.git
或者使用 PyPI 安装最新发布的版本:
pip install pubmed-parser
或者克隆存储库并使用 pip
安装:
git clone https://github.com/titipata/pubmed_parser
pip install ./pubmed_parser
您可以在存储库的根目录通过运行 pytest --cov=pubmed_parser tests/ --verbose
来测试您的安装。
解析 PubMed OA 数据集的示例代码
一个示例如下:
import pubmed_parser as pp
path_xml = pp.list_xml_path('data') # 列出目录下所有 xml 路径
pubmed_dict = pp.parse_pubmed_xml(path_xml[0]) # 字典输出
print(pubmed_dict)
{'abstract': u"Background Despite identical genotypes and ...",
'affiliation_list':
[['I1': 'Department of Biological Sciences, ...'],
['I2': 'Biology Department, Queens College, and the Graduate Center ...']],
'author_list':
[['Dennehy', 'John J', 'I1'],
['Dennehy', 'John J', 'I2'],
['Wang', 'Ing-Nang', 'I1']],
'full_title': u'Factors influencing lysis time stochasticity in bacteriophage \u03bb',
'journal': 'BMC Microbiology',
'pmc': '3166277',
'pmid': '21810267',
'publication_year': '2011',
'publisher_id': '1471-2180-11-174',
'subjects': 'Research Article'}
使用 PySpark 的示例用法
这是一个使用 PySpark 2.1 解析所有 PubMed Open Access 子集的代码片段:
import os
import pubmed_parser as pp
from pyspark.sql import Row
path_all = pp.list_xml_path('/path/to/xml/folder/')
path_rdd = spark.sparkContext.parallelize(path_all, numSlices=10000)
parse_results_rdd = path_rdd.map(lambda x: Row(file_name=os.path.basename(x),
**pp.parse_pubmed_xml(x)))
pubmed_oa_df = parse_results_rdd.toDF() # Spark DataFrame
pubmed_oa_df_sel = pubmed_oa_df[['full_title', 'abstract', 'doi',
'file_name', 'pmc', 'pmid',
'publication_year', 'publisher_id',
'journal', 'subjects']] # 选择列
pubmed_oa_df_sel.write.parquet('pubmed_oa.parquet', mode='overwrite') # 写 DataFrame
更多信息请参见 scripts 文件夹。
核心成员
以及 contributors
依赖项
引用
如果您使用 Pubmed Parser,请从 JOSS 引用,如下所示:
Achakulvisut et al., (2020). Pubmed Parser: A Python Parser for PubMed Open-Access XML Subset and MEDLINE XML Dataset XML Dataset. Journal of Open Source Software, 5(46), 1979, https://doi.org/10.21105/joss.01979
或使用 BibTex
@article{Achakulvisut2020,
doi = {10.21105/joss.01979},
url = {https://doi.org/10.21105/joss.01979},
year = {2020},
publisher = {The Open Journal},
volume = {5},
number = {46},
pages = {1979},
author = {Titipat Achakulvisut and Daniel Acuna and Konrad Kording},
title = {Pubmed Parser: A Python Parser for PubMed Open-Access XML Subset and MEDLINE XML Dataset XML Dataset},
journal = {Journal of Open Source Software}
}
贡献
我们欢迎任何希望改进 Pubmed Parser 的人的贡献。您可以创建 GitHub issues 来讨论与存储库相关的问题。我们建议您在创建问题、报告错误或对存储库作出贡献之前,请阅读我们的 Contributing Guidelines。
致谢
此包在宾夕法尼亚大学的 Konrad Kording's Lab 开发。我们感谢来自 JOSS 的审稿人和编辑,包括 tleonardi
,timClicks
,和 majensen
。他们使我们的存储库更加完善!
许可证
MIT License 版权所有 (c) 2015-2020 Titipat Achakulvisut, Daniel E. Acuna