☰
AI for Beginners 实验指南:用 PubMedBERT 训练医学命名实体识别(NER)模型
2026/10/2 6:52:31 网站建设 项目流程
  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

本篇技术指南完整解析 AI for Beginners 课程第 19 课时(命名实体识别)配套实验:训练一个面向医学术语的命名实体识别(NER)模型。文章以 BC5CDR 医学论文标注数据集为核心,讲解从原始标注文件解析、BIO 编码转换,到基于 Hugging Face Transformers 加载 PubMedBERT 进行 Token 分类微调的全过程。读完本文,你将掌握医学实体识别的数据准备流程、BIO 标签体系、预训练模型微调套路,并能将其推广到 COVID 论文等大规模医学文本分析场景。

实验任务概述

本实验来自 lessons/5-NLP/19-NER/lab/README.md,目标是训练一个能识别医学文本中疾病(Disease)和化学物质(Chemical)两类实体的 NER 模型。

该任务在方法论上非常接近真实工业场景:从大量非结构化的自然语言文本(如论文标题与摘要)中抽取结构化信息。在课程语境下,NER 本质上是一个Token 分类(Token Classification)问题——对输入序列中的每一个 token 判定其是否属于实体、以及属于哪类实体。主课时 lessons/5-NLP/19-NER/README.md 明确指出:这类模型可以用于从医学论文中抽取疾病、药物等关键术语,也可用于聊天机器人(如 Alexa、Google Assistant)理解用户请求中的地点、日期、药名等参数槽位。

数据集:BC5CDR 的原始格式解析

训练医学 NER 模型需要一个带有实体标注的规范数据集。本实验采用BC5CDR 数据集(BioCreative V 的 Chemical-Disease Reaction 语料),该数据集包含从1500 余篇生物医学论文中标注的疾病与化学物质实体。数据需在其官网注册后下载。

BC5CDR 原始文件的组织方式如下:

6794356|t|Tricuspid valve regurgitation and lithium carbonate toxicity in a newborn infant. 6794356|a|A newborn with massive tricuspid regurgitation, atrial flutter, congestive heart failure, and a high serum lithium level is described. This is the first patient to initially manifest tricuspid regurgitation and atrial flutter, and the 11th described patient with cardiac disease among infants exposed to lithium compounds in the first trimester of pregnancy. Sixty-three percent of these infants had tricuspid valve involvement. Lithium carbonate may be a factor in the increasing incidence of congenital heart disease when taken during early pregnancy. It also causes neurologic depression, cyanosis, and cardiac arrhythmia when consumed prior to delivery. 6794356 0 29 Tricuspid valve regurgitation Disease D014262 6794356 34 51 lithium carbonate Chemical D016651 6794356 52 60 toxicity Disease D064420 ...

逐行解读该格式:

  • 前两行是文档级信息:格式为PMID|t|标题与PMID|a|摘要。t表示 title(标题),a表示 abstract(摘要)。同一 PMID 下,标题与摘要拼接成一个完整的文本块,后续所有实体位置都基于该文本块计算。
  • 后续行是实体标注:以制表符分隔,依次为:
    • PMID:论文编号,用于关联上文文本块;
    • 实体起始字符偏移(如0、34、52);
    • 实体结束字符偏移(如29、51、60,开区间);
    • 实体原文文本(如Tricuspid valve regurgitation);
    • 实体类型(Disease/Chemical);
    • 实体在特定医学本体中的本体 ID(如D014262、D016651、D064420,源于 MeSH 体系)。

示例中的第一条标注0 29 Tricuspid valve regurgitation Disease D014262表明:在标题+摘要文本块的字符区间[0, 29)内,存在一个疾病实体 "Tricuspid valve regurgitation"(三尖瓣反流)。注意实体位置是字符级偏移,而非词级偏移,后续转换时必须小心处理。

从字符偏移到 BIO 标签:数据预处理核心

原始数据只有字符偏移,而模型需要词(token)级标签,因此第一步就是写 Python 代码把字符级标注转换为BIO 编码(又称 IOB)。

BIO 标签体系

BIO 编码用三类标签描述实体边界(依据主课时 README 的定义):

标签含义
B-(Beginning)实体第一个token
I-(Inner)实体内部/后续token
O(Other)不属于任何实体的普通token

一个实体可以跨多个 token,且相邻实体需要靠B-/I-前缀区分边界。以实验数据中同一篇论文标题为例,标注后的 token 序列为:

TokenTag
TricuspidB-DIS
valveI-DIS
regurgitationI-DIS
andO
lithiumB-CHEM
carbonateI-CHEM
toxicityB-DIS
inO
aO
newbornO
infantO
.O

类别数量公式

本实验实体类型为 Disease、Chemical 两类,因此标签类别总数为:

classes = 2 * entities + 1 = 2 * 2 + 1 = 5

即:B-DIS, I-DIS, B-CHEM, I-CHEM, O。这也对应实验室代码注释中的公式2*entities+1。若实体类型数量变化,该值需同步调整。

字符偏移到 token 对齐的难点

转换时最关键的坑在于:BIO 标签必须与模型分词器(tokenizer)的输出 token 一一对齐。直接按空格切词得到的词序列,与 BERT 类模型的 WordPiece 子词切分结果往往不一致——例如regurgitation可能被切成regurgi+##tation两个子词。因此实验室明确要求:转换数据集时必须考虑 PubMedBERT 的 tokenization 规则。

推荐的转换策略是:

  1. 将标题+摘要文本块按空格切词,并记录每个词的字符起始/结束偏移;
  2. 根据实体的字符区间[start, end)判断每个词是否落入某个实体区间,从而赋予该词B-/I-/O标签;
  3. 对边界词做部分匹配处理(实体可能从词中间开始或结束);
  4. 再用目标 tokenizer 对文本重新切分,把词级标签广播到子词 token 上(第一个子词继承原词标签,后续子词通常标记为I-或沿用内嵌标签)。

网络选型:从 LSTM 基线到 Transformer 微调

基线方案:双向 LSTM(课程示例)

实验文档指出,NER 的首次尝试可以复用课时中的LSTM 网络方案。课程配套笔记本 lessons/5-NLP/19-NER/NER-TF.ipynb 给出了完整的基线实现:使用两层双向 LSTM,配合TimeDistributed(Dense)对每个时间步输出做分类,模型结构如下:

Embedding(vocab_size, 300) → Bidirectional(LSTM(units=100, return_sequences=True)) → Bidirectional(LSTM(units=100, return_sequences=True)) → TimeDistributed(Dense(num_tags, softmax))

在通用 NER 数据集(Kaggle 的 Entity Annotated Corpus)上,该简单 LSTM 基线即可取得合理效果(示例测试句 "John Smith went to Paris to attend a conference in cancer development institute" 能正确输出B-per / I-per / O / B-geo / B-org / I-org ...等标签)。但它在医学术语、长程依赖与 OOV(词表外词汇)场景下能力有限。

进阶方案:预训练 BERT + 领域适配

在 NLP 任务中,Transformer 架构、特别是 BERT 语言模型通常能取得远优于 LSTM 的结果。预训练 BERT 已经掌握了语言的通用结构,只需相对较小的数据集和较低的计算成本即可微调到特定任务。

由于本实验面向医学场景,自然应选用在医学文本上预训练的 BERT 变体:微软研究院发布的PubMedBERT(官方名microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract),它使用 PubMed 文献库文本进行预训练,对生物医学词汇的表示能力显著优于通用 BERT。

训练 Transformer 模型的事实标准是Hugging Face Transformers 库,它同时维护了社区共享的预训练模型仓库(Model Hub),PubMedBERT 也在其中。

加载 PubMedBERT 进行 Token 分类

实验室给出了加载模型的核心代码:

model_name = "microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract" classes = ... # number of classes: 2*entities+1 tokenizer = AutoTokenizer.from_pretrained(model_name) model = BertForTokenClassification.from_pretrained(model_name, classes)

代码含义逐行拆解:

  • model_name:Hugging Face Model Hub 上的模型标识。base表示 base 规模,uncased表示不区分大小写,abstract表示基于 PubMed 摘要语料预训练;
  • classes:分类头输出的类别数,本实验为2*2+1=5;
  • AutoTokenizer.from_pretrained(model_name):加载与模型配套的 tokenizer,负责将输入文本切分为 WordPiece 子词 token,并生成input_ids、attention_mask等模型输入;
  • BertForTokenClassification.from_pretrained(model_name, classes):在预训练权重之上叠加一个用于 token 分类的线性分类头,输出维度为classes,每个 token 位置得到各类别的概率分布。

得到model与tokenizer后,训练流程与普通分类任务类似:

  1. 用tokenizer将每篇论文的标题+摘要切分为 token 序列(注意max_length截断与 padding,并保留attention_mask);
  2. 将预处理阶段生成的 BIO 标签与 token 对齐,构造labels序列;
  3. 以交叉熵作为损失函数(BertForTokenClassification内建支持),使用Trainer或自定义训练循环进行微调;
  4. 推理时对每个 token 取 argmax 得到标签,再将B-/I-标签按连续片段合并还原为实体(起始偏移与文本,从而得到结构化抽取结果)。

实验文档提示可参考课程作者提供的 Python 代码片段作为 BIO 转换实现的灵感;仓库内 lessons/5-NLP/19-NER/lab/README.md 与 lessons/5-NLP/19-NER/NER-TF.ipynb 共同构成了从数据处理到模型训练的完整参考链。

实验的延伸价值:大规模医学文本洞察

实验室小结强调,该任务与真实世界需求高度接近:当需要对大量自然语言文本进行深层洞察时,NER 是第一把钥匙。本实验训练的模型可以直接应用到CORD-19 数据集(COVID-19 相关研究论文语料)上,从海量论文中抽取疾病、药物、化学物质实体,进而挖掘:

  • 哪些药物被反复提及并可能与 COVID 治疗相关;
  • 不同疾病并发症之间的共现关系;
  • 论文集合中的高频医学实体分布随时间的变化趋势。

这类研究(对医学论文语料应用 NER 进行结构化分析的思路)在本课程的 19-NER 主课时 的拓展阅读中也有对应介绍。完成本实验后,你掌握的"训练领域 NER 模型 → 应用到新语料抽取实体"的流水线,可以直接迁移到生物医学、法律文书、金融报告等其他垂直领域的实体抽取任务。

仓库内配套资源导航

资源路径用途
实验任务书(英文原版)lessons/5-NLP/19-NER/lab/README.md本实验完整要求与数据格式说明
本实验阿拉伯语版translations/ar/lessons/5-NLP/19-NER/lab/README.md阿拉伯语读者可对照阅读
19-NER 主课时讲义lessons/5-NLP/19-NER/README.mdBIO 标签理论、NER 应用场景
LSTM 基线实现lessons/5-NLP/19-NER/NER-TF.ipynb双向 LSTM + TimeDistributed 的完整可运行示例
课程根目录README.md课程整体学习路径与实验索引

实践建议:先运行 NER-TF.ipynb 建立 LSTM 基线的直觉,再转向 PubMedBERT 微调;数据处理阶段务必编写针对 BC5CDR 字符偏移的解析脚本并逐条校验对齐结果,这是整个实验成败的关键一步。

  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询