本文目录导读:
- 基于规则和字典的方法(早期/工业场景)
- 基于统计机器学习的方法(传统主流)
- 基于深度学习的方法(当前主流)
- 基于大型语言模型(LLM)的方法(新兴趋势)
- 总结:如何选择?
- 一个简单的NER流程示例(以BERT为例)
命名实体识别(Named Entity Recognition,简称NER)是自然语言处理(NLP)中的一项基础任务,目标是识别文本中具有特定意义的实体类别,如人名、地名、组织名、时间、日期、货币、百分比等。
识别命名实体通常有四种主流方法,从传统到现代依次是:
基于规则和字典的方法(早期/工业场景)
这种方法不依赖机器学习,而是依靠人工编写的规则和实体词典。
- 工作原理:
- 规则:利用正则表达式或句法模式(如“张三/去/北京”,匹配“动词+地名”的模式)。
- 字典:预先构建人名、地名、公司名等列表,然后进行字符串匹配(如Aho-Corasick自动机)。
- 优点:在小领域、格式固定的文本(如发票、病历)中,准确率极高且无需训练数据。
- 缺点:可移植性差,维护成本高,无法识别新的或变形的实体。
基于统计机器学习的方法(传统主流)
这类方法将NER建模为序列标注问题(给每个词打标签),常见的模型有:
- 隐马尔可夫模型(Hidden Markov Model,HMM):假设当前标签只与上一标签和当前词有关,计算简单但效果一般。
- 条件随机场(Conditional Random Field,CRF):经典模型,它考虑了全局最优的标签序列,能有效利用上下文特征(如当前词是否大写、词性、前后词特征),CRF通过“维特比算法”找到最可能的标签路径。
- 支持向量机(Support Vector Machine,SVM)或最大熵模型:作为分类器对每个词进行分类,但不擅长捕捉序列依赖关系,常需配合CRF使用。
特征工程:这是此类方法的核心,需要人工设计特征,词本身、词性、是否是大写字母、前后词、词形(如“-ing”结尾可能是动词)等。
典型流程:
输入句子 → 分词 → 特征提取(词性、边界等)→ 送入CRF模型 → 输出标签(如B-PER,I-PER,B-LOC,O...)
基于深度学习的方法(当前主流)
深度学习彻底改变了NER,不再需要手动设计复杂的特征,模型可以自动学习特征。
- 关键模型架构:
- BiLSTM-CRF(双向长短期记忆网络-条件随机场,经典管道):BiLSTM处理序列上下文(前向+后向),输出每个词的标签分数,再由CRF层解码出最优标签序列。
- Transformer(如BERT、RoBERTa):目前最佳的预训练语言模型,输入句子,直接输出每个词的表示,通常会在上面加一个线性分类层或CRF层进行微调。
- BERT + Softmax/CRF:最简单的做法;更复杂的会采用Span预测(预测实体边界,而非逐词分类)或序列到序列(seq2seq)生成。
深度学习方法的优势:
- 端到端:自动从词嵌入(Word Embedding)学习特征,无需人工。
- 上下文强大:BERT等模型能捕捉深层语义关系。
- 效果顶尖:在标准数据集(如CoNLL-2003)上已达到接近人类水平的F1值(95%+)。
基于大型语言模型(LLM)的方法(新兴趋势)
虽然不是传统NER,但GPT、Claude等大模型也能完成NER任务。
- 方法:通过提示词(Prompt),让模型直接输出实体列表,例如输入:
提取句子中的命名实体:\"苹果公司今天发布了新手机。\" 输出:[ {"实体": "苹果公司", "类型": "组织"}, ... ] - 优点:零样本(无需训练数据)、泛化能力强、能识别复杂嵌套实体。
- 缺点:成本高、延迟大、可能产生幻觉、对特定领域的规则难以精确控制。
如何选择?
| 方法 | 适用场景 | 数据要求 | 效果 | 维护成本 |
|---|---|---|---|---|
| 规则/字典 | 小范围、固定格式(如日志、表单) | 无监督(需专家编写) | 精准但狭窄 | 高(规则需不断调整) |
| 统计机器学习(HMM/CRF) | 资源有限的中小规模项目 | 中等(1000-5000句标注) | 可接受(70-85%) | 中 |
| 深度学习(BERT/BiLSTM-CRF) | 通用领域、大规模、高精度需求 | 大(万级标注句) | 极好(90-95%+) | 低(自动特征提取) |
| LLM(GPT/Claude) | 开放域、少量标注、灵活任务 | 无需标注(零/少样本) | 好但不可控 | 极低(调用API即可) |
一个简单的NER流程示例(以BERT为例)
- 输入:
“李华昨天去了北京大学。” - 分词与编码:BERT分词器将其转为[BOS, 李, 华, 昨, 天, 去, 了, 北, 京, 大, 学, 。, EOS]。
- 模型计算:BERT输出每个词的隐藏向量。
- 分类头:一个全连接层+Softmax,输出每个词属于B-PER(人名开始)、I-PER(人名内部)、B-ORG(机构开始)、I-ORG、O(非实体)等的概率。
- 解码(如果用了CRF则做Viterbi解码,否则直接取概率最高的标签)。
- 输出:
李华→ B-PER, I-PER → 实体:人名北京大学→ B-ORG, I-ORG, I-ORG, I-ORG → 实体:组织
推荐工具:
- 入门练习:用Python的
spaCy库(内置NER模型)。 - 专业研究:使用Hugging Face的
transformers库,加载BERT或RoBERTa进行微调。 - 工业快速构建:使用基于字典的
LAC(百度)或jieba配合正则,或直接调用大型语言模型(LLM)API(需评估成本)。