一、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 模型,直接用到医疗领域,效果会断崖式下降。为什么?因为不同领域的实体类型和表达方式完全不同。

举个例子:

  • 新闻领域:人名、地名、机构名
  • 医疗领域:疾病名、药物名、症状名、手术名
  • 金融领域:股票代码、公司名、金融产品名

我建议的做法是:先用通用语料预训练一个基础模型,然后用领域语料做微调。这样既保留了通用知识,又能适应特定领域。

核心难点总结

  1. 实体边界模糊——中文无空格,需要精细的标注策略
  2. 实体歧义——一词多义,依赖上下文消歧
  3. 嵌套实体——实体套实体,需要特殊模型结构
  4. 领域迁移——不同领域差异大,需要迁移学习

3.5 数据标注成本高

这一点我必须重点说。NER 模型的效果,很大程度上取决于标注数据的质量和数量。但标注数据真的贵。

我算过一笔账:标注 1 万条医疗文本,需要 3 个标注员工作 2 周,成本大概在 5-8 万元。而且标注一致性很难保证——同一个实体,不同标注员可能标出不同的边界。

我的解决方案是:

  • 先用远程监督(基于词典和规则)生成一批粗标注数据
  • 然后人工校对,只修改错误的部分
  • 最后用主动学习,挑出模型最不确定的样本让人工标注

这样能把标注成本降低 60% 以上。嗯,这是实战中总结出来的经验,书本上可不会告诉你这些。

四、小结

NER 看起来简单,做起来坑多。但它是 NLP 的基石,信息抽取、问答系统、知识图谱,哪个都离不开它。

我个人觉得,学好 NER 的关键在于:

  1. 理解实体标注规范——这是地基
  2. 掌握序列标注模型——CRF、BiLSTM-CRF、BERT-CRF
  3. 学会处理嵌套实体和歧义——这是进阶
  4. 积累领域知识——这是实战

下一章,我会带你手写一个简单的 NER 模型,从数据准备到模型训练,一步步走通整个流程。到时候你就知道,理论是一回事,代码跑起来又是另一回事了。

我的建议:初学者可以先从通用领域的 NER 入手,用现成的工具(比如 HanLP、LAC)跑通流程。然后再尝试自己训练模型。别一上来就搞领域 NER,容易劝退。

好了,这一章就到这里。有什么问题,欢迎在课程群里讨论。下一章见。