我的数字花园
← 返回文章列表
17 分钟阅读

理解命名实体识别

一篇关于NER学习笔记

命名实体识别教程:从零开始

前言:学完这份教程,你应该能做什么

学完本教程后,你应该能够:

  1. 用自己的话解释什么是命名实体识别。
  2. 区分命名实体识别、文本分类和关系抽取。
  3. 看懂 BIO、BMES、BMESO 等标注格式。
  4. 制定一份基本的实体标注规范。
  5. 构建命名实体识别训练数据。
  6. 理解规则、词典、CRF、BERT 等方法的作用。
  7. 训练并评估一个基本的命名实体识别模型。
  8. 使用词典、规则、大模型预标注等弱监督方法降低人工成本。
  9. 理解“实体特征”究竟是什么,以及为什么不能简单地把颜色或实体名称直接交给模型。
  10. 在实体识别完成后,继续完成实体关系判断。

第一章:从第一性原理理解命名实体识别

1.1 计算机看到的不是“人名”,而是一串符号

人看到下面这句话:

张三在北京大学学习人工智能。

可以很快判断:

  • 张三:人物
  • 北京大学:组织机构
  • 人工智能:专业领域或技术术语

但是计算机最开始看到的只是字符或数字编号,例如:

张 三 在 北 京 大 学 学 习 人 工 智 能

或者经过分词后:

张三 / 在 / 北京大学 / 学习 / 人工智能

对于计算机来说,“张三”和“北京大学”最开始并没有天然的类别。

因此,命名实体识别要解决的第一个问题是:

文本中的哪些字符或词组成一个实体?

第二个问题是:

这个实体属于什么类别?

所以,从第一性原理看:

命名实体识别 = 找边界 + 判类别

其中:

  • 找边界:确定实体从哪里开始,到哪里结束。
  • 判类别:确定实体是人名、地点、机构,还是其他类型。

1.2 什么是命名实体

“实体”可以简单理解为:

文本中能够被单独识别、分类或引用的对象。

常见实体类型包括:

类型 英文缩写 示例
人物 PER 张三、马云、李白
地点 LOC 北京、上海、长江
机构 ORG 北京大学、腾讯、联合国
时间 TIME 上午八点、2026年8月
日期 DATE 8月2日、明天
产品 PRODUCT iPhone、微信
疾病 DISEASE 肺炎、糖尿病
药物 DRUG 阿司匹林
事件 EVENT 奥运会、世界大战
技术 TECHNOLOGY 人工智能、机器学习

实体类型并不是固定不变的。

例如,在医疗项目中,可能需要:

  • 疾病
  • 症状
  • 药物
  • 检查项目
  • 身体部位

在电商项目中,可能需要:

  • 商品
  • 品牌
  • 型号
  • 颜色
  • 尺寸
  • 材质

因此,实体类型必须由具体业务目标决定。


1.3 命名实体识别的形式化定义

假设输入文本是:

张三在北京大学学习

把文本表示为字符序列:

X = [张, 三, 在, 北, 京, 大, 学, 学, 习]

模型需要为每个字符输出一个标签:

Y = [B-PER, E-PER, O, B-ORG, M-ORG, M-ORG, E-ORG, O, O]

其中:

  • B-PER:人物实体开始。
  • E-PER:人物实体结束。
  • B-ORG:机构实体开始。
  • M-ORG:机构实体中间。
  • E-ORG:机构实体结束。
  • O:不属于任何实体。

最后恢复出的实体是:

张三 → PER
北京大学 → ORG

从数学上看,命名实体识别可以表示为:

输入:字符或词序列 X = x1, x2, ..., xn
输出:标签序列 Y = y1, y2, ..., yn

模型学习的是:

P(Y | X)

也就是:

给定一段文本,哪一种标签序列最合理?


1.4 用费曼学习法复述

现在不要看上面的定义,尝试回答:

命名实体识别到底在做什么?

一个合格的简单回答是:

命名实体识别就是让计算机从一句话中圈出重要对象,并告诉我们每个对象是什么类型。

例如:

张三去了北京。

计算机需要输出:

张三:人物
北京:地点

如果你能够把这件事讲给一个完全不了解人工智能的人,说明你已经建立了基本直觉。


第二章:命名实体识别、文本分类和关系抽取有什么区别

这是初学者最容易混淆的三个任务。


2.1 文本分类

文本分类判断的是:

整段文本属于什么类别?

例如:

这款手机运行速度很快。

分类结果可能是:

正面评价

或者:

数码产品评论

文本分类通常是一段文本对应一个或几个标签。

形式为:

文本 → 类别

例如:

“退款一直没有到账” → 售后问题
“怎么修改密码” → 账户问题

2.2 命名实体识别

命名实体识别判断的是:

文本中的哪些局部片段是实体?它们是什么类型?

例如:

张三在北京大学学习。

输出:

张三 → 人物
北京大学 → 机构

形式为:

文本片段 → 实体类型

2.3 关系抽取

关系抽取判断的是:

两个实体之间存在什么关系?

例如:

张三在北京大学学习。

已经识别出:

张三 → 人物
北京大学 → 机构

关系抽取继续判断:

张三 —就读于→ 北京大学

再例如:

马云创立了阿里巴巴。

实体识别结果:

马云 → 人物
阿里巴巴 → 机构

关系抽取结果:

马云 —创立→ 阿里巴巴

2.4 三个任务的区别

任务 判断对象 示例输出
文本分类 整段文本 新闻类别:体育
命名实体识别 文本中的局部片段 姚明:人物
关系抽取 两个实体之间的关系 姚明:效力于:火箭队

可以把完整的信息抽取过程理解为:

第一步:发现实体
第二步:判断实体类型
第三步:判断实体之间的关系

例如:

苹果公司在美国发布了iPhone。

实体识别:

苹果公司 → 机构
美国 → 地点
iPhone → 产品

关系抽取:

苹果公司 —发布→ iPhone
苹果公司 —位于或所属国家→ 美国

第三章:为什么不能直接“把红色和蓝色拿出来”

在标注工具中,我们可能看到:

  • 红色代表人物。
  • 蓝色代表机构。
  • 绿色代表地点。

于是很容易产生一个疑问:

实体已经被标成红色和蓝色了,直接把红色、蓝色拿出来不就可以了吗?

这个理解对于“读取已经标好的结果”是正确的,但对于“训练模型识别新文本”是不完整的。


3.1 颜色是展示结果,不是原始特征

假设标注界面显示:

[张三]红色 在 [北京大学]蓝色 学习

这里的红色和蓝色,是标注系统为了方便人类观察而增加的视觉表示。

模型实际接收到的通常不是颜色,而是类似下面的数据:

{
  "text": "张三在北京大学学习",
  "entities": [
    {
      "start": 0,
      "end": 2,
      "label": "PER",
      "text": "张三"
    },
    {
      "start": 3,
      "end": 7,
      "label": "ORG",
      "text": "北京大学"
    }
  ]
}

因此:

红色、蓝色 = 人类界面中的可视化
PER、ORG = 模型训练使用的类别标签

如果新输入一句:

李明毕业于清华大学。

它还没有红色和蓝色。

模型必须根据训练中学到的规律判断:

  • 李明可能是人物。
  • 清华大学可能是机构。

3.2 什么是实体特征

实体特征是指:

能够帮助模型判断某段文字是不是实体、属于什么类型的信息。

例如,“北京大学”的特征可能包括:

字面特征

包含“大学”

词典特征

出现在学校名称词典中

上下文特征

前面出现“就读于”
后面出现“毕业”

字符特征

“北京”经常与地点有关
“大学”经常与机构有关

语义特征

整个短语表示一个教育机构

位置特征

位于“就读于”和“学习”之间

现代神经网络通常会把这些信息编码成一组数字向量。

例如:

北京大学 → [0.12, -0.37, 0.81, ...]

这个数字向量被称为:

表示、向量表示、嵌入或特征表示

3.3 实体特征不能脱离上下文

考虑“苹果”这个词。

句子一:

我今天买了三个苹果。

这里的“苹果”是水果。

句子二:

苹果发布了新款手机。

这里的“苹果”是公司。

如果只看“苹果”两个字,无法稳定判断类别。

必须结合上下文:

三个、吃、甜 → 更像水果
发布、公司、手机 → 更像企业

因此,实体识别不是简单地背诵词表,而是:

词本身的信息 + 前后文信息 + 句子整体语义

3.4 关系判断不能只看两个实体本身

假设已经识别出:

张三 → 人物
北京大学 → 机构

仅仅知道这两个实体,还不能确定关系。

比较以下句子:

张三就读于北京大学。
张三参观了北京大学。
张三批评了北京大学。
张三向北京大学捐款。

同样是“张三”和“北京大学”,关系分别可能是:

  • 就读于
  • 参观
  • 批评
  • 捐赠

因此,关系抽取通常需要:

实体1特征
+ 实体2特征
+ 两个实体之间的文本
+ 整句话的上下文
+ 两个实体的位置关系

可以表示为:

关系 = f(实体1, 实体2, 上下文)

第四章:命名实体识别的标注方法

4.1 为什么不能只写实体类别

假设一句话是:

张三去了北京大学

如果只给每个字符标注实体类别:

张 PER
三 PER
去 O
了 O
北 ORG
京 ORG
大 ORG
学 ORG

模型虽然知道哪些字符属于人物或机构,却不一定知道:

  • 实体从哪里开始。
  • 实体在哪里结束。
  • 相邻的同类实体是否是同一个实体。

例如:

张三李四

如果四个字都是 PER,模型无法确定它表示:

张三、李四

还是:

张三李四

所以需要在标签中加入边界信息。


4.2 BIO 标注体系

BIO 是最常见的标注格式之一。

  • B:Begin,实体开始。
  • I:Inside,实体内部。
  • O:Outside,不属于实体。

例如:

张三在北京大学学习

标注为:

字符 标签
B-PER
I-PER
O
B-ORG
I-ORG
I-ORG
I-ORG
O
O

恢复实体时:

B-PER + I-PER → 张三
B-ORG + I-ORG + I-ORG + I-ORG → 北京大学

4.3 BIOES 标注体系

BIOES 在 BIO 的基础上增加了:

  • E:End,实体结束。
  • S:Single,单字或单词实体。

例如:

张三在北京

可以标为:

字符 标签
B-PER
E-PER
O
B-LOC
E-LOC

如果有单字实体:

他姓王。

“王”作为单字符实体,可以标为:

S-PER

4.4 BMESO 标注体系

BMESO 与 BIOES 本质接近。

  • B:Begin,实体开始。
  • M:Middle,实体中间。
  • E:End,实体结束。
  • S:Single,单字符实体。
  • O:Outside,非实体。

例如:

张三在北京大学学习

标注结果:

字符 标签
B-PER
E-PER
O
B-ORG
M-ORG
M-ORG
E-ORG
O
O

再例如:

王去了上海

假设“王”是人物:

字符 标签
S-PER
O
O
B-LOC
E-LOC

4.5 BIO、BIOES 和 BMESO 怎么选择

三者都可以完成实体识别。

BIO 的优点

  • 简单。
  • 使用广泛。
  • 标签数量较少。
  • 很多开源项目直接支持。

BIOES 或 BMESO 的优点

  • 实体边界更加明确。
  • 单字符实体可以单独标记。
  • 对短实体较多的中文任务比较友好。

对于中文字符级命名实体识别,可以优先考虑:

BMESO

但必须保证:

训练、验证、测试和预测时使用同一种标签格式。


第五章:从零设计一个命名实体识别任务

5.1 第一步:确定业务目标

不要一开始就训练模型。

首先要回答:

我为什么要识别这些实体?

例如,用户输入:

帮我查询张三购买的华为Mate 80订单。

如果业务目标是客服查询,可能需要识别:

  • 用户名
  • 品牌
  • 商品型号
  • 订单号

如果目标只是判断投诉类型,则可能不需要实体识别,只需要文本分类。

所以第一原则是:

先确定最终要解决的问题,再设计实体类别。

5.2 第二步:定义实体类别

假设要处理招聘信息,可以定义:

PERSON:人物
COMPANY:公司
POSITION:职位
LOCATION:工作地点
SALARY:薪资
SKILL:技能

示例:

腾讯在深圳招聘Python开发工程师,月薪三万元。

标注结果:

腾讯 → COMPANY
深圳 → LOCATION
Python → SKILL
开发工程师 → POSITION
三万元 → SALARY

5.3 实体类别不要过多

初学项目常见错误是一次定义几十种实体。

例如:

  • 公司
  • 学校
  • 政府机构
  • 医院
  • 研究机构
  • 社会组织
  • 国际组织
  • 非营利组织

如果数据量很少,这些细分类别容易相互混淆。

更稳妥的方法是先合并:

ORG:机构

等数据量足够、业务确实需要时,再进行细分。

设计类别时可以问三个问题:

  1. 这个类别是否对最终业务有用?
  2. 标注人员能否稳定地区分它?
  3. 每个类别是否有足够训练样本?

5.4 第三步:编写标注规范

标注规范必须回答:

  • 实体边界如何确定?
  • 是否包含修饰词?
  • 简称是否标注?
  • 代词是否标注?
  • 嵌套实体如何处理?
  • 不完整实体如何处理?
  • 歧义如何处理?

例如:

著名演员张三

人物实体应该标:

张三

而不是:

著名演员张三

因为“著名演员”是身份描述,不属于姓名本身。

再例如:

北京大学医学部

可以有两种规范:

方案一:标注整个机构。

北京大学医学部 → ORG

方案二:只标注核心机构。

北京大学 → ORG

两种方案不一定谁绝对正确,关键是整个数据集必须保持一致。


5.5 边界一致性比“偶尔更准确”更重要

假设有以下表达:

腾讯公司
阿里巴巴集团
北京大学计算机学院

必须提前规定:

  • “公司”是否包含在机构实体中?
  • “集团”是否包含?
  • “学院”是否包含?
  • 机构下面的部门是否作为整体标注?

如果同一个数据集中:

腾讯公司 → 有时标“腾讯”,有时标“腾讯公司”

模型会收到互相矛盾的训练信号。

对于机器学习数据:

一致但略粗糙,通常优于精细但混乱。

5.6 嵌套实体问题

例如:

北京大学人民医院

其中可能包含:

北京大学 → ORG
北京大学人民医院 → ORG

这叫嵌套实体。

传统 BIO 或 BMESO 序列标注通常无法在同一层同时表示两个重叠实体。

常见处理方式有:

  1. 只标注最长实体。
  2. 只标注最具体实体。
  3. 分层标注。
  4. 使用支持嵌套实体的跨度模型。
  5. 将不同类型拆成多个标注层。

初学项目建议:

提前规定只保留最长、最完整的实体。

第六章:数据从哪里来

6.1 人工标注

最可靠的方法是人工阅读文本并标注实体。

流程通常为:

原始文本
→ 制定规范
→ 人工标注
→ 二次审核
→ 解决分歧
→ 导出数据

高质量的小数据集,往往比大量混乱数据更有价值。


6.2 词典自动标注

如果已经有实体词典:

人物词典:
张三
李四
王五

机构词典:
北京大学
清华大学
腾讯

可以在文本中进行字符串匹配。

例如:

张三毕业于北京大学。

通过词典找到:

张三 → PER
北京大学 → ORG

优点:

  • 速度快。
  • 容易实现。
  • 可以快速生成初始数据。

缺点:

  • 无法识别词典之外的新实体。
  • 容易产生歧义。
  • 可能发生长短词冲突。

例如:

北京
北京大学
北京大学医学部

一般需要采用:

最长匹配优先

6.3 正则表达式

正则适合结构比较固定的实体。

例如手机号:

1[3-9]\d{9}

身份证号、邮箱、日期、订单号、网址等,也可以通过正则识别。

例如:

我的订单号是AB202608021234。

可以通过规则识别:

AB202608021234 → ORDER_ID

规则对于格式稳定的实体往往比复杂模型更可靠。


6.4 大模型预标注

可以让大语言模型先对数据进行初步标注,再由人工核查。

提示词示例:

请识别下面文本中的人物、机构和地点。

要求:
1. 只输出JSON。
2. start为实体起始字符位置。
3. end为实体结束位置,不包含end位置。
4. 不确定时不要猜测。

文本:
张三在北京大学参加会议。

期望输出:

{
  "entities": [
    {
      "text": "张三",
      "type": "PER",
      "start": 0,
      "end": 2
    },
    {
      "text": "北京大学",
      "type": "ORG",
      "start": 3,
      "end": 7
    }
  ]
}

大模型预标注不能完全代替人工审核,尤其需要检查:

  • 字符位置是否准确。
  • 实体边界是否一致。
  • 是否出现凭空添加。
  • 是否遗漏短实体。
  • 同类实体标准是否统一。

第七章:什么是弱监督

7.1 弱监督的基本思想

强监督通常指:

每一条数据都由人工准确标注。

弱监督指:

通过词典、规则、现有数据库、模型或大语言模型生成不完全可靠的标签。

这些标签可能存在噪声,但能够降低人工成本。


7.2 常见弱监督来源

词典

北京大学 → ORG
腾讯 → ORG

正则规则

2026年8月2日 → DATE
13812345678 → PHONE

远程监督

如果知识库中存在:

马云:人物
阿里巴巴:机构

就可以在包含这些名称的文本中自动生成候选标签。

大模型标注

让大模型生成实体和类别。

旧模型预测

使用已有模型对新数据预标注,再由人工纠正。


7.3 推荐的弱监督流程

比较实用的流程是:

第一步:词典和规则生成候选标签
第二步:大模型或现有模型补充候选
第三步:人工只核查错误和冲突
第四步:训练第一版模型
第五步:让模型预标注更多数据
第六步:继续人工核查困难样本
第七步:重新训练

这是一种人机协作循环。


7.4 主动学习

主动学习不是随机挑选数据让人标注,而是让模型挑选自己最不确定的数据。

例如:

模型对普通句子非常确定:

北京大学 → ORG,置信度0.99

对另一句话不确定:

苹果发布新品。

可能预测:

苹果 → ORG,置信度0.55
苹果 → PRODUCT,置信度0.40

这类样本更值得人工检查。

主动学习流程:

训练模型
→ 模型预测未标注数据
→ 找出低置信度或冲突样本
→ 人工标注
→ 加入训练集
→ 重新训练

这样可以减少大量重复、简单的人工工作。


第八章:命名实体识别模型的发展思路

8.1 规则和词典方法

最简单的方法是:

文本中出现“北京大学”
→ 标记为机构

规则方法本质上是人工总结特征。

优点:

  • 可解释。
  • 不需要训练。
  • 对固定格式数据效果好。

缺点:

  • 无法灵活处理变化。
  • 维护成本高。
  • 泛化能力弱。

8.2 传统机器学习方法

传统方法会人工设计特征,例如:

  • 当前字符。
  • 前一个字符。
  • 后一个字符。
  • 字符是否为数字。
  • 字符是否为大写字母。
  • 是否出现在词典中。
  • 前后是否出现“公司”“大学”等词。

然后使用:

  • 隐马尔可夫模型 HMM。
  • 条件随机场 CRF。
  • 最大熵模型。

其中 CRF 曾经是序列标注任务中的经典方法。

CRF 的重要思想是:

不仅考虑每个字符的标签,还考虑相邻标签之间是否合理。

例如:

B-PER 后面接 E-PER

通常是合理的。

但:

O 后面直接接 M-PER

通常不合理,因为实体中间标签前面没有实体开始标签。


8.3 BiLSTM-CRF

BiLSTM 可以同时读取:

  • 当前字符左边的上下文。
  • 当前字符右边的上下文。

例如在:

苹果发布了新手机

模型可以结合“发布”“手机”判断“苹果”更可能是公司。

BiLSTM 负责学习上下文特征,CRF 负责寻找整体合理的标签序列。

结构可以理解为:

字符
→ 字符向量
→ BiLSTM提取上下文
→ 线性分类层
→ CRF输出最终标签

8.4 BERT 类预训练模型

BERT 类模型先在大量文本上学习语言规律,再针对命名实体识别进行微调。

基本流程:

文本
→ 分词器
→ 预训练语言模型
→ 每个位置的上下文向量
→ 标签分类层
→ BIO或BMESO标签

它的优势是能够根据上下文生成不同表示。

例如“苹果”在两个句子中的向量会不同:

我吃了一个苹果。
苹果发布了新手机。

因为上下文不同,模型能够学习:

  • 第一个“苹果”更像水果。
  • 第二个“苹果”更像公司。

8.5 生成式命名实体识别

也可以让生成式模型直接输出:

[
  {
    "text": "张三",
    "type": "PER"
  },
  {
    "text": "北京大学",
    "type": "ORG"
  }
]

优点:

  • 不需要严格使用 BIO 标签。
  • 容易支持复杂类别说明。
  • 少样本场景下使用方便。

缺点:

  • 可能漏实体。
  • 可能生成原文中不存在的内容。
  • 字符位置不一定准确。
  • 输出格式可能不稳定。
  • 大批量调用成本较高。

因此,对于需要严格字符位置的工业任务,通常需要增加:

  • JSON 格式约束。
  • 实体必须来自原文的检查。
  • 起止位置校验。
  • 后处理与人工审核。

第九章:训练数据的格式

9.1 Span 格式

Span 表示实体在原文中的开始和结束位置。

{
  "text": "张三在北京大学学习",
  "entities": [
    {
      "start": 0,
      "end": 2,
      "label": "PER"
    },
    {
      "start": 3,
      "end": 7,
      "label": "ORG"
    }
  ]
}

通常规定:

start 包含
end 不包含

所以:

text[0:2] = 张三
text[3:7] = 北京大学

必须统一位置规则,否则容易出现偏移错误。


9.2 序列标签格式

也可以保存为:

张 B-PER
三 E-PER
在 O
北 B-ORG
京 M-ORG
大 M-ORG
学 E-ORG
学 O
习 O

句子之间用空行分隔:

张 B-PER
三 E-PER
在 O
北 B-ORG
京 M-ORG
大 M-ORG
学 E-ORG

李 B-PER
四 E-PER
去 O
了 O
上 B-LOC
海 E-LOC

9.3 数据集划分

通常将数据划分为:

训练集
验证集
测试集

例如:

训练集:80%
验证集:10%
测试集:10%

作用分别是:

训练集

用于更新模型参数。

验证集

用于:

  • 调整超参数。
  • 选择最佳模型。
  • 判断是否过拟合。

测试集

只在最终评估时使用。

不能一边查看测试集结果,一边不断调整模型,否则测试集就失去了客观性。


9.4 防止数据泄漏

假设同一份文档被切成多个句子。

如果部分句子进入训练集,另外部分进入测试集,模型可能通过相似上下文“记住”答案。

更稳妥的方法是:

按文档、用户、案件、患者或来源划分数据

而不是完全随机按句子划分。


第十章:模型训练的完整流程

10.1 一个标准流程

1. 收集原始文本
2. 定义实体类别
3. 编写标注规范
4. 标注少量试验数据
5. 检查标注一致性
6. 正式标注
7. 划分训练集、验证集、测试集
8. 选择分词器和模型
9. 将实体位置转换为序列标签
10. 训练模型
11. 在验证集上选择模型
12. 在测试集上评估
13. 分析错误
14. 补充困难样本
15. 重新训练
16. 部署预测服务

10.2 训练不是整个项目最困难的部分

很多初学者认为:

选一个更强的模型,就能获得更好结果。

实际项目中,结果往往更受以下因素影响:

  1. 实体定义是否合理。
  2. 标注边界是否一致。
  3. 数据是否覆盖真实场景。
  4. 是否包含足够困难样本。
  5. 训练集和实际使用数据是否同分布。
  6. 后处理规则是否正确。

可以粗略理解为:

高质量数据 + 清晰任务定义
通常比盲目更换复杂模型更重要

第十一章:如何评价模型效果

11.1 Precision:精确率

精确率回答:

模型识别出来的实体中,有多少是真的?

公式:

Precision = 正确识别的实体数 / 模型识别出的实体总数

例如,模型识别了 100 个实体,其中 80 个正确:

Precision = 80 / 100 = 0.8

精确率高说明:

模型不容易乱报实体

11.2 Recall:召回率

召回率回答:

所有真正存在的实体中,模型找出了多少?

公式:

Recall = 正确识别的实体数 / 实际实体总数

例如,测试集中实际有 100 个实体,模型正确找出 80 个:

Recall = 80 / 100 = 0.8

召回率高说明:

模型不容易漏掉实体

11.3 F1 值

F1 综合考虑精确率和召回率:

F1 = 2 × Precision × Recall / (Precision + Recall)

例如:

Precision = 0.80
Recall = 0.60

则:

F1 ≈ 0.686

11.4 必须采用实体级评估

假设真实实体是:

北京大学

模型只识别出:

北京

虽然前两个字符正确,但实体边界不完整。

严格的实体级评估通常将其算作错误。

正确条件包括:

实体起点正确
+ 实体终点正确
+ 实体类型正确

三者同时满足,才算识别正确。


11.5 Micro F1 和 Macro F1

Micro F1

将所有类别的实体放在一起统计。

样本多的类别影响更大。

Macro F1

分别计算每个类别的 F1,再求平均值。

每个类别权重相同。

如果数据类别不平衡,建议同时查看:

整体 Micro F1
每个类别的 Precision、Recall、F1

否则,一个数量特别多的简单类别可能掩盖小类别的问题。


第十二章:常见错误分析

12.1 边界错误

真实答案:

北京大学计算机学院

模型预测:

北京大学

类型可能正确,但边界不完整。

解决方法:

  • 统一标注规范。
  • 增加相似长实体。
  • 检查最大文本长度。
  • 检查分词对齐。
  • 使用更适合跨度识别的方法。

12.2 类型错误

真实答案:

苹果 → ORG

模型预测:

苹果 → PRODUCT

原因可能是:

  • 上下文不足。
  • 两类数据分布相似。
  • 类别定义重叠。
  • 训练数据中“苹果”大部分表示产品。

解决方法:

  • 增加不同上下文中的同名实体。
  • 检查类别定义。
  • 添加更长上下文。
  • 对混淆类别单独分析。

12.3 漏识别

真实存在实体,模型没有识别。

可能原因:

  • 训练数据中没有相似表达。
  • 实体过长。
  • 实体非常少见。
  • 类别样本数量过少。
  • 文本被截断。

解决方法:

  • 补充困难样本。
  • 使用主动学习。
  • 增加词典特征。
  • 调整文本最大长度。
  • 检查标签映射和分词。

12.4 误识别

普通文本被错误识别成实体。

例如:

大学生活很丰富。

模型错误地把“大学”识别成机构。

原因是模型可能学到了:

看到“大学”就倾向于判断为机构

但没有理解“大学生活”中的“大学”不是具体机构名称。

解决方法是增加反例:

大学生活
大学期间
大学阶段
医院工作
公司制度

反例的价值在于告诉模型:

包含某个关键词,不代表一定是实体。

第十三章:从命名实体识别走向关系抽取

13.1 两阶段方法

第一阶段识别实体:

张三 → PERSON
北京大学 → ORGANIZATION

第二阶段枚举实体对:

(张三, 北京大学)

然后预测关系:

就读于

完整结果:

张三 —就读于→ 北京大学

13.2 关系分类输入

可以构造:

[实体1]张三[/实体1]在[实体2]北京大学[/实体2]学习。

让模型判断:

关系类别:就读于

还可以设置:

无关系

因为不是任意两个实体之间都存在业务关系。


13.3 实体顺序非常重要

例如:

张三就读于北京大学

关系是:

张三 —就读于→ 北京大学

不能反过来写成:

北京大学 —就读于→ 张三

因此关系通常包含方向:

头实体、关系、尾实体

也称为:

Subject、Predicate、Object

即三元组:

(张三, 就读于, 北京大学)

13.4 “主属约或为关系”如何理解

两个实体之间可能存在多种关系,例如:

所属关系

计算机学院 —属于→ 北京大学

任职关系

张三 —任职于→ 腾讯

创建关系

马云 —创立→ 阿里巴巴

位于关系

北京大学 —位于→ 北京

使用关系

系统 —使用→ Python

治疗关系

阿司匹林 —治疗→ 某种疾病

关系类别也必须根据业务目标提前定义。


第十四章:一个最小可运行项目

14.1 项目目标

识别三类实体:

PER:人物
ORG:机构
LOC:地点

14.2 示例数据

文本一:

张三在北京大学学习。

实体:

张三 → PER
北京大学 → ORG

文本二:

李四去了上海。

实体:

李四 → PER
上海 → LOC

文本三:

腾讯总部位于深圳。

实体:

腾讯 → ORG
深圳 → LOC

14.3 BMESO 标注

第一句:

张 B-PER
三 E-PER
在 O
北 B-ORG
京 M-ORG
大 M-ORG
学 E-ORG
学 O
习 O
。 O

第二句:

李 B-PER
四 E-PER
去 O
了 O
上 B-LOC
海 E-LOC
。 O

第三句:

腾 B-ORG
讯 E-ORG
总 O
部 O
位 O
于 O
深 B-LOC
圳 E-LOC
。 O

14.4 最小训练路线

对于第一次实践,可以按照以下路线:

1. 收集500到2000条领域文本
2. 先标注100条
3. 检查类别和边界定义
4. 修改标注规范
5. 再正式标注
6. 使用预训练语言模型做序列标注
7. 计算实体级F1
8. 查看错误样本
9. 补充高频错误类型
10. 重新训练

样本数量不是绝对标准。

如果文本模式简单、实体固定,少量数据也可能有效。

如果语言复杂、实体类别很多、领域变化大,则需要更多数据。


第十五章:如何加速人工标注和核查

15.1 先自动标,再人工改

不要让标注人员从完全空白的数据开始。

可以先使用:

  • 实体词典。
  • 正则规则。
  • 大语言模型。
  • 已有命名实体识别模型。
  • 上一版训练模型。

生成候选结果后,人工只负责:

删除错误
补充遗漏
调整边界
修改类别

这通常比从零标注更快。


15.2 按风险排序

优先核查:

  1. 低置信度实体。
  2. 新出现的实体。
  3. 长实体。
  4. 嵌套实体。
  5. 高频混淆类别。
  6. 规则和模型结果不一致的样本。
  7. 多个模型预测不一致的样本。

对于模型置信度很高、规则也匹配的简单样本,可以降低核查优先级。


15.3 保存标注进度

标注工具至少应该保存:

文件ID
文本ID
当前状态
标注结果
修改时间
标注人员
审核人员
模型版本

状态可以设计为:

未标注
已预标
标注中
待审核
已审核
已完成

这样可以避免:

  • 重复标注。
  • 覆盖已完成结果。
  • 新模型污染旧数据。
  • 无法追踪谁修改了结果。

15.4 新模型不得直接覆盖历史人工标签

正确做法是分开保存:

人工标签
模型预测标签
审核后标签

例如:

{
  "text": "张三在北京大学学习",
  "human_annotation": [],
  "model_prediction_v1": [],
  "reviewed_annotation": []
}

模型升级后,可以新增:

model_prediction_v2

而不是覆盖原有人工结果。


第十六章:费曼学习法检查清单

费曼学习法包括四个步骤:

选择概念
→ 用简单语言解释
→ 找到解释不清的地方
→ 重新学习并进一步简化

16.1 尝试回答下面的问题

问题一

什么是命名实体识别?

参考回答:

从文本中找出具有特定意义的对象,并判断它们属于什么类别。

问题二

为什么实体识别不仅是分类?

参考回答:

因为它不仅要判断类别,还要确定实体在文本中的开始和结束位置。

问题三

BIO 和 BMESO 有什么作用?

参考回答:

它们用标签表示实体的边界和类别,让模型知道一个实体从哪里开始、在哪里结束。

问题四

红色和蓝色是不是实体特征?

参考回答:

通常不是。红色和蓝色只是标注工具展示标签的方式,模型真正使用的是文本、上下文和数字化标签。

问题五

已经识别出两个实体后,能否直接确定关系?

参考回答:

不能。还要结合两个实体之间以及整句话中的上下文。

问题六

为什么需要反例?

参考回答:

反例告诉模型,某些看起来像实体的词在特定上下文中并不是实体,防止模型只记住关键词。

问题七

弱监督是什么?

参考回答:

使用词典、规则、知识库或其他模型生成不完全可靠的标签,再通过人工审核或训练方法利用这些标签。


第十七章:最终知识框架

可以把命名实体识别完整地理解为下面这条链路:

业务目标
↓
确定需要哪些实体
↓
定义实体类别
↓
规定实体边界
↓
编写标注规范
↓
收集文本
↓
人工标注或弱监督预标注
↓
转换为BIO或BMESO格式
↓
训练模型
↓
评估Precision、Recall和F1
↓
分析边界错误、类型错误、漏识别和误识别
↓
补充困难样本
↓
重新训练
↓
部署模型
↓
继续进行关系抽取或知识图谱构建

最核心的第一性原理是:

实体识别不是给整句话分类,
而是在文本序列中寻找若干连续片段,
并为每个片段赋予一个业务类别。

最核心的工程原则是:

任务定义清楚
> 标注规范一致
> 数据覆盖真实场景
> 模型结构复杂

最核心的费曼检验是:

你能否不用“向量、Transformer、序列标注”等专业词,向一个小学生解释命名实体识别?

可以这样说:

给计算机一句话,让它像拿着不同颜色的笔一样,把人名、地点和机构圈出来。它不仅要选对颜色,还要从正确的位置开始圈,在正确的位置结束。

评论