GitHub 仓库:https://github.com/allenai/scispacy
前言
在自然语言处理领域,spaCy 凭借高效、工程友好的特性,成为工业界和科研圈非常热门的 Python NLP 框架。但通用预训练模型面对生物医学、生命科学文献、临床病历文本时,常常力不从心:专业术语、缩写符号、特殊化学 / 医学名词,会造成分词错误、实体识别不准、句法解析偏差等一系列问题。
AllenAI(艾伦人工智能研究所)基于 spaCy 打造了SciSpaCy,专门针对生物医学、科研论文、临床记录做领域适配,提供成套预训练流水线,让开发者可以快速对 PubMed 文献、临床笔记做信息抽取、实体识别、句法分析、缩写解析、实体链接等任务,是生物医学 NLP 方向的经典开源项目。
什么是 SciSpaCy
SciSpaCy 是一套 Python 工具包,它不是从零实现的全新 NLP 框架,而是spaCy 的领域扩展,提供经过生物医学语料训练好的完整 NLP 流水线与自定义组件PyPI。
训练数据来源包含 PubMed Central 开源论文库、GENIA 树库、MedMentions 实体链接数据集等大量医学科研文本,专门优化医学场景下分词、句子切分、词性标注、依存句法分析、实体提及检测能力。
⚠️注意:目前 SciSpaCy 主要支持英文生物医学文本,暂不支持中文处理PMC。
核心能力
- 领域优化的分词与分句:自定义分词器、句子分割器,适配医学缩写、化学符号、专业术语的切分规则,解决通用 spaCy 对医学文本切分错乱的痛点PyPI。
- 词性标注、依存句法解析:在医学语料上重新训练,解析性能接近该领域 SOTA 模型水平。
- 生物医学实体检测:识别疾病、化学物质、细胞、基因、症状等科研文本实体;附带多个不同数据集训练的 NER 模型(BC5CDR、BIONLP13CG 等)PMC。
- 缩写检测组件
AbbreviationDetector:自动识别文中缩写和全称对应关系,比如识别MDSC = Myeloid derived suppressor cells,科研文献非常实用PMC。 - 实体链接
EntityLinker:把抽取到的医学实体映射到 UMLS、MeSH、RxNorm 等医学本体知识库,完成实体归一化,解决医学术语别名、缩写歧义问题PMC。
可用预训练模型
SciSpaCy 提供不同尺寸的模型,可以根据算力、精度需求选型:
表格
| 模型 | 说明 |
|---|---|
| en_core_sci_sm | 轻量版流水线,体积小,适合快速实验 |
| en_core_sci_md | 中等规模,包含词向量,精度更高 |
| en_core_sci_lg | 大尺寸模型,词汇量更大 |
| en_core_sci_scibert | 基于 SciBERT transformer 的高精度流水线,算力消耗更高 |
快速上手示例
1. 安装
# 安装scispacy包
pip install scispacy
# 安装对应预训练模型,以轻量模型为例
pip install https://github.com/allenai/scispacy/releases/download/v0.5.3/en_core_sci_sm-0.5.3.tar.gz
2. 基础代码示例:解析医学文本
import spacy
from scispacy.abbreviation import AbbreviationDetector
# 加载预训练模型
nlp = spacy.load("en_core_sci_sm")
# 加入缩写检测组件
nlp.add_pipe("abbreviation_detector")
text = """
Myeloid derived suppressor cells (MDSC) are immature myeloid cells with immunosuppressive activity.
They accumulate in tumor‑bearing mice and humans with different types of cancer, including hepatocellular carcinoma (HCC).
"""
doc = nlp(text)
# 打印分句结果
print("===句子分割===")
for sent in doc.sents:
print(sent.text.strip())
# 打印缩写映射
print("\n===缩写检测===")
for abbr in doc._.abbreviations:
print(f"{abbr.text} -> {abbr._.long_form.text}")
# 打印检测到的实体提及
print("\n===实体提及===")
for ent in doc.ents:
print(f"{ent.text}\t{ent.start_char}-{ent.end_char}")
运行输出可以看到自动识别出MDSC、HCC缩写对应的全称,同时抽取出细胞、癌症等医学实体,方便后续做文献挖掘、病历信息提取、知识构建等下游任务。
典型应用场景
- 科研文献挖掘:批量解析 PubMed、PMC 论文摘要 / 全文,抽取疾病、药物、基因、蛋白实体,构建医学知识图谱;
- 临床文本处理:处理英文电子病历、临床笔记,提取症状、药物、诊断信息;
- 医学 NLP 研究基线:做实体识别、关系抽取任务时,把 SciSpaCy 作为基础预处理流水线;
- 医学文本数据集构建:借助缩写解析、实体链接,对原始文本做自动标注,降低标注成本。
提示:实体链接组件需要下载 UMLS 知识库资源,需要申请 UMLS 账号获取 license,不能开箱即用,项目文档有详细指引PMC。
和同类工具简单对比
- 通用 spaCy:通用领域强,但医学术语识别差,没有缩写检测、医学实体链接组件。
- SciSpaCy:轻量高效,完全兼容 spaCy 生态,上手简单,适合快速原型开发;实体链接依赖外部医学知识库。
- MedspaCy:同样基于 spaCy,更偏向临床病历场景;SciSpaCy 更偏向科研论文文献。
- Stanza(BioMed):斯坦福生物医学 NLP,精度高,但速度慢,资源消耗更大。
项目信息
- GitHub 地址:https://github.com/allenai/scispacy
- 官方文档:https://allenai.github.io/scispacy/
- 论文:ScispaCy: Fast and Robust Models for Biomedical Natural Language Processing(2019)
- License:Apache 2.0 开源协议,可以用于学术和商业项目。
小结
如果你需要做英文医学文献、科研文本的 NLP 处理,不想从零训练领域模型,SciSpaCy 是性价比极高的选择。它继承 spaCy 简单友好的 API,又针对性解决医学文本的分词、缩写、实体识别痛点。
当然它也有局限,仅支持英文;实体链接依赖 UMLS;遇到非常小众的罕见医学术语依然会有识别缺陷,实际项目中常需要结合规则或者少量微调进一步优化效果。