3、实体识别基础:命名实体识别(NER)在金融领域的应用、基于规则的方法、基于深度学习的方法

好,咱们进入第三章。实体识别,说白了就是让机器从一堆文本里,把“谁、什么、多少钱、哪家公司”这些关键信息给拎出来。在金融领域,这活儿特别重要。我做过不少金融数据清洗的项目,深有体会——数据里实体都认不全,后面做对齐、做分析,全是白搭。

3.1 金融领域NER到底在干啥?

金融文本里,实体类型跟通用领域不太一样。除了人名、地名,我们更关心这些:

  • 公司实体:比如“贵州茅台”、“中国平安”。注意,简称、曾用名、英文名都得能识别。
  • 金融产品:像“余额宝”、“上证50ETF”、“国债逆回购”。
  • 金额与指标:“净利润12.3亿”、“市盈率25倍”。数字后面跟着单位,才是完整实体。
  • 时间与事件:“2023年年报”、“股权质押公告”。

我个人习惯把金融NER分成两类:静态实体(公司名、人名)和动态实体(金额、事件)。静态实体变化慢,适合用词典;动态实体变化快,得靠模型。

核心观点:金融NER不是单纯的技术问题,而是数据质量问题。实体识别不准,后续的实体对齐、知识图谱构建,误差会指数级放大。

3.2 基于规则的方法:老派但管用

你想想看,金融文本里很多实体是有固定模式的。比如股票代码“600519.SH”,公司公告里的“证券简称:贵州茅台”。这些模式,用正则表达式就能搞定。

我在项目中遇到过这样一个场景:客户要求识别所有A股上市公司简称。一开始我上了深度学习模型,效果还行,但总有漏网之鱼。后来我加了一层规则——凡是“证券简称:”后面跟着的内容,直接命中。召回率一下就上去了。

3.2.1 规则怎么写?

规则通常分两种:词典匹配模式匹配

  • 词典匹配:准备一个公司名列表、一个金融产品列表。用Aho-Corasick算法做多模式匹配,速度很快。
  • 模式匹配:用正则表达式抓取金额、日期、股票代码。

举个例子,抓取金额的规则:

import re

# 匹配“12.3亿”、“5.6万”这类模式
pattern = r'\d+\.?\d*\s*(亿|万|元|美元|港元)'
text = "公司净利润12.3亿,同比增长5.6%"
matches = re.findall(pattern, text)
print(matches)  # 输出:['12.3亿', '5.6万']

避坑指南:我曾经写过一个规则,匹配“XX公司”这种模式。结果把“保险公司”、“证券公司”里的“公司”也匹配上了。后来我加了负向过滤——前面不能是“保险”、“证券”等词。规则越细,误报越少。

3.2.2 规则的优缺点

优点 缺点
速度快,适合海量数据 维护成本高,规则越写越多
精准度高,没有误报 召回率低,遇到新实体就抓瞎
可解释性强,出了问题好排查 对同义词、缩写处理能力弱

嗯,这里要注意:规则方法适合做兜底补充。我一般把它放在模型后面,专门处理那些模型容易漏掉的固定模式实体。

3.3 基于深度学习的方法:灵活但吃数据

深度学习模型能学到上下文语义。比如“茅台”这个词,在“贵州茅台”里是公司名,在“喝茅台”里是酒名。规则做不到这种区分,但模型可以。

金融领域最常用的NER模型是BiLSTM-CRFBERT系列。我简单说说它们的区别。

3.3.1 BiLSTM-CRF:经典组合

BiLSTM负责提取上下文特征,CRF负责保证标签序列的合法性。比如“B-ORG I-ORG I-ORG”是合法的,但“B-ORG I-PER”就不合法——CRF会强制纠正。

我记得第一次用这个模型做金融NER时,训练数据只有5000条。效果嘛,马马虎虎。后来我加了领域预训练——用大量金融公告文本继续训练词向量。效果提升了5个点。

# 伪代码示意
from keras.models import Model
from keras.layers import Input, Embedding, Bidirectional, LSTM, TimeDistributed, Dense

input_layer = Input(shape=(max_len,))
embedding = Embedding(vocab_size, 300)(input_layer)
bilstm = Bidirectional(LSTM(128, return_sequences=True))(embedding)
output = TimeDistributed(Dense(num_tags, activation='softmax'))(bilstm)
model = Model(inputs=input_layer, outputs=output)

警告:BiLSTM-CRF对训练数据量要求不高,但标签一致性很重要。我见过一个项目,标注人员把“中国平安”标成“B-ORG I-ORG”,另一个标成“B-ORG I-ORG I-ORG”。模型学了半天,都不知道该输出几个标签。标注规范必须统一。

3.3.2 BERT:大杀器

BERT在NER任务上表现更好,因为它用了Transformer和自注意力机制。说白了,它能看完整句话,知道“茅台”前面是“贵州”还是“喝”。

但BERT有个问题——太吃显存。金融文本动不动就几千字,BERT的输入长度限制是512。我一般用滑动窗口策略:把长文本切成512字一段,重叠50个字,保证实体不被切碎。

另外,金融领域有大量专业术语。通用BERT不一定认识“市盈率”、“市净率”这些词。我建议用领域微调——拿金融语料再训练一下BERT。

3.3.3 两种方法怎么选?

我个人的经验是:

  • 数据量少(<1万条):用规则+BiLSTM-CRF。规则兜底,模型学模式。
  • 数据量中等(1万-10万条):用BERT微调。效果最好,但需要GPU。
  • 数据量很大(>10万条):可以考虑用预训练语言模型+CRF。或者直接用大模型做few-shot。

一句话总结:规则方法像老中医,对症下药但治不了新病;深度学习方法像西医,能治大病但需要大量数据。两者结合,才是金融NER的最佳实践。

3.4 本章知识体系

下面这张图,是我自己梳理的金融NER知识框架。你看一眼,心里就有数了。

金融命名实体识别(NER)知识体系 金融文本输入 基于规则的方法 基于深度学习的方法 词典匹配 正则表达式 BiLSTM-CRF BERT微调 实体识别结果 实体对齐 知识图谱构建 风险监控 规则方法:精准但召回低 | 深度学习方法:灵活但吃数据 最佳实践:两者结合,规则兜底 + 模型主攻

这张图把金融NER的流程和两种方法的关系讲清楚了。你写代码的时候,可以照着这个框架搭系统。

个人建议:别一上来就上BERT。先问问自己:我的数据量够吗?我的标注规范统一吗?我的业务场景需要实时响应吗?如果数据量小、要求实时,规则方法反而是最优解。


蓝海数据掘金营,专注资料整理