一、NER概述:什么是命名实体识别
命名实体识别,简称 NER。说白了,就是让机器从一段文本里,把人名、地名、机构名、时间、数字这些「实体」给揪出来。
我刚开始接触 NLP 时,觉得这玩意儿不就是个序列标注问题吗?后来做项目才发现,没那么简单。你想想看,让机器理解「苹果」是水果还是公司,这本身就挺考验人的。
举个例子:
输入文本:「李华昨天在北京的阿里巴巴总部开会,时间是下午三点。」
NER 系统要能识别出:
- 人名:李华
- 时间:昨天、下午三点
- 地点:北京
- 机构:阿里巴巴
嗯,这就是 NER 最基础的任务。但实际项目中,实体类型远不止这几种。我个人习惯把实体分为「通用实体」和「领域实体」两类。通用实体就是上面那些,领域实体嘛——比如医疗领域的「疾病名」「药物名」,金融领域的「股票代码」「公司名」,这些才是真正考验功底的地方。
核心定义:命名实体识别是从非结构化文本中,识别出具有特定意义的实体,并将其归类到预定义的类别中。
二、NER 的应用场景
2.1 信息抽取
信息抽取是 NER 最直接的应用。我做过一个合同审核项目,需要从几百页的 PDF 里抽取出「甲方」「乙方」「签约金额」「生效日期」。如果没有 NER,全靠正则匹配,那代码量能写到让你怀疑人生。
举个例子:
输入:「甲方:北京蓝海科技有限公司,乙方:上海数据研究院,合同金额:500万元,签约日期:2024年3月15日。」
NER 抽取出:
| 实体类型 | 实体值 |
|---|---|
| 甲方 | 北京蓝海科技有限公司 |
| 乙方 | 上海数据研究院 |
| 金额 | 500万元 |
| 日期 | 2024年3月15日 |
我曾经踩过一个坑:合同里「甲方」有时写「甲方:」,有时写「甲方为」,还有时写「甲方(以下简称甲方)」。正则写起来简直噩梦。后来用 NER 模型,配合少量规则,效果好了不止一个档次。
2.2 问答系统
问答系统里,NER 的作用是定位答案的位置。你想想看,用户问「北京的人口是多少?」,系统得先知道「北京」是个地点实体,然后去知识库里找对应的属性值。
我参与过一个医疗问答系统的开发。用户问「阿莫西林能治感冒吗?」,系统先通过 NER 识别出「阿莫西林」是药物实体,「感冒」是疾病实体,然后去知识图谱里查它们之间的关系。如果没有 NER,系统根本不知道用户在问什么。
我的经验:问答系统中的 NER,不仅要识别实体,还要识别实体之间的关系。比如「阿莫西林」和「感冒」之间是「治疗」关系还是「副作用」关系?这需要更精细的模型设计。
2.3 知识图谱
知识图谱的构建,NER 是第一步。没有实体识别,后面的关系抽取、属性填充都无从谈起。
我记得有个项目是做金融知识图谱。需要从新闻、研报、公告里抽取出「公司名」「人物名」「事件」「时间」等实体。然后把这些实体作为节点,实体之间的关系作为边,构建出一个庞大的知识网络。
举个例子:
新闻文本:「2024年1月,华为与腾讯达成战略合作,共同开发云计算解决方案。」
NER 抽取出:
- 时间:2024年1月
- 机构:华为、腾讯
- 事件:战略合作
- 领域:云计算
这些实体和关系,最终会变成知识图谱里的三元组:(华为, 合作, 腾讯)、(华为, 领域, 云计算)。
三、NER 的挑战与难点
做了这么多年 NER,我总结出几个核心难点。嗯,这里要注意,很多初学者觉得 NER 很简单,其实坑多着呢。
3.1 实体边界模糊
中文没有空格,实体边界很难确定。比如「北京市长」——是「北京/市长」还是「北京市/长」?再比如「华中科技大学附属协和医院」,这个实体到底从哪开始到哪结束?
我曾经在医疗项目里遇到一个案例:
「患者服用阿莫西林克拉维酸钾片后出现皮疹」
这里的「阿莫西林克拉维酸钾片」是一个完整的药物实体,还是「阿莫西林」和「克拉维酸钾片」两个实体?不同标注规范会导致完全不同的结果。
避坑指南:我曾经因为实体边界标注不一致,导致模型训练了三天,效果却惨不忍睹。后来统一了标注规范,用 BIO 标注法(B-begin, I-inside, O-outside),才解决了这个问题。
3.2 实体歧义
同一个词,在不同语境下可能是不同的实体。这是 NER 最难啃的骨头。
举个例子:
- 「苹果很好吃」——苹果是水果
- 「苹果发布了新手机」——苹果是公司
- 「他叫苹果」——苹果是人名(虽然少见,但确实存在)
为什么会这样?因为语言本身就有歧义性。模型需要结合上下文才能判断。我习惯用 BERT 这类预训练模型来处理歧义问题,因为它们能捕捉到更丰富的上下文信息。
3.3 嵌套实体
嵌套实体是 NER 里的「硬骨头」。一个实体内部还包含另一个实体。
比如:
「武汉大学人民医院」
这里面包含:
- 外层实体:武汉大学人民医院(机构)
- 内层实体:武汉大学(机构)
- 内层实体:人民医院(机构)
传统的序列标注模型很难处理这种嵌套结构。我做过一个对比实验,用 CRF 模型只能识别出最外层的实体,而用基于 Span 的模型(比如 SpanBERT)才能同时识别出嵌套的实体。
3.4 领域迁移
在新闻语料上训练好的 NER 模型,直接用到医疗领域,效果会断崖式下降。为什么?因为不同领域的实体类型和表达方式完全不同。
举个例子:
- 新闻领域:人名、地名、机构名
- 医疗领域:疾病名、药物名、症状名、手术名
- 金融领域:股票代码、公司名、金融产品名
我建议的做法是:先用通用语料预训练一个基础模型,然后用领域语料做微调。这样既保留了通用知识,又能适应特定领域。
核心难点总结:
- 实体边界模糊——中文无空格,需要精细的标注策略
- 实体歧义——一词多义,依赖上下文消歧
- 嵌套实体——实体套实体,需要特殊模型结构
- 领域迁移——不同领域差异大,需要迁移学习
3.5 数据标注成本高
这一点我必须重点说。NER 模型的效果,很大程度上取决于标注数据的质量和数量。但标注数据真的贵。
我算过一笔账:标注 1 万条医疗文本,需要 3 个标注员工作 2 周,成本大概在 5-8 万元。而且标注一致性很难保证——同一个实体,不同标注员可能标出不同的边界。
我的解决方案是:
- 先用远程监督(基于词典和规则)生成一批粗标注数据
- 然后人工校对,只修改错误的部分
- 最后用主动学习,挑出模型最不确定的样本让人工标注
这样能把标注成本降低 60% 以上。嗯,这是实战中总结出来的经验,书本上可不会告诉你这些。
四、小结
NER 看起来简单,做起来坑多。但它是 NLP 的基石,信息抽取、问答系统、知识图谱,哪个都离不开它。
我个人觉得,学好 NER 的关键在于:
- 理解实体标注规范——这是地基
- 掌握序列标注模型——CRF、BiLSTM-CRF、BERT-CRF
- 学会处理嵌套实体和歧义——这是进阶
- 积累领域知识——这是实战
下一章,我会带你手写一个简单的 NER 模型,从数据准备到模型训练,一步步走通整个流程。到时候你就知道,理论是一回事,代码跑起来又是另一回事了。
我的建议:初学者可以先从通用领域的 NER 入手,用现成的工具(比如 HanLP、LAC)跑通流程。然后再尝试自己训练模型。别一上来就搞领域 NER,容易劝退。
好了,这一章就到这里。有什么问题,欢迎在课程群里讨论。下一章见。