想象你是刚入职的快递员阿城,第一天派件就拿到一张只有街道、没有任何建筑名字的空白城市地图。要在大街小巷中找到医院、学校、广场这些“地标”,你只能边走边猜。这正是自然语言处理中命名实体识别(NER)要解决的问题:机器读入一句自然语言,自动把“人名、地名、机构名”等关键片段圈出来,贴上对应标签。阿城的第一反应是用旧清单逐条比对,后来又学会沿街画框贴标签,最后干脆把整座城市的地图背下来——这三条路径,恰好对应 NER 的规则方法、序列标注框架和深度学习方法。读完这篇文章,你会像阿城一样,拿到任何一段文本都能熟练地标出它的“地标”。
掌握 NER 是从事信息抽取、知识图谱、智能问答等 NLP 应用的必备基本功。对内,它决定了上层系统能否从非结构化文本中提取结构化知识;对外,它直接影响搜索、推荐、客服等产品里“找得到人、认得出地、分得清机构”的核心体验。
可视化演示
动态演示命名实体识别NER入门指南的核心机制,通过采集/分析/决策/反馈四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
命名实体识别NER入门指南:命名实体 命名实体识别概述 命名实体识别原理 核心机制可视化 命名实体识别NER入门指南整体架构与关键组件
NER定义
阿城站在鸣城街头,手里的地图只有一条条路名,没有建筑标注。他要送信给“老城墙下的张老师”,可地图上根本找不到“老城墙”在哪。这时他意识到:必须先在地图上把有意义的地点圈出来——这就像机器面对一篇文章,字都认识,却不知道哪些片段值得注意。命名实体识别(NER)就是教机器做这件事:把文本里表示人名、地名、机构名等专有名词的连续片段找出来,并打上类别标签。
从技术上看,NER 是自然语言处理中信息抽取的第一步,也是知识图谱、问答系统、舆情分析的上游依赖。一个句子可以看成按顺序排列的词序列 \(w_1, w_2, \dots, w_n\),命名实体则是其中一段连续的字符窗口,比如“张三”“北京”“百度公司”。其形式化定义很简洁:每个实体用起止位置和类型三元组表示。
对人来说,圈地标是常识;对机器而言,这却是需要精心设计的任务。阿城手拿荧光笔,把地图上所有建筑名圈出来,再写上类别——这份“被标注的地图”,就是 NER 系统的输入输出样例,也是后面所有训练数据的雏形。
- 实体编号一个句子中可能同时出现多个实体,用下标 \(i\) 给它们编号。
- 起始位置\(s_i\) 表示第 \(i\) 个实体在句子中的起点下标,就像地图上区域左上角的坐标。
- 结束位置\(e_i\) 表示实体终点下标,必须满足 \(s_i \le e_i\),代表区域从起点到终点连续不断开。
- 类型标签\(t_i\) 从预定义的类型集合中取值,比如人名、地名、机构名,相当于给地图区域标注“这里是学校”“这里是广场”。
实体类型
阿城发现,地标不能只分“有名字”和“没名字”,还要贴门类标签:住户门口挂的是人名,路口指向牌写的是地名,高楼上挂着单位牌匾则是机构名。NER 同样先要定义“哪些类别值得识别”。最常见的三大类是人名(PER)、地名(LOC)和机构名(ORG);根据场景还能扩展出时间、日期、金额、产品名等类型。
不同数据集对实体类型的定义略有差异。比如通用新闻语料会区分“人名”和“地名”,而医疗文本中“疾病名”“药品名”才是重点。类型体系用集合 \(T\) 表示,就像地图图例。标注时,实体的类别必须从集合中挑选,不能随意造新类。
阿城把地图图例贴在车把上,每圈一个地标就顺手查一眼属于哪一类。这个“查图例”的步骤看似简单,却是后续一切标注与模型训练的前提——类型定得准,地图才画得清。
- 集合定义\(T\) 是所有允许出现的实体类型组成的集合,对应地图图例里的全部图标。
- 人名与地名PER 表示人名,比如“张三”;LOC 表示地名,比如“北京”“西湖”,对应地图上的住户名牌和路口指示牌。
- 机构类型ORG 表示机构组织,如“百度”“浙江大学”,对应城市里的大型单位建筑。
- 扩展类型TIME 和 MONEY 是面向具体任务的扩展类型,处理“2023年5月”“五百元”这类有结构化含义的片段。
规则方法
阿城最开始的偷懒办法,是找同事借来一张老旧的名录清单,上面写满他知道的地名和单位名。他骑车路过一个路口,就低头比对清单,名字对上了就圈出来。这就是基于规则的方法:靠词典和人工编写的规则去文本里“认名字”。规则方法也是 NER 早期最常用的方案,直到今天仍在小规模、领域固定的任务里占有一席之地。
规则方法主要包括三种武器:词典匹配用字符串精确查找来命中已知实体,正则模板用“数字+单位”这类模式抓时间日期,上下文规则根据前后词语推断当前片段是不是实体,比如“位于北京”中的“位于”提示后面跟着地名。它们的优点是不需要训练数据、解释性强;缺点是词典要长期维护,新词、变体、歧义都容易漏。
阿城的旧清单很快就露馅了:城市新开了一家“望月咖啡馆”,清单上没有,他送到门口也不敢确认。这正是规则方法的宿命——你见过多少地标,才能认多少地标。想认识没见过的地标,阿城必须换一种更灵活的认路方式。
- 地标总数\(N_{\text{total}}\) 表示文本中真实存在的命名实体总数,相当于整张地图上所有地标的总数。
- 命中个数\(N_{\text{hit}}\) 表示规则法真正识别出来的实体个数,比如旧清单成功匹配到的地名数量。
- 命中率两者相除得到 \(P\),值越大说明规则覆盖越全,但清单覆盖不到的新地标永远算不进去。
BIO标注
老快递员告诉阿城一个诀窍:别死背清单,沿街走的时候给每一块门牌都做记号——看到一排门面,第一块写上“开始”,后面的写“延续”,普通住户写“无关”。这就是BIO 序列标注:把分词后的每个词赋予一个标签,B(Begin)表示实体首词,I(Inside)表示实体内部词,O(Outside)表示非实体。实体边界完全由 B 和 I 的交替决定。
标注流程先对句子分词,然后逐词打标。例如“张三 昨天 去 了 北京”,理想标注是“张三→B-PER,昨天→O,去→O,了→O,北京→B-LOC”。如果换成“张小明”,则“张→B-PER,小明→I-PER”,I 延续前面的 B。这套标签体系把 NER 变成了一个“逐词分类”问题,让机器学习模型有了统一的学习目标。
有了 BIO 这套“沿街划线”的记号方法,阿城再也不用背诵清单。他只要记住每个格子是开头、延续还是无关,一整条街画完,地标自然就框出来了。这一个个字符级别的标签,正是后面统计模型和深度模型共同使用的“标准作业底稿”。
- B 标签当词 \(w_i\) 是某个实体 \(X\) 的第一个词时,标记为 B,相当于画框时落下第一笔。
- I 标签当 \(w_i\) 在实体内部但不是首词时,标记为 I,表示继续沿着框线画下去。
- O 标签当 \(w_i\) 不属于任何实体时记作 O,对应街道上那些不需要圈出来的普通门牌。
统计模型
阿城积累了一段时间经验后,不再机械地划线,而是学会了“猜”:看到“去北京”就猜“北京”八成是地名,看到“王经理说”就猜“王经理”是个人名。这种依赖上下文连贯性的判断,对应着统计序列模型:把标注问题看成在已知词序列的情况下,寻找概率最大的标签序列。经典代表是隐马尔可夫模型(HMM)和条件随机场(CRF)。
HMM 假设存在一条看不见的“标签链”(隐藏状态序列),每个标签以一定概率生成当前词(发射概率),标签之间按顺序转移(转移概率)。给定观测词序列 \(X\),模型计算所有可能标签序列 \(Y\) 的联合概率,再从中挑出概率最高的一条。数学上就是一连串概率相乘:
HMM 的“猜法”依赖一个很强的假设:当前标签只跟前一个标签有关。阿城发现这有时不够准——比如“北京市长”里的“北京”到底是地名还是职务前缀?CRF 模型允许使用更丰富的上下文特征,用全局归一化统筹整条链的概率,效果通常更好。但无论 HMM 还是 CRF,都需要人工设计特征,就像阿城要自己总结“看到'去'后面是地名”的经验口诀。
- 隐藏状态链\(Y_t\) 是第 \(t\) 个词的标签,比如 B-PER 或 O,\(Y_{t-1}\) 是前一个词的标签。
- 转移概率\(P(Y_t \mid Y_{t-1})\) 表示从前一个标签转移到当前标签的可能性,相当于“地标之后更可能接什么标签”。
- 发射概率\(P(X_t \mid Y_t)\) 表示当前标签生成当前词的可能性,比如 B-PER 标签下出现“张”姓的概率很高。
- 连乘求总概率从 \(t=1\) 到 \(T\) 把所有步骤的概率乘起来,得到整条标签链和词链的联合概率,概率最大的链就是识别结果。
深度模型
阿城的终极形态,是把整座城市的地图背得滚瓜烂熟,不必逐条比对清单,也不必依赖手工口诀,看一眼街景任何角落都能立刻反应出哪里是地标。深度学习方法就是这么干的:用神经网络在大规模标注数据上自动学习“什么样的片段像实体”。主流方案包括 BiLSTM、BiLSTM-CRF 以及基于 BERT 的微调模型。
BiLSTM 通过正向和反向两个 LSTM 读取整个句子,让每个词同时获得左右两侧的上下文信息,从而得到“发射分数”;CRF 层则负责约束标签之间的转移合法性,比如“B-PER 后面绝不能直接跟 I-LOC”。BERT 更进一步,用预训练语言模型为每个词生成富含语义的向量表示,微调后往往直接刷新精度纪录。这些模型的预测过程,可以概括为计算候选标签序列的得分:
深度模型让阿城几乎“人图合一”,看到任何新街景都能瞬间标出地标。但它也不是免费的午餐:需要大规模标注数据、GPU 算力和调试经验,而且模型的判断过程像一个难以解释的黑盒。在工业落地中,数据有限或要求强解释时,规则与统计方法依然有它们的用武之地。
- 发射分数\(E_t(Y_t)\) 是神经网络对第 \(t\) 个词输出“属于标签 \(Y_t\)”的置信度分数,来自 BiLSTM 或 BERT 的输出层。
- 转移分数\(T(Y_{t-1}, Y_t)\) 是 CRF 层学习到的标签转移权重,表示从 \(Y_{t-1}\) 到 \(Y_t\) 的衔接合理程度。
- 逐位累加把每个位置的两类分数加起来,再对整条序列求和,得到候选标签序列的总得分。
- 选择最优序列在所有合法的标签序列中,总得分最高的一条就是模型输出的实体标注结果。
评估实践
阿城的地标标注干得好不好,不能光靠他自己说,公司专门派了验收员抽查。验收员手里有一份“标准答案地图”,把阿城圈的地标逐一对照:圈对了几个、漏掉几个、多圈错圈几个,最后综合成一个分数。这就是 NER 的评估体系:以人工标注的黄金数据为基准,用精确率、召回率和 F1 衡量系统表现。
精确率(Precision)回答“标出来的那些里,有多少标对了”;召回率(Recall)回答“该标的那些里,有多少被找出来了”。两者往往此消彼长,所以常用 F1 作为综合指标。评估还需要标准的数据集,如中文的人民日报语料、英文的 CoNLL-2003,以及方便上手的开源工具如 LAC、HanLP、SpaCy。
验收员把分数报给阿城,阿城就明白了:只求圈得准不敢多圈,会漏掉地标;见框就圈,又会误报。真正的高手是两者兼得。评估指标就是阿城改进标注策略的“导航仪”,让他知道下一次该往“更准”还是“更全”的方向努力。
- 精确率 P识别结果中真正为实体的比例,公式分母是“识别出的实体总数”,分子是其中正确的个数。
- 召回率 R黄金标注中真正被找出的比例,分母是“真实实体总数”,衡量漏了多少。
- F1 调和平均当 P 和 R 都高时 F1 才高,它用一个数概括识别质量。
AI 应用场景
新闻信息抽取与知识图谱构建
阶段:信息抽取 → 知识图谱构建
解决的问题:每天成千上万篇新闻,靠人工读完全文提取“谁、在哪、做了什么事”几乎不可能。传统关键词搜索只能匹配字面,无法识别“马斯克”“特斯拉”“上海”之间的语义关系。NER 先把人名、地名、机构名从正文中自动切出来,后续关系抽取才能在这些实体之间建立连接。
具体案例:某财经资讯平台每天抓取 2 万篇财经新闻,用 NER 抽取出公司名、高管人名、城市名,再叠加关系抽取构建“企业-人物-地点”知识图谱,辅助用户快速检索某家公司与哪些机构有合作、高管变更信息等。上线后信息整理耗时从每天 6 人时降到 10 分钟。
医疗文本结构化
阶段:文本预处理 → 医学实体抽取
解决的问题:电子病历、检验报告都是非结构化自由文本,医生写“患者体温38.5℃,考虑上呼吸道感染”,机器需要抽出“38.5℃“对应的体温值和”上呼吸道感染”这个疾病名。传统规则词典很难覆盖海量医学别名,而定制化的 NER 模型可以识别疾病、症状、药品、剂量等多种医学实体,支撑后续的临床辅助决策。
具体案例:某互联网医院将 NER 应用于门诊病历结构化,抽取“主诉-现病史-诊断-用药”中的关键实体,自动填充电子表单,每年为医生减少约 30% 的文书录入时间,同时为流行病学统计提供了结构化数据源。
智能客服工单分类
阶段:用户意图识别 → 工单自动派发
解决的问题:客服工单里用户常写“我的 AirPods Pro 充电盒坏了,型号是 A2190”,传统分类靠关键词命中容易混淆产品线和问题类型。用 NER 把产品型号、故障现象、购买时间等实体从工单里抽出来,再配合分类器,就能把工单准确派给对应维修团队,并自动带上设备型号标签。
具体案例:某消费电子厂商在客服系统中引入 NER 抽取工单中的“产品名”“型号”“故障描述”,配合规则引擎自动生成维修预处理建议,工单平均处理时长缩短 22%,二次派单率下降 15%。
Python 演示
# -*- coding: utf-8 -*-"""简单规则NER演示: 词典 + 正则匹配 识别文本中的实体"""import re # 实体词典(类比: 快递员手里的旧版地标清单)NAME_DICT = {"张三", "李四", "王五"}PLACE_DICT = {"北京", "上海", "杭州", "西湖"}ORG_DICT = {"百度", "阿里", "腾讯", "浙江大学"} def lookup_dict(text): """词典匹配: 逐一查找词条, 命中即返回位置与类型""" found = [] for token in NAME_DICT | PLACE_DICT | ORG_DICT: for m in re.finditer(re.escape(token), text): if token in NAME_DICT: tag = "PER" elif token in PLACE_DICT: tag = "LOC" else: tag = "ORG" found.append((m.start(), m.end(), tag, token)) return found def match_number(text): """正则模板: 匹配 年-月-日 形式的时间实体""" pattern = r"\d{4}年\d{1,2}月\d{1,2}日" return [(m.start(), m.end(), "TIME", m.group()) for m in re.finditer(pattern, text)] def bio_encode(text, entities): """把命中的实体转换成字符级 BIO 标签序列""" labels = ["O"] * len(text) for start, end, tag, token in entities: labels[start] = "B-" + tag for i in range(start + 1, end): labels[i] = "I-" + tag return list(zip(list(text), labels)) def run(text): """主流程: 合并两类规则结果, 输出实体与BIO序列""" entities = lookup_dict(text) + match_number(text) entities.sort(key=lambda item: item[0]) print("原文:", text) for start, end, tag, token in entities: print(" %s -> %s" % (token, tag)) seq = bio_encode(text, entities) print("BIO:", " ".join("%s/%s" % (c, t) for c, t in seq)) if __name__ == "__main__": run("张三昨天从北京出发, 2023年5月10日抵达杭州西湖, 拜访百度的李四。")
NAME_DICT | PLACE_DICT | ORG_DICT把三个人名、地名、机构名词典合并成一个大集合统一遍历,对应快递员的“旧版地标清单”。re.finditer(re.escape(token), text)使用正则迭代器在原文中查找每个词典词条的所有出现位置,re.escape防止词条里的特殊字符干扰匹配。found.append((m.start(), m.end(), tag, token))记录每个实体的起始下标、结束下标、类型和原始文本,为下一步 BIO 编码保存位置信息。pattern = r"\d{4}年\d{1,2}月\d{1,2}日"用正则模板匹配“2023年5月10日”这类时间实体,对应规则方法里的“正则武器”。entities.sort(key=lambda item: item[0])按起始位置排序,保证输出顺序与原文顺序一致,方便观察。def bio_encode(text, entities)把实体区间展开成字符级 BIO 标签:首字符标B-类型,后续字符标I-类型,其余维持O。labels[start] = "B-" + tag实体第一个字符打上 B 标签,它是“画框落笔”的起点。" ".join("%s/%s" % (c, t) for c, t in seq)把每个字符和它的标签拼成“字/标签”格式并打印,让序列标注结果一目了然。
常见误区
误区我一直以为 NER 就是把句子里的名词标出来,和词性标注差不多,都是给词贴标签。
正解词性标注输出的是语法角色(名词、动词、形容词),而 NER 输出的是语义实体(人名、地名、机构名)。“北京”和“去”分别会被词性标注标为名词和动词,但 NER 只关心“北京”是地名实体,对“去”直接标记 O。就好比给地图上的建筑贴“用途标签”和给每个字注拼音,完全是两种体系。
为何常见:两者都是给文本贴标签,形式上很相似,初学者容易混淆任务目标。
误区既然把常用人名、地名存进词典就能识别,那 NER 还有什么难的呢?规则方法简单直接,应该够用了。
正解规则方法在封闭领域确实有效,但真实文本充满新词、变体、嵌套和歧义。比如“苹果”既可能是水果也可能是公司名,词典无法覆盖不断涌现的新地标;维护词典、正则模板的成本也随时间快速上升。就像快递员手里的旧清单,永远赶不上城市新建的速度,需要统计和深度模型来“猜”没见过的地标。
为何常见:规则方法的直觉性强、见效快,容易让人低估其天花板。
误区标注时只要保证每个词有 B、I、O 三个标签之一就行,反正模型会自己学。
正解B、I、O 的组合必须严格遵守合法性约束:I 前面必须是同类实体的 B 或 I,不能凭空出现“孤立的 I”;不同类型实体的标签也不能混接,比如 B-PER 后不能直接跟 I-LOC。标签质量直接决定模型学到的“地标边界”,乱标等于把地图上的框画得歪七扭八。
为何常见:把标注看成简单的三分类,忽略了标签之间的序列依赖关系。
误区BERT、BiLSTM-CRF 效果那么好,做 NER 无脑上深度学习就对了,规则和 CRF 都是过时技术。
正解深度学习效果好的前提是有大规模高质量标注数据和足够的算力。在标注样本很少、领域专有名词密集、或需要可解释性的场景下,规则方法快速可控,CRF 在小样本上泛化也常常优于深度模型。现实工程中常见做法是“规则兜底 + 深度模型主识别”,两者互补而非替代。
为何常见:被深度学习在公开榜单上的亮眼成绩吸引,忽略了实际落地时的数据与成本约束。
误区评估 NER 模型时只看精确率,精确率高说明标得准,就是好系统。
正解精确率高可能只是“保守派”——只标那些最有把握的实体,自然标一个对一个,但漏掉大量实体。召回率衡量“该标出来的有多少被找到”,两者需要平衡。就像快递员只送最有把握的两封信,准确率百分之百,但剩下八封全漏了,依然不合格。F1 综合两个指标,才是更公允的评判标准。
为何常见:精确率概念直观、易算,容易被当成唯一指标而忽略召回率的损失。
面试题
Q1. NER 任务的核心目标是什么?
- A.从文本中识别命名实体并分类← 正确答案
- B.给文本中的词标注语法角色
- C.将文本翻译成另一种语言
- D.判断整段文本的情感倾向
答案:A。NER 的目标是从非结构化文本中抽取人名、地名、机构名等连续片段并贴上类型标签。选项 B 是词性标注,C 是机器翻译,D 是情感分析,它们的任务定义都与 NER 不同。
Q2. 下列哪一组属于典型的命名实体类型?
- A.人名、地名、机构名← 正确答案
- B.动词、形容词、副词
- C.主语、谓语、宾语
- D.句号、逗号、分号
答案:A。人名(PER)、地名(LOC)、机构名(ORG)是 NER 最常见的三大实体类型。选项 B 是词性,C 是句法成分,D 是标点符号,都不属于命名实体的范畴。
Q3. 在 BIO 标注体系中,字母 I 表示什么?
- A.实体的内部延续词← 正确答案
- B.实体的起始词
- C.不参与标注的词
- D.句子的结束词
答案:A。B 表示实体首词(Begin),I 表示实体内部词(Inside),O 表示非实体(Outside)。I 的作用是延续实体边界,因此正确答案是“实体的内部延续词”。
Q4. 基于词典匹配的 NER 方法最大的局限是什么?
- A.无法识别词典外的未登录词← 正确答案
- B.匹配速度极其缓慢
- C.完全不支持中文文本
- D.必须依赖 GPU 加速训练
答案:A。词典匹配只能命中已收录词条,对新词、缩写、变体无能为力,这是其核心短板。匹配速度通常很快,中文文本也能处理,且它根本不需要 GPU 训练,因此其余选项都不成立。
Q5. HMM 序列标注模型联合概率的核心组成部分是?
- A.转移概率与发射概率← 正确答案
- B.分类误差与梯度
- C.卷积核与池化层
- D.词频与逆文档频率
答案:A。HMM 的联合概率由标签间转移概率 \(P(Y_t\mid Y_{t-1})\) 和标签生成词的发射概率 \(P(X_t\mid Y_t)\) 相乘而来。分类误差与梯度属于神经网络训练概念,卷积与池化是 CNN 组件,词频与 IDF 是检索权重,均与 HMM 无关。
Q6. 评估 NER 模型效果时,通常最关注哪项综合指标?
- A.F1 分数← 正确答案
- B.代码覆盖率
- C.显存占用率
- D.编译通过率
答案:A。F1 是精确率与召回率的调和平均,能综合反映“标得准”和“标得全”。代码覆盖率、显存占用、编译通过率都是软件工程或系统性能指标,不用于评估模型识别质量。
Q7. 相比 HMM,线性链 CRF 在序列标注中的主要优势是什么?
- A.全局归一化且可用任意特征← 正确答案
- B.完全无监督无需标注数据
- C.只能处理英文单一语种
- D.完全不需要特征工程
答案:A。HMM 要求强独立性假设,特征只能来源于当前词和相邻状态;CRF 用全局归一化,可以灵活组合任意上下文特征,缓解标注偏置问题。CRF 仍是有监督模型、支持多语种、依赖特征工程,因此 B、C、D 均错误。
Q8. 以下哪些方法可以用于实现命名实体识别?
- A.词典与正则规则匹配← 正确答案
- B.BIO 序列标注框架← 正确答案
- C.CRF 统计序列模型← 正确答案
- D.BERT 预训练模型微调← 正确答案
答案:ABCD。规则方法、序列标注框架、统计模型、深度模型是 NER 发展的四条技术路线。词典规则是早期方案,BIO 是统一标注格式,CRF 是经典统计模型,BERT 微调是当前主流深度方案,四个选项都正确。
Q9. BiLSTM-CRF 模型中,CRF 层的主要作用是什么?
- A.约束标签转移的合法性← 正确答案
- B.生成词向量表示
- C.对文本进行分词
- D.降低模型参数量
答案:A。BiLSTM 负责编码上下文并输出每个词的标签分数,CRF 层则学习标签间的转移约束,确保输出序列合法,如“B-PER 后不能跟 I-LOC”。词向量由嵌入层生成,分词是预处理步骤,CRF 也不负责压缩参数量。
Q10. 下列哪些属于常见的命名实体类型?
- A.人名类实体← 正确答案
- B.机构类实体← 正确答案
- C.地名类实体← 正确答案
- D.情感类词汇
答案:ABC。人名(PER)、机构名(ORG)、地名(LOC)是 NER 的三大基本实体类型。情感类词汇属于情感分析的研究对象,不属于命名实体,因此 D 不选。