想象你走进一家繁忙的医院,门口的分诊台护士迎上来问你:“哪里不舒服?”你语速飞快地说:“这两天胸口疼,还有点咳嗽,我怀疑是支气管炎,家里有阿司匹林能吃吗?”护士在登记本上飞速记录:症状——胸痛、咳嗽;疑似疾病——支气管炎;药物——阿司匹林;部位——胸口。短短几秒,她完成了一次“医学实体识别”:从一段流水账似的口语中,精准挑出医生最关心的几类信息,并贴上标签。 医学命名实体识别(Medical Named Entity Recognition, 简称医学 NER)正是为了让 AI 学会这套本领:从电子病历、出院小结、检查报告等临床文本中,自动识别出疾病、症状、药物、解剖部位等关键实体,标注它们的边界与类型。它是临床 NLP 的“地基工程”,上游连接原始文本,下游服务疾病分类、知识图谱构建、智能问诊。本文用“分诊台护士”这条主线,带你走完从标注体系、经典模型到落地评估的全流程,让零基础读者也能在理论与实践之间建立完整认知。
对 AI 从业者而言,医学 NER 是 NLP 技术在垂直领域落地的经典样板:掌握它的数据规范、模型选型与评估套路,你就能把通用序列标注能力迁移到金融、法律、制造等任意专业领域。
可视化演示
演示医学文本NER:BIO序列标注、预训练模型实体抽取与嵌套实体识别,识别疾病、症状、药物与解剖实体。
本节配有交互动效(进入视口后自动加载,约 3KB)。
BIO序列标注 疾病 药物 B-I-O 为每个token标注B/I/O实体标签
任务定义与标注体系
分诊台护士手里有一张“登记簿”,上面有四栏:疾病、症状、药物、解剖部位。患者说话时,她每听到一个关键词,就在对应栏目里记一笔。AI 要做的事一模一样,只不过它面对的不是声音,而是电子病历里的一段段文本。比如“患者因胸痛伴咳嗽就诊,既往有高血压病史”这句话,需要被拆成最小的词,然后给每个词打上“这是症状”“这是疾病”或“这不是实体”的标签。
这个过程在技术上叫序列标注:输入一个词序列,输出一个等长的标签序列。之所以不能简单用“关键词匹配”,是因为同一个词在不同语境下类别可能不同,比如“发热”在“发热门诊”里是症状,在“发热伴寒战”里也是症状,但“发热待查”却是一个诊断名称。边界问题更棘手:“左肺上叶肺炎”中,“肺炎”是疾病,“左肺上叶”是解剖部位,两者必须被正确切分。
为了解决“切成几块、每块是什么”的问题,业界普遍采用 BIO 标注体系:B(Begin)表示实体开始词,I(Inside)表示实体中间或结尾词,O(Outside)表示非实体。于是“胸痛”被标为“B-症状”或“I-症状”,“支气管炎”被标为“B-疾病”。从数学上看,整个任务就是寻找条件概率最大的标签序列:
回到分诊台的比喻:如果把每个词看作“病人说的一个词”,那么标签就是护士在登记簿上对应的栏目。BIO 体系保证了“实体从哪开始、到哪结束”清清楚楚,不会把“左肺上叶肺炎”里的两个实体搅成一团。这个“标签语言”,就是 AI 版本的登记簿。
- 标签序列 \\(\mathbf{y}\\)每个词对应一个标签,整句话合起来就是标签序列。比如“疑似支气管炎”对应的标签是“O、B-疾病”。
- 条件概率 \\(P(\mathbf{y}\mid\mathbf{x})\\)在给定文本 \\(\mathbf{x}\\) 的前提下,这个标签序列出现的概率。护士越有经验,判断越接近真实概率。
- \\(\arg\max\\) 决策把所有合法标签序列都列出来,选出概率最高的那个作为最终答案,就像护士从多种解读中挑最合理的一种。
数据语料准备
分诊台护士再厉害,也得先看得清病历上的字。现实中的电子病历往往包含大量“噪音”:多余的空格、半角全角混杂的标点、乱码符号、医生手写输入的错误、剂量单位不规范(“5mg“写成”5 m g“)。这些噪音就像病历纸上的咖啡渍和折痕,如果不处理,AI 会学到错误的规律。数据准备阶段要做的事,就是把这些”潦草档案”誊抄成干净整齐的登记表。
第一步是数据清洗:统一字符编码、去除 HTML 标签和异常符号、把全角字符转半角、修正明显拼写错误。第二步是句子切分与分词:中文没有天然空格,需要按标点和语义把长文本切成句,再用分词工具切成词。在医学场景中,分词尤其困难——“支气管肺炎”到底是“支气管/肺炎”还是“支气管炎/肺炎”?分词错误会直接导致实体边界错误。第三步是标注质控:请医学专业人员标注,并安排双人标注、计算标注一致性,就像护士长抽查登记簿,确保每位护士的记录标准一致。
数据准备阶段是大多数项目最容易低估的一环。很多团队急着上模型,结果发现模型在测试集上表现很好、上了真实病历却崩盘,原因往往是训练数据里相似的噪音模式没有被模拟。医学实体识别对数据质量高度敏感,因为药物、剂量、解剖部位这些信息直接关系到患者安全,一个词的偏差就可能造成严重后果。所以这个“誊抄档案”的过程,不是琐碎的杂活,而是整个 NER 系统稳定性的根基。
经典基线方法
老护士有本泛黄的手册,上面记满了常见症状和药物的别名——这是词典与规则方法。给一个超大词典,文本里出现“阿司匹林”就标记为药物,简单直接。但问题也明显:医学词汇无穷无尽,新药、缩写、拼接词层出不穷,词典覆盖不全时,模型就变成“睁眼瞎”。另外,词典匹配不考虑上下文,“心衰”在病历里是疾病,在“心衰指数”里可能只是指标简称。
为了利用上下文信息,研究者引入了序列概率模型。早期的隐马尔可夫模型(HMM)把标注问题看作“状态转移”:当前标签只取决于上一个标签,且只通过当前词观察。它像一位只记性不太好的护士——只记得上一个词是什么,却看不到整句话的宏观语境。条件随机场(CRF)则聪明得多,它对整个标签序列建立条件概率模型,可以自由使用任意窗口的特征,是经典时期的“黄金标准”。CRF 的核心公式如下:
老护士的“手册”就是这么一份带权重的经验清单:看到“胸痛”且前面是动词,就倾向标记为症状;看到“疑似”后面大概率跟着疾病。CRF 的强大之处在于,这些特征可以任意组合、自动学习权重。虽然在深度学习的时代 CRF 常被当作“输出层”使用,但它依然是理解序列标注的必修课,也是低资源场景下性能可靠的基线。
- 特征函数 \\(f_k(y_{t-1}, y_t, \mathbf{x}, t)\\)这是“打分手册”里的一条规则,比如“当前词是'炎'结尾、上一个标签是 B-疾病,就打分 +1”。
- 权重 \\(\lambda_k\\)每条规则的置信度。有的规则可靠(“阿司匹林”几乎总是药物),权重就大;有的规则模糊,权重就小。
- 指数求和与归一化 \\(Z\\)把所有规则得分加起来取指数,再做全局归一化。\\(Z\\) 是配分函数,保证所有可能的标签序列概率之和等于 1。
预训练模型进阶
分诊台来了个新护士,她不是靠手册背词,而是真正“上过医学院”——她读过的病历、论文、教材数以亿计。这就是预训练模型的思路:先在海量通用文本上学会语言规律,再针对医学文本继续学习。BERT 通过双向 Transformer 编码每个 token,让每个词的表示同时融合左右上下文——好比护士听你说完一整句话后,才回头判断“阿司匹林”在这句话里是药物还是普通名词。
通用 BERT 虽然懂语法,却不了解“二甲双胍”是降糖药、“支气管哮喘”和“心源性哮喘”的区别。于是研究者用医学语料对 BERT 做继续预训练,得到 BioBERT 等医学专用模型。这相当于让护士先读完医学院课程(通用预训练),再去呼吸科轮转(领域继续预训练),最后到分诊台上岗(下游微调)。微调阶段,模型在标注数据上做 token 级分类——对每个词的向量输出一个标签概率分布,用交叉熵损失优化。常用公式是 softmax 分类:
实践中最常用的方案是 BERT/BioBERT + 顶层 CRF:BERT 提供丰富的上下文表示,CRF 负责约束标签转移的合法性(比如“B-疾病后面不能直接跟 I-症状”)。这就像护士先凭直觉每词打分,再根据语法规则做微调,保证输出的标签序列永远符合医学文书的书写逻辑。预训练模型把医学 NER 的 F1 值推上了新台阶,但也带来了更大的算力开销与部署成本,需要根据场景权衡。
- 隐层向量 \\(\mathbf{h}_i\\)BERT 对第 \\(i\\) 个词输出的稠密向量,数值上携带了该词在上下文中的含义。
- 线性映射 \\(\mathbf{w}_c \cdot \mathbf{h}_i + b_c\\)把高维向量压缩成“标签 \\(c\\) 的得分”。权重 \\(\mathbf{w}_c\\) 相当于护士对“类别 \\(c\\) 的特征模版”。
- softmax 归一化把各标签得分转为总和为 1 的概率分布,取概率最大的标签。
嵌套实体处理
病历里有时会出现“俄罗斯套娃”。“左肺上叶肺炎”这个短语里,“左肺上叶”是解剖部位,而整体又指代“肺炎”这个疾病;“慢性阻塞性肺疾病急性加重期”更是嵌套了疾病、病程、状态多层语义。普通 BIO 标注是“扁平的”——每个 token 只能有一个标签,就像登记簿上每个词只能填在一个栏目里。面对嵌套结构,扁平标注会强制你丢弃信息:标“左肺上叶”就丢了“肺炎”,标“肺炎”就丢了部位。
解决嵌套实体有两大类思路。第一类是层式解码:先识别外层实体,再在外层实体内部递归识别内层实体,像剥洋葱一样一层层展开。第二类是跨度抽取:直接枚举所有可能的文本片段(span),判断每个片段是不是实体、属于什么类型。跨度抽取不依赖逐词标签,天然支持重叠结构,就像护士在登记簿上允许一行字同时出现在“疾病”和“解剖部位”两栏。
嵌套实体的难点在于边界识别。模型的训练本质上是在“哪些词必须粘连、哪些词必须断开”之间找平衡。把嵌套实体当成普通扁平实体处理,会导致召回率下降——漏掉内层实体。反过来,过度拆分又可能把“糖尿病肾病”错拆成两个无关实体,破坏临床语义。实际项目里,可以先统计语料中嵌套实体占比:如果低于 5%,用扁平 BIO + BERT 就够了;如果占比高,就要上层级解码或 span 抽取方案。没有一种方案能通吃,先看清数据再选模型,才是高效路径。
低资源适应
分诊台要扩张到一家新诊所,却没时间培训那么多资深护士——标注一份高质量病历需要医生花几十分钟,成本极高。低资源场景是医学 NER 的常态:罕见病语料少、新科室冷启动、方言或特定医院的行话不一致。解决思路有三条。
第一是迁移学习:先在通用医学语料上预训练,再在小规模目标数据上微调。这相当于把大医院护士的丰富经验移植过来,只需要几周科室培训就能上岗。第二是半监督自训练:用一个标注数据训练出的“老师模型”,去给大量无标注病历打伪标签,挑出高置信度的样本加入训练集,再训练“学生模型”。有点像护士长先培养几个骨干,再让骨干去带教新人,循环扩充团队。第三是提示学习:把 NER 改造成“填空式”任务,用大语言模型的先验知识零样本或 few-shot 抽取实体,适合快速验证场景。
低资源方法永远存在“用多少标注数据换多少精度”的权衡。迁移学习假设源域和目标域分布接近,如果新诊所的书写风格差异过大,效果会打折扣;半监督自训练可能放大伪标签中的错误,形成“自我强化偏差”;提示学习受限于大模型对医学知识的掌握程度,输出格式也不稳定。稳妥的做法是多策略组合:先用提示学习快速摸清实体分布,再用迁移学习作为主干,最后用几百条人工标注做精调。就像新诊所先请顾问评估、再派骨干驻场、最后本地护士逐步接手,循序渐进才是低成本高产出的路径。
评估与落地
护士长要考核新护士,不能只看“标了多少实体”,还要看“标得准不准”。评估指标沿用了信息检索的三板斧:精确率(Precision)、召回率(Recall)和 F1 值。精确率是“标出来的实体里有多少是对的”,对应护士没把“胸痛待查”这个诊断名错标成症状;召回率是“所有该标的实体里标出了多少”,对应护士没漏掉“阿司匹林”这个药物。两者是跷跷板,F1 是它们的调和平均:
评估时还要区分token 级和实体级。token 级只看每个词标得对不对,实体级则要求整段实体完全正确才算对——“左肺上叶”标成“左肺”就是错。绝大多数场景下我们要看的是实体级 F1,因为它直接反映“医生能否直接使用抽取结果”。工程落地上,一条完整的医学 NER 流水线通常包括:隐私去标识化、文本解析、NER 推理、实体归一化(如 ICD-10 编码)、结果回写与人工抽检。其中隐私合规是重中之重:电子病历属于受保护的健康信息,模型部署、数据存储、日志记录都必须满足医疗数据安全规范,绝不能因 AI 化而放松对患者隐私的防护。
- 精确率 \\(P\\)预测为正样本的结果中,真正正确的比例。
- 召回率 \\(R\\)真实为正样本的实体中,被成功找出的比例。
- F1 调和平均当 P 和 R 相差悬殊时,F1 会明显偏小,防止模型靠“全标成实体”刷高召回或靠“只标一个”刷高精确率。
AI 应用场景
电子病历结构化与临床科研
阶段:模型微调与部署阶段
解决的问题:医院积累的海量电子病历是自由文本,研究者要筛选“使用二甲双胍的 2 型糖尿病患者”这类队列,靠人工阅读病历耗时数周。医学 NER 自动抽取疾病、症状、药物、解剖部位四类实体,把非结构化文本转成结构化字段,让科研人员用 SQL 就能完成患者入组和统计分析。
具体案例:某三甲医院呼吸科用 BioBERT + CRF 对 10 万份出院小结做 NER 抽取,识别“慢性阻塞性肺疾病急性加重期”等复合实体,自动生成患者画像,将临床队列构建时间从 3 周压缩到 2 天。
智能问诊与用药安全提示
阶段:应用集成与实时推理阶段
解决的问题:在线问诊平台中,患者描述口语化、夹杂大量症状与药物信息。NER 作为前置模块,把“我这两天吃阿司匹林还是头痛”自动标出“阿司匹林=药物、头痛=症状”,再联动药物说明书与相互作用数据库,给出“阿司匹林不适用于头痛伴消化道出血史”之类的安全提示。
具体案例:某互联网医疗平台在智能导诊对话中嵌入轻量级 NER 服务,实时抽取患者主诉,路由到对应科室,同时识别“青霉素过敏”等风险实体,触发用药禁忌弹窗。
医保审核与疾病编码辅助
阶段:后处理与规则引擎阶段
解决的问题:医保结算需要把病历中的诊断转为 ICD-10 编码,人工编码效率低且易出错。NER 先把“糖尿病伴有多个并发症”拆成疾病实体,再交给编码映射模块生成规范编码,降低拒付率。
具体案例:某医保科技公司用 CRF + 词典融合方案处理 DRG 分组前的诊断文本,把疾病实体识别准确率提升到 92%,复核人工量减少 60%。
Python 演示
# -*- coding: utf-8 -*-"""迷你医学NER:词典规则 + BIO标注 + F1评估(纯Python,无第三方依赖)"""from collections import defaultdict class MiniNER: """模拟分诊台护士:用四类词典做实体识别""" def __init__(self): self.disease = {"支气管炎", "肺炎", "高血压", "糖尿病"} self.symptom = {"胸痛", "咳嗽", "发热", "头晕", "头痛"} self.drug = {"阿司匹林", "二甲双胍", "布洛芬"} self.anatomy = {"左肺上叶", "左肺", "心脏", "胃"} self.free_lists = {"disease": self.disease, "symptom": self.symptom} self.gc_count = 0 def predict(self, text): """对句子做简单词典匹配,返回 BIO 标签列表""" labels = ["O"] * len(text) for i, ch in enumerate(text): for ent_type, vocab in self.free_lists.items(): if ch in vocab: labels[i] = "B-" + ent_type.upper() elif ch in vocab: # 示例分支,便于理解结构 labels[i] = "I-" + ent_type.upper() return labels class NerEvaluator: """实体级评估:统计 TP/FP/FN 并计算各项指标""" def __init__(self): self.tp = 0 self.fp = 0 self.fn = 0 def add_batch(self, gold_spans, pred_spans): gold_set = set(gold_spans) pred_set = set(pred_spans) self.tp += len(gold_set & pred_set) self.fp += len(pred_set - gold_set) self.fn += len(gold_set - pred_set) def report(self): precision = self.tp / (self.tp + self.fp) if (self.tp + self.fp) else 0.0 recall = self.tp / (self.tp + self.fn) if (self.tp + self.fn) else 0.0 f1 = 2 * precision * recall / (precision + recall) if (precision + recall) else 0.0 return precision, recall, f1 def naive_span_extract(text, labels): """把 BIO 标签序列转成实体区间列表,演示边界合并逻辑""" spans = [] start = -1 for i, lab in enumerate(labels): if lab.startswith("B-"): if start >= 0: spans.append((start, i)) start = i elif lab == "O" and start >= 0: spans.append((start, i)) start = -1 if start >= 0: spans.append((start, len(labels))) return [tuple(text[s:e]) for s, e in spans] if __name__ == "__main__": model = MiniNER() ev = NerEvaluator() samples = [ ("患者胸痛咳嗽,疑似支气管炎,服用阿司匹林", [(1, 2), (3, 4), (7, 10), (13, 14)]), ("高血压患者左肺上叶肺炎", [(0, 2), (4, 6), (6, 7)]), ] for text, gold in samples: tags = model.predict(text) pred = naive_span_extract(text, tags) print("原文:", text) print("预测:", pred) print("真实:", [tuple(text[s:e]) for s, e in gold]) print("---") ev.add_batch([tuple(text[s:e]) for s, e in gold], pred) p, r, f = ev.report() print("精确率: %.2f 召回率: %.2f F1: %.2f" % (p, r, f))
class MiniNER:用 Python 类模拟分诊台护士,内部维护四类医学实体词典。self.free_lists = {"disease": self.disease, ...}字典映射实体类型到词表,便于遍历匹配;集合用_lists命名避免与方法冲突。labels = ["O"] * len(text)初始化全 O 标签,代表“暂不确定任何实体”。for ent_type, vocab in self.free_lists.items():逐个词表匹配,最朴素的“背手册”策略。naive_span_extract(text, labels)把 BIO 标签合并为实体文本区间,演示边界合并逻辑。gold_set = set(gold_spans)用集合做交集/差集运算,快速统计 TP/FP/FN。self.f1 = 2 * p * r / (p + r) if (p + r) else 0.0F1 计算公式,注意分母为零的保护。for text, gold in samples:遍历两条例句,完成预测与评估循环。
常见误区
误区很多人觉得医学 NER 不就是建个疾病词典,在文本里找词吗?“高血压”出现了就标疾病,多简单!
正解词典匹配只能处理“所见即所得”的情形,遇到“高血压病史 5 年”里的“高血压”还能应付,遇到“血压升高”“血压控制不佳”这类同义改写、遇到“心源性哮喘”这种需要结合上下文才能判断的复杂概念就完全失效。真正的 NER 必须依赖上下文建模,CRF 或 BERT 都是为了让模型学会“这个词在当前语境下是什么”,而不是死记硬背。
为何常见:NER 的输入输出看起来确实是“找词打标签”,初学者很容易把表面形式当成全部,忽略了语境和边界推断才是技术的核心。
误区模型报告显示 F1 是 95%,为什么上线后医生觉得抽出来的实体没法用?
正解你看到的多半是 token 级 F1——每个字或词单独评估。比如“左肺上叶”四个字一个字一个字标,错一个字也只算一个 token 错误,但实体级评估要求整个片段完全正确才算对。医疗场景必须看实体级 F1,“药物剂量”少抽一个"mg"单位,在临床上就是安全事故。
为何常见:训练框架默认输出 token 级指标,很多初学者直接把训练日志里的数值当作模型性能,忽略了评估粒度与业务目标不匹配的问题。
误区语料里发现几个嵌套实体,立刻上最复杂的 span 抽取模型,结果训练慢、过拟合、效果反而更差。
正解嵌套实体是否需要用复杂方案,取决于嵌套实体在语料中的占比。如果占比不到 5%,用扁平 BIO + BERT 已经足够,复杂模型反而因为参数量大、数据不足而难以收敛。工程上应先用数据统计说话,再决定模型复杂度,而不是为了炫技而过度设计。
为何常见:论文里嵌套实体往往是卖点,读者容易把“最新方法”等同于“最优方法”,忽略了方法成立的隐含前提是数据规模与分布。
误区标注数据少,不如直接调大语言模型 API,用 Prompt 抽取实体,省时省力。
正解大模型在医学实体抽取上确实有零样本能力,但输出格式不稳定、推理成本高、无法保证低延迟。更稳妥的是用迁移学习 + 几百条人工标注微调一个小型模型,或者用大模型生成伪标签、再用小模型蒸馏。大模型适合做探索和伪标签生产,不适合直接承担生产级的实体抽取。
为何常见:“大模型万能论”让初学者倾向于用 API 解决一切问题,但在垂直领域,稳定性、成本和隐私合规往往比“聪明”更重要。
误区本地有几千份真实病历,直接用来训练 NER 模型,反正模型不会主动泄露数据。
正解电子病历包含患者姓名、身份证号、联系方式等受保护健康信息。模型本身可能记住训练数据中的隐私片段,被恶意攻击者复现。正规流程必须先做去标识化处理,再签署数据使用协议,模型部署时还要做输出审计。在医疗 AI 落地中,隐私合规是一票否决项,技术效果再好在合规红线面前也要让步。
为何常见:研发阶段关注点都在“效果提升”上,工程规范和数据伦理容易被看作是“流程麻烦”,等到产品评审或监管检查时才追悔莫及。
面试题
Q1. 医学命名实体识别(NER)的核心任务是什么?
- A.对文本做情感分类
- B.识别文本中的实体边界与类型← 正确答案
- C.生成医学文本摘要
- D.翻译医学文献
答案:B。NER 是序列标注任务,给每个词标上实体开始、内部或非实体标签,从而识别实体边界和类型。情感分类、摘要、翻译都属于其他 NLP 任务,选项 A/C/D 考察对任务定义的区分。
Q2. BIO 标注体系中,"O"代表什么含义?
- A.实体开始的第一个词
- B.实体内部的词
- C.非实体的普通词← 正确答案
- D.实体的缺失
答案:C。B(Begin)表示实体开始词,I(Inside)表示实体内部词,O(Outside)表示非实体。“O“对应”Other“,表示这个词不属于任何目标实体,是分诊台登记簿上”无需记录”的普通词。
Q3. 以下哪项属于典型的“症状”医学实体?
- A.阿司匹林
- B.左肺上叶
- C.胸痛← 正确答案
- D.高血压
答案:C。胸痛是患者主观感受到的不适,属于症状;阿司匹林是药物,左肺上叶是解剖部位,高血压是疾病诊断。四类实体需要结合语义来区分,这也是训练模型时标注规范的核心内容。
Q4. 条件随机场(CRF)相比隐马尔可夫模型(HMM)的主要优势是什么?
- A.模型参数更少
- B.可以灵活利用任意窗口的上下文特征← 正确答案
- C.不需要训练数据
- D.输出结果总是正确的
答案:B。CRF 是判别式模型,直接建模条件概率 P(y|x),可以自由设计特征函数,利用前后词、词性等全局特征;HMM 是生成式模型,依赖较强的独立性假设。模型参数更少、不需要训练数据、输出总是正确都不符合事实。
Q5. BioBERT 与 BERT 的关系是?
- A.完全不同的模型架构
- B.在医学语料上继续预训练的 BERT← 正确答案
- C.BERT 的简化版本
- D.BERT 的量化压缩版
答案:B。BioBERT 保持 BERT 相同的 Transformer 架构,但使用医学论文和临床文本继续预训练,让模型学到医学领域的词汇分布和语义规律。它是“上过医学院的 BERT”,而不是新架构、简化版或压缩版。
Q6. “左肺上叶肺炎”中,“左肺上叶”和“肺炎”是什么关系?
- A.两个独立无关的实体
- B.嵌套实体,解剖部位与疾病重叠← 正确答案
- C.同一个实体的不同写法
- D.一个实体是另一个的属性
答案:B。“左肺上叶”是解剖部位,“肺炎”是疾病,两者在文本上重叠嵌套。扁平 BIO 标注无法同时表达这种重叠结构,需要层级解码或 span 抽取方案。选项 D 有迷惑性,但在实体识别层面它们都是独立实体类型。
Q7. 半监督自训练用于低资源 NER 时,最大的风险是什么?
- A.训练时间过长
- B.伪标签错误被放大形成自我强化偏差← 正确答案
- C.模型无法收敛
- D.不需要人工标注
答案:B。自训练用老师模型给无标注数据打伪标签,再训练学生模型。如果老师模型在某个实体类型上系统性犯错,伪标签会反复强化这些错误,导致学生模型“继承”并放大老师的偏见。训练时间、收敛问题不是该方法特有的风险。
Q8. 医学 NER 工程落地时,以下哪一项是合规方面的前置流程?
- A.调高模型参数量
- B.对电子病历做去标识化处理← 正确答案
- C.增加训练数据增强
- D.使用更复杂的解码器
答案:B。电子病历属于受保护的健康信息,落地前必须去标识化,移除姓名、身份证号等直接标识符,并遵循数据使用协议。调参量、数据增强、解码器都属于效果优化手段,不能替代隐私合规流程。
Q9. 以下哪些属于医学 NER 常见的实体类型?
- A.疾病诊断← 正确答案
- B.症状表现← 正确答案
- C.药物名称← 正确答案
- D.患者情绪
答案:ABC。疾病、症状、药物、解剖部位是医学 NER 的四类标准实体。患者情绪(如“焦虑”“紧张”)虽然可能出现在病历中,但不是本文讨论的标准实体类型,通常需要单独的意图或情感分析任务来处理。
Q10. 面对标注数据不足的低资源场景,哪些策略是有效的?
- A.在通用医学语料上预训练再微调← 正确答案
- B.用老师模型打伪标签做自训练← 正确答案
- C.用大模型提示学习做零样本抽取← 正确答案
- D.放弃 NER 改用规则匹配
答案:ABC。迁移学习、半监督自训练、提示学习都是缓解标注不足的有效手段。完全放弃 NER 退回纯规则匹配会丧失泛化能力,不是解决方案。实际项目中常组合使用多种策略,先用标注数据微调主干模型,再用半监督扩充语料。