20 从零学NLP系列教程:命名实体识别
系列进度
自然语言处理入门 · 第 20 / 30 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
NER 不是只找关键词,它还要判断实体边界和类型。边界错一个字,后面的知识抽取和检索都会受影响。
我会专门看边界样本:简称、别名、嵌套实体和中文机构名。实体抽取最容易在这些地方失真。
在本篇教程中,我们将深入探讨命名实体识别(Named Entity Recognition, NER)这一序列标注任务。命名实体识别是信息提取的一部分,主要目的是从文本中识别出具有特定意义的实体,如人名、地点、组织等。通过前面的内容,我们已经了解了文本分类的评价指标,那么接下来的内容将集中在序列标注上,特别是如何进行命名实体识别。
什么是命名实体识别?
命名实体识别的主要目标是识别文本中的命名实体,并将其分类。典型的命名实体类别包括:
学习命名实体识别时,先看实体类型、标注规则、上下文线索、模型预测、错误边界和应用场景。
- 人名(PERSON)
- 地名(LOCATION)
- 机构名(ORGANIZATION)
- 日期(DATE)
- 时间(TIME)
- 数量(MONEY)
这样的选择让NER任务在很多应用场景中都有重要意义,比如信息检索、问答系统、机器翻译等。
NER的基本方法
命名实体识别任务通常使用序列标注的方法来处理,也就是为文本中的每个词分配一个标签。最常用的标签集为IOB格式:
学《从零学NLP系列教程:命名实体识别》时,可以先找一个自己能复现的小场景,再看相关概念和练习步骤,读完后用自己的例子复述一遍。
- I: Inside (内部,表示该词是实体的一部分)
- O: Outside (外部,表示该词不是实体)
- B: Begin (开始,表示该词是一个实体的开始)
举个例子,句子“Bill Gates是微软的创办人。”可以标注为:
| 单词 | 标签 |
|---|---|
| Bill | B-PER |
| Gates | I-PER |
| 是 | O |
| 微软 | B-ORG |
| 的 | O |
| 创办人 | O |
| 。 | O |
在这个例子中,“Bill Gates”被标识为一个人名(PER),而“微软”被标识为一个组织名(ORG)。
数据准备
在进行命名实体识别之前,我们需要对数据进行适当的准备。首先,我们需要一个文本和相应标签的集合。以下是一个示例数据集的结构:
{
"sentences": [
{
"text": "Bill Gates是微软的创办人。",
"labels": [
{"start": 0, "end": 4, "label": "B-PER"},
{"start": 5, "end": 11, "label": "I-PER"},
{"start": 12, "end": 12, "label": "O"},
{"start": 13, "end": 15, "label": "B-ORG"},
{"start": 16, "end": 16, "label": "O"},
{"start": 17, "end": 20, "label": "O"},
{"start": 21, "end": 21, "label": "O"}
]
}
]
}
NER模型示例
我们可以使用深度学习模型来进行NER任务。下面的例子展示了如何使用transformers库中的预训练模型来构建NER模型。我们将使用Python和Hugging Face库来实现这一过程。
安装依赖
确保你已经安装了transformers和torch库。
pip install transformers torch
代码示例
以下是一个简单的NER模型实现:
import torch
from transformers import BertTokenizer, BertForTokenClassification
from transformers import pipeline
# 加载预训练模型和分词器
model_name = "dbmdz/bert-large-chinese-ner"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForTokenClassification.from_pretrained(model_name)
# 创建ner管道
ner = pipeline("ner", model=model, tokenizer=tokenizer)
# 测试文本
text = "Bill Gates是微软的创办人。"
# 进行命名实体识别
results = ner(text)
# 输出结果
for entity in results:
print(f"实体: {entity['word']}, 标签: {entity['entity']}, 置信度: {entity['score']:.2f}")
运行结果
运行上述代码后,输出可能会是这样的结果:
实体: Bill, 标签: B-PER, 置信度: 0.99
实体: Gates, 标签: I-PER, 置信度: 0.98
实体: 微软, 标签: B-ORG, 置信度: 0.97
读到这里,可以把《从零学NLP系列教程:命名实体识别》整理成一张复盘表:先说清主线,再拿一个小任务检查结果。
读完《从零学NLP系列教程:命名实体识别》后,可以先挑一个小样例走完整流程,再判断哪些步骤已经能独立完成。
小结
在本篇教程中,我们介绍了命名实体识别的基本概念和实现方法,并结合代码实例展示了如何使用深度学习模型来进行NER任务。通过了解NER,读者可以更好地掌握如何从文本中提取具有重要意义的信息。
在下一篇教程中,我们将继续深入探讨序列标注的另一个重要方面——部分语法分析(Shallow Parsing),欢迎继续关注!
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
从零学NLP系列教程:命名实体识别适合谁读?
这是 自然语言处理入门 系列第 20 / 30 篇,适合正在学习自然语言处理入门,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇自然语言处理入门教程要多久?
按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读