通用NER技术简介
通用NER技术简介
命名实体识别(Named Entity Recognition, NER)是自然语言处理里的基础任务:从自由文本中找出「有类型的专名片段」,并标出它在原文中的起止位置。人名、地名、机构名是最经典的三类(CoNLL 评测常称 PER / LOC / ORG)。扩展后还可以包括时间、金额、产品、法规条款、基因、疾病等——类型集合由任务定义,不是技术本身固定的。
参考与延伸阅读:
- CoNLL-2003:https://www.clips.uantwerpen.be/conll2003/ner/
- Hugging Face Token Classification:https://huggingface.co/tasks/token-classification
- BERT 论文:https://arxiv.org/abs/1810.04805
- ACL Anthology · NER:https://aclanthology.org/search/?q=named+entity+recognition
目录
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-:实体最后一个 tokenS-:单 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 族
BERT 是 Bidirectional 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 Face 按 token-classification 检索。
特点:
- 参数多在一亿量级(base)到三亿量级(large)
- 最大长度常见 512 token,长文需切段
- 擅长局部「像不像某类专名」,不自动做链接或事理推理
BERT 与 NER 的关系
二者不是同一种东西,是 底座 + 任务。
| BERT | NER | |
|---|---|---|
| 是什么 | 一种读句子的编码器(预训练语言模型) | 一种任务:把专名从句子里圈出来并分类 |
| 类比 | 练过海量阅读的「语感」 | 试卷上的题:「请划出人名、地名、机构名」 |
| 单独能不能用 | 能表示每个字的向量,但 不会自动输出实体 | 任务可以换模型做:词典、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 自己「知道这是苹果公司」。
整句标签的生成路径
原文:李雷在北京大学工作。
- BERT:给「李、雷、在、北、京、大、学、工、作、。」各算一个向量(每个都看过全句)。
- 分类头:每个向量映射成标签,例如
1
2
3
李 B-PER 雷 I-PER 在 O
北 B-ORG 京 I-ORG 大 I-ORG 学 I-ORG
工 O 作 O 。 O
- 解码:连续
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. 常见局限
- 领域迁移:新闻模型到微博、合同、病历会明显掉点。
- 新实体:刚出现的品牌、人名,无上下文时接近猜。
- 嵌套与长修饰:扁平模型系统性切错。
- 标注不一致:金标本身不稳时,F1 的上限是标注质量。
- 分数不等于正确概率:softmax 高只表示模型自信。
- 语言与书写:混用中英文、错别字、无标点短句都会降边界质量。
10. 小结
| 要点 | 结论 |
|---|---|
| 任务边界 | NER 只圈 mention + 类型 + 跨度,不做链接、关系和决策 |
| 落地形态 | 工业界常见 BERT 族编码器 + token 分类头(BIO),词典作补召 |
| 数据 | 必须有带跨度的精标;公开集可热身,本领域语料决定线上效果 |
| 选型 | 先定类型集合、扁平或嵌套、领域和延迟预算,再组合词典、CRF、BERT 微调与大模型 |
