文章

通用NER技术简介

通用NER技术简介

通用NER技术简介

命名实体识别(Named Entity Recognition, NER)是自然语言处理里的基础任务:从自由文本中找出「有类型的专名片段」,并标出它在原文中的起止位置。人名、地名、机构名是最经典的三类(CoNLL 评测常称 PER / LOC / ORG)。扩展后还可以包括时间、金额、产品、法规条款、基因、疾病等——类型集合由任务定义,不是技术本身固定的。

参考与延伸阅读


目录


1. 任务定义

给定一段文本,输出若干三元组:

1
(实体文本, 类型, 起止偏移)

例如:

原文实体
「李雷在北京大学工作。」李雷(人名,0–2)、北京大学(机构,3–7)

NER 回答的是 「文中出现了哪些专名」,通常不回答:

不是 NER那是什么
这句话是褒是贬情感分析
李雷和北京大学是什么关系关系抽取
「北京大学」在知识库里的唯一 ID实体链接 / 消歧
该不该录取、该不该赔付下游决策

NER 常作为流水线第一段:先切出 mention,再做链接、关系、问答或检索。


2. 词典扫描的局限

词典或关键词扫描实现简单:命中词表就标出来。它的问题是:

  • 未登录词:新公司名、昵称、拼写变体不在表里就漏。
  • 歧义苹果 可以是水果也可以是公司,取决于上下文。
  • 边界北京大学医学院 是一个机构还是「北京大学」+「医学院」?
  • 无空格语言:中文、日文不能靠空格分词,切错一个字整段都错。

因此主流方法把 NER 做成 结合上下文的序列标注或跨度分类,词典只作特征或后处理。


3. 问题形式化

3.1 序列标注

对每个 token(英文常为词,中文常为字或子词)预测一个标签,再把连续标签合并成实体。

BIO 标注:

标签含义
B-PER人名开始(Begin)
I-PER人名内部(Inside)
O非实体(Outside)
1
2
3
李  雷  在  北  京  大  学  工  作
B-PER I-PER O  B-ORG I-ORG I-ORG I-ORG O   O
└─ 李雷 ─┘     └──── 北京大学 ────┘

BIOES / BIOS 更细:

  • E-:实体最后一个 token
  • S-:单 token 实体

边界约束更严,标注略贵。

解码时约定:B- 开启新实体;同类型 I- 延长;O 或类型切换则结束。孤立的 I-(前面没有 B-)有的系统当新实体,有的直接丢弃。

使用 WordPiece / BPE 时,必须用 字符级偏移 映回原文,否则高亮和下游对齐会错。

3.2 扁平、嵌套、不连续

形态含义例子
扁平实体互不交叉「李雷在北京」
嵌套跨度重叠「北京大学」在「北京大学医学院」内部
不连续实体被其他词隔开英文 New York-based … Company 一类结构

标准 BIO 一次只标一层,是 扁平 NER。嵌套需要分层标注、跨度分类,或把 NER 改写成阅读理解(「文中的机构名是?」)。不连续实体更少见,要专门结构。

3.3 跨度分类

不逐 token 打标签,而是枚举可能的 (i, j) 跨度,判断是否为某类实体。对嵌套更自然,跨度数量随长度平方增长,长句要剪枝。


4. 技术演进

4.1 规则与词典

早期系统大量用姓氏表、地名表、大小写、前后缀(-ville大学)。可解释、可落地,覆盖率和歧义是上限。仍广泛用于高置信补召、或作为统计模型的特征。

4.2 统计模型:HMM、CRF

把标签序列看成结构化预测。条件随机场(CRF) 曾是标准选择:在整句上打分,用转移矩阵表达「I-PER 前面不太该是 O」。特征靠人工:当前词、词性、前后词、是否在词典中等。

优点是结构合法、可解释;缺点是特征工程重,换领域成本高。

4.3 神经网络:BiLSTM-CRF

词向量(Word2Vec、GloVe 等)进入双向 LSTM,再接 CRF。减少手工特征,能利用前后文。对超长依赖和一词多义仍有限——每个词只有一个静态向量。

4.4 预训练编码器:BERT 族

BERTBidirectional Encoder Representations from Transformers 的缩写,直译是「来自 Transformer 的双向编码器表示」。

通俗说:它是一个 先读懂整句话、再给每个字编一串含义数字 的阅读器。

 含义
Bidirectional(双向)看一个字时,左边和右边的上下文都用上,不像早期模型主要从左往右读
Encoder(编码器)把字变成向量,供后面的任务使用;本身不负责「写下一句」
Representations(表示)输出的就是这些向量,即每个位置的「含义编码」
Transformers所用的神经网络结构(自注意力),不是电影里的变形金刚

2018 年由 Google 提出(论文)。「BERT 族」还包含 RoBERTa、MacBERT、XLM-R 等:都是先海量文本预训练,再接到分类、问答、NER 等任务上微调。

当前工业界最常见的落地形态:

1
2
3
4
文本 → Tokenizer → Transformer 编码器
     → 每个位置一个分类头(标签 = BIO × 类型 + O)
     → argmax 或再接 CRF
     → 合并为实体列表

BERT 等模型用大规模无标注文本预训练,再在 NER 数据上微调。每个 token 的表示随整句上下文变化,苹果 在「吃苹果」和「苹果公司」里向量不同。

常见变体:BERT、RoBERTa、MacBERT、XLM-R(多语)等。英文、中文都有大量开源微调权重,可在 Hugging Facetoken-classification 检索。

特点:

  • 参数多在一亿量级(base)到三亿量级(large)
  • 最大长度常见 512 token,长文需切段
  • 擅长局部「像不像某类专名」,不自动做链接或事理推理

BERT 与 NER 的关系

二者不是同一种东西,是 底座 + 任务

 BERTNER
是什么一种读句子的编码器(预训练语言模型)一种任务:把专名从句子里圈出来并分类
类比练过海量阅读的「语感」试卷上的题:「请划出人名、地名、机构名」
单独能不能用能表示每个字的向量,但 不会自动输出实体任务可以换模型做:词典、CRF、LSTM、BERT、大模型都行

没有 NER 头的 BERT 只输出一串数字向量,不会说「这是人名」。
没有 BERT 的 NER 完全可行,只是现在用 BERT 当阅读器,效果通常更好。

日常说的「BERT-NER」= 用 BERT 读完每个字 → 再接一个很浅的分类器,给每个字打 BIO 标签。

同一词的两种意思

静态词向量时代,「苹果」无论出现在哪,都是同一组数字,模型很难区分水果和公司。

BERT 会结合整句:

1
2
3
4
5
句子 A:我今天吃了一个苹果。
        苹、果 的向量偏向「食物」→ 分类头打 O(不当机构)

句子 B:苹果发布了新手机。
        苹、果 的向量偏向「公司」→ 分类头打 B-ORG、I-ORG

同一套 BERT 权重,差在上下文;真正标出「机构」的是后面的 NER 分类头,而不是 BERT 自己「知道这是苹果公司」。

整句标签的生成路径

原文:李雷在北京大学工作。

  1. BERT:给「李、雷、在、北、京、大、学、工、作、。」各算一个向量(每个都看过全句)。
  2. 分类头:每个向量映射成标签,例如
1
2
3
李 B-PER   雷 I-PER   在 O
北 B-ORG   京 I-ORG   大 I-ORG   学 I-ORG
工 O       作 O       。 O
  1. 解码:连续 B-PER I-PER → 实体「李雷」;B-ORG … I-ORG → 「北京大学」。

没有第 2、3 步,BERT 只是「读懂了」,交不出圈出来的专名。

训练时各自学什么

  • BERT 预训练(不标人名):把「李雷在[MASK]大学工作」里的「北京」猜出来,学语言。
  • NER 微调(要标人名):告诉模型「李雷」是 PER,分类头学会:这种向量模式就打 B-PER

所以:BERT 提供上下文相关的字表示;NER 是在这组表示上做的划界分类。 换任务时可以同一 BERT 去接情感分类、问答,不一定做 NER。


4.5 生成式与大语言模型

把 NER 写成生成:输出 JSON、或用特殊符号把实体括起来。指令微调后的大模型可以少样本抽取新类型。

代价是幻觉(生成原文没有的实体)、偏移不稳定、延迟和显存高。许多系统仍用 编码器抽取跨度,大模型用于新领域冷启动、难例或同时抽关系。


5. 训练数据与标注

监督式 NER 必须有带标签的跨度;不是「把生语料丢进 BERT 就会认人名」。训练分两段,标注只发生在第二段。

跨度不是为了「让模型理解这句话的意思」,而是为了告诉它 从第几个字到第几个字算一个实体。NER 要学的是划界:同样是「北京大学」,有的句里整段是机构,有的句里只有「北京」是地名。若只给「这句话里有人名」而不给起止,模型不知道圈哪几个字,BIO 标签也对不回去。跨度 = 标准答案的坐标;语义理解来自 BERT 预训练,微调是对着这些坐标做对错。

5.1 预训练与 NER 微调的分工

阶段数据要不要人工标 NER学什么
预训练不要。用百科、新闻、网页等海量无标注文本掩码语言模型等:根据上下文填空,学通用字/词表示
NER 微调要。 每句标出实体边界和类型每个 token 预测 B/I/O-类型,或每个跨度预测是否为实体

开源「现成 NER 权重」= 别人已经用公开/自有标注集微调过。直接用可以不标;换领域、换类型体系,就要自己标一批再接着微调。

微调时常见目标:对每个位置做交叉熵(token 分类);若接 CRF,则优化整句标签路径的负对数似然。数据切成训练 / 验证 / 测试,用验证集选模型、测试集只评一次。规模上,新闻三类实体往往数千到数万句就能微调出可用模型;类型越细、领域越偏,需要的精标越多。

大模型路线仍要「答案」:可以是 BIO,也可以是 JSON 抽取结果,本质还是有监督(或合成后再人工抽检)。

5.2 训练数据来源

来源说明标注量
公开评测集CoNLL-2003、OntoNotes、MSRA、CLUENER 等已标好,可直接微调
远程监督用词表、百科链到正文上自动打标噪声大,常作预标,再人工改
业务语料精标合同、工单、对话、公告等本领域真实文本真正决定线上效果
模型预标 + 人改先跑通用 NER,人只改错的降低成本,需防模型偏见被写进金标

预训练语料(维基、书、网页)没有 PER/LOC 标签,不能拿来当 NER 训练集。

5.3 标注必要性与规范

  • 只用现成模型、类型正好是人名地名机构:可以不标,用公开集或开源权重。
  • 类型变了、文体变了、或 F1 不够:需要标注。常见起点是 1 000~5 000 句 精标 + 指南,再按错误类型加难例。
  • 先写 标注规范(什么算实体、边界包不包「市/大学」、嵌套怎么处理),再上工具(Brat、Label Studio、Doccano 等)。
  • 理想流程:双人独立标 → 算一致性(如 span-level F1 / Cohen’s κ)→ 第三人仲裁判定金标。
  • 人在原文上划选跨度并选类型即可;BIO 列可由程序根据跨度自动生成,不必让标注员手写 B-PER

5.4 标注数据示例

下面同一句给出三种常见落盘格式。原文:

1
李雷在北京大学工作。

约定实体:李雷 = 人名(PER),北京大学 = 机构(ORG)。下标从 0 计,按字符

跨度列表(JSON,标注工具最常见导出)

1
2
3
4
5
6
7
{
  "text": "李雷在北京大学工作。",
  "entities": [
    {"start": 0, "end": 2, "label": "PER", "text": "李雷"},
    {"start": 3, "end": 7, "label": "ORG", "text": "北京大学"}
  ]
}

end 为开区间右端:text[0:2] == "李雷"text[3:7] == "北京大学"

CoNLL 列(一词一行,训练脚本最常见)

英文以空格分词;中文常 一字一行

1
2
3
4
5
6
7
8
9
10
李 B-PER
雷 I-PER
在 O
北 B-ORG
京 I-ORG
大 I-ORG
学 I-ORG
工 O
作 O
。 O

空行分句。类型前缀必须与指南一致(PER / ORG / LOC 等)。

BIOES(单字实体用 S-,多字用 B-…E-

1
2
3
4
5
6
7
8
9
10
李 B-PER
雷 E-PER
在 O
北 B-ORG
京 I-ORG
大 I-ORG
学 E-ORG
工 O
作 O
。 O

若「北京」单独成词且是地名,会是 北 B-LOC / 京 E-LOC,与「北京大学」整段标成机构 冲突——规范里必须规定:更长机构优先,还是允许嵌套(则不能压成单层 BIO)。

嵌套时不要硬压成一行 BIO

原文:北京大学医学院

若既标外层机构「北京大学医学院」,又标内层「北京大学」,应用跨度列表:

1
2
3
4
5
6
7
{
  "text": "北京大学医学院",
  "entities": [
    {"start": 0, "end": 4, "label": "ORG", "text": "北京大学"},
    {"start": 0, "end": 7, "label": "ORG", "text": "北京大学医学院"}
  ]
}

单层 BIO 无法同时表示这两个重叠跨度。

明确「不标」也很重要

苹果很好吃:水果义,不标 ORG。
苹果发布了新机:公司义,标 ORG。
同一表面形式靠上下文决定,这正是需要人工看句、而不是纯词表的原因。


6. 数据集与评测

6.1 经典数据集

数据 / 评测说明
CoNLL-2003新闻,PER/LOC/ORG/MISC,NER 最常用基准之一
OntoNotes类型更细,含嵌套与共指相关标注
ACE实体、关系、事件,类型定义更接近信息抽取
中文:MSRA、Resume、Weibo、CLUENER 等人名地名机构或细类型;社交媒体噪声更大

换领域(法律、医疗、金融、对话)必须重新标注或微调,新闻上的 F1 不能直接当产品指标。

6.2 指标

实体级报告 精确率 P、召回率 R、F1。关键是「何谓匹配」:

规则含义
严格匹配起止与类型都与金标完全一致
部分匹配有重叠即算对,数字更好看,论文难比
微平均 / 宏平均类型不均衡时结论不同

业务上还要看假阳性的代价:把普通词标成人名,可能污染检索或风控。


7. 与相邻任务的关系

1
2
3
4
5
6
7
NER          找出 mention + 类型 + 跨度
  ↓
实体链接      挂到知识库 ID(哪一个「苹果」)
  ↓
关系抽取      两实体之间是什么关系
  ↓
事件抽取      谁在何时何地对谁做了什么

也可以不做链接,只把 NER 结果用于检索高亮、敏感信息脱敏(把人名、证件号盖住)、或作为分类模型的特征。

嵌套、多类型、领域词表 决定了系统复杂度,而不是「用没用 BERT」这一件事。


8. 工程要点

切段
长度超过模型上限时按句切。实体跨切点会被劈开,宜在标点处断开,或使用重叠窗口。

对齐
子词、空格、全角字符都容易让偏移错一位。评测和产品展示都必须以原文字符为准。

类型设计
类型不是越多越好。过细导致样本稀疏、边界争议(「北京市海淀区」算一个地名还是两个)。过粗则下游无法过滤。

词典与模型
高置信词典可补召稀有专名;与模型冲突时要定规则(模型优先还是词典优先),避免同一跨度两种类型。

部署
BERT-base 量级 CPU 可跑;高 QPS 用 GPU 批推理、量化或蒸馏。生成式大模型更适合离线或低流量。


9. 常见局限

  1. 领域迁移:新闻模型到微博、合同、病历会明显掉点。
  2. 新实体:刚出现的品牌、人名,无上下文时接近猜。
  3. 嵌套与长修饰:扁平模型系统性切错。
  4. 标注不一致:金标本身不稳时,F1 的上限是标注质量。
  5. 分数不等于正确概率:softmax 高只表示模型自信。
  6. 语言与书写:混用中英文、错别字、无标点短句都会降边界质量。

10. 小结

要点结论
任务边界NER 只圈 mention + 类型 + 跨度,不做链接、关系和决策
落地形态工业界常见 BERT 族编码器 + token 分类头(BIO),词典作补召
数据必须有带跨度的精标;公开集可热身,本领域语料决定线上效果
选型先定类型集合、扁平或嵌套、领域和延迟预算,再组合词典、CRF、BERT 微调与大模型
本文由作者按照 CC BY 4.0 进行授权