4. 实体识别与关系抽取:从文本中“挖”出投资信号

做智能投研,说白了就是跟非结构化数据死磕。你想想看,一份几百页的财报、一堆新闻公告、还有那些晦涩的研报,里面藏着多少关键信息?公司名、人名、产品、财务指标、事件……这些实体和它们之间的关系,才是驱动投资决策的核心信号。

这一章,我们就来聊聊怎么把这些信号“挖”出来。我会从命名实体识别(NER)的技术选型讲起,再深入到关系抽取的两种主流范式。嗯,这里有不少我踩过的坑,希望能帮你少走弯路。

4.1 命名实体识别(NER)技术选型:BiLSTM-CRF vs BERT

NER 是信息抽取的第一步。它的任务很简单:从文本中找出预定义类别的实体,比如“公司”、“人名”、“时间”、“金额”。但简单背后,技术选型却是个大问题。

我个人习惯把 NER 模型分成两代:经典派和预训练派。

4.1.1 经典派:BiLSTM-CRF

BiLSTM-CRF 是前几年工业界的标配。它由两部分组成:

  • BiLSTM(双向长短期记忆网络):负责捕捉上下文信息。从左到右、从右到左,把每个词的“语境”编码成一个向量。
  • CRF(条件随机场):负责做序列标注的“全局优化”。它不只看每个词单独的分类概率,还会考虑标签之间的转移关系。比如,“B-ORG”后面不能直接跟“I-PER”,这种约束 CRF 学得最好。

我在项目中遇到过一个问题:只用 BiLSTM 做 NER,结果经常出现“B-ORG I-ORG I-PER”这种不合理的标签序列。加上 CRF 之后,这种错误几乎绝迹了。所以,CRF 层对于序列标注任务来说,不是锦上添花,而是雪中送炭

核心优势:训练速度快,对硬件要求低,在小数据集上表现稳定。

主要局限:对长距离依赖的建模能力有限,无法利用大规模预训练知识。

4.1.2 预训练派:BERT + 分类头

BERT 的出现,彻底改变了 NER 的游戏规则。它用海量文本预训练出来的“语感”,让下游任务的效果直接上了一个台阶。

用 BERT 做 NER,通常的做法是:

  1. 把 BERT 作为编码器,输出每个 token 的向量表示。
  2. 接一个线性分类层(或者 CRF 层),做标签预测。

你可能会问:“那 BERT 后面要不要加 CRF?” 我的经验是:加 CRF 依然有效,但收益比 BiLSTM 时代小很多。因为 BERT 本身已经学到了很强的上下文表示,标签之间的约束它也能隐式建模。不过,如果你追求极致准确率,或者你的标签体系很复杂,加 CRF 还是值得的。

我的建议:如果数据量少于 1 万条,或者对推理速度要求很高(比如实时交易系统),选 BiLSTM-CRF。如果数据充足,且对准确率有极致追求,无脑上 BERT。

4.1.3 选型对比表

维度 BiLSTM-CRF BERT + 分类头
训练速度 快(GPU 几分钟到几小时) 慢(GPU 几小时到几天)
推理速度 快(毫秒级) 慢(几十到几百毫秒)
小样本表现 一般 好(得益于预训练)
长文本处理 弱(序列长度受限) 弱(BERT 最大 512 token)
硬件需求 低(单卡即可) 高(推荐多卡或大显存)

4.2 关系抽取:Pipeline 方法与联合学习方法

实体识别完了,下一步就是找出它们之间的关系。比如,“阿里巴巴”和“马云”之间是“创始人”关系,“营收”和“100亿”之间是“数值”关系。

关系抽取有两种主流范式:Pipeline 方法和联合学习方法。我两种都用过,各有各的坑。

4.2.1 Pipeline 方法:先识别实体,再判断关系

这是最直观的做法。分两步走:

  1. 先用 NER 模型找出所有实体。
  2. 对每一对实体,用关系分类模型判断它们之间是否存在预定义的关系。

听起来很简单,对吧?但问题也很明显:

  • 错误传播:如果第一步 NER 漏掉了某个实体,第二步的关系判断就无从谈起。
  • 计算冗余:假设文本中有 N 个实体,就需要做 N*(N-1)/2 次关系判断。如果 N 很大,这个计算量是爆炸性的。

我曾经在一个金融公告数据集上试过 Pipeline 方法。NER 的 F1 值做到 0.95,但关系抽取的 F1 值只有 0.78。为什么?因为 NER 漏掉的那些实体,恰好是关键关系对的一部分。这就是典型的错误传播。

4.2.2 联合学习方法:端到端一起学

联合学习方法试图把实体识别和关系抽取放在一个模型里解决。它的核心思想是:实体和关系是相互依赖的,一起学效果更好

常见的联合学习框架有:

  • 基于表格填充的方法:构建一个二维表格,行和列都是 token,每个单元格表示两个 token 之间的关系。
  • 基于序列到序列的方法:把输入文本直接映射成结构化的输出,比如三元组列表。
  • 基于图神经网络的方法:把实体和关系建模成图,用 GNN 做推理。

联合学习的优势很明显:避免了错误传播,而且能利用实体和关系之间的交互信息。但代价是模型更复杂,训练难度更大,对数据标注的要求也更高。

我曾经踩过的坑:在联合学习模型中,如果实体类别和关系类别数量不平衡(比如“公司”实体很多,但“收购”关系很少),模型很容易偏向于只学实体识别,而忽略关系抽取。这时候需要做类别重采样或者损失函数加权。

4.3 基于规则与基于模型的抽取实战

理论讲完了,我们来点实战的。在智能投研场景中,我经常混合使用规则和模型。为什么?因为纯规则太死板,纯模型又太“黑盒”。

4.3.1 什么时候用规则?

规则适合那些模式固定、变化少的场景。比如:

  • 财务指标抽取:“营业收入”、“净利润”、“毛利率”这些术语,格式非常固定。
  • 时间表达式:“2024年第一季度”、“截至12月31日”等。
  • 股票代码:“600519.SH”、“AAPL”等。

我习惯用正则表达式加词典来做规则抽取。举个例子:

import re

# 抽取财务指标
pattern = r'(营业收入|净利润|毛利率|净利率)\s*[::]\s*(\d+\.?\d*)\s*(亿元|万元|元)'
text = "公司2024年第一季度营业收入:123.45亿元,净利润:30.21亿元。"
matches = re.findall(pattern, text)
for match in matches:
    print(f"指标: {match[0]}, 数值: {match[1]}, 单位: {match[2]}")

规则的好处是:可解释性强,调试方便,零样本成本。但坏处也很明显:维护成本高,遇到没见过的模式就抓瞎。

4.3.2 什么时候用模型?

模型适合那些模式多变、语义复杂的场景。比如:

  • 公司名识别:“阿里巴巴”、“阿里”、“Alibaba Group”……同一个公司有无数种写法。
  • 事件关系抽取:“A 公司收购了 B 公司”、“A 公司对 B 公司发起收购要约”……表达方式千变万化。

对于这些场景,我建议用预训练模型做微调。下面是一个用 Hugging Face Transformers 做 NER 的示例:

from transformers import AutoTokenizer, AutoModelForTokenClassification
from transformers import pipeline

# 加载预训练模型
model_name = "dbmdz/bert-large-cased-finetuned-conll03-english"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(model_name)

# 创建 NER pipeline
ner_pipeline = pipeline("ner", model=model, tokenizer=tokenizer)

# 抽取实体
text = "Apple Inc. is planning to acquire OpenAI for $10 billion."
results = ner_pipeline(text)
for entity in results:
    print(f"实体: {entity['word']}, 类别: {entity['entity']}, 置信度: {entity['score']:.2f}")

4.3.3 混合策略:规则 + 模型

在实际项目中,我通常采用“规则兜底,模型提升”的策略。具体做法是:

  1. 先用规则做快速抽取,覆盖那些高确定性、低复杂度的场景。
  2. 对规则无法覆盖的部分,用模型做补充抽取。
  3. 最后,用规则对模型输出做后处理校验,过滤掉明显不合理的结果。

举个例子,在抽取“收购事件”时:

  • 规则负责抓取“收购”、“并购”、“入股”等关键词附近的实体对。
  • 模型负责处理“A 公司通过其子公司完成了对 B 公司的控股”这种复杂表达。
  • 最后,规则检查模型输出的实体对是否满足基本的语法约束(比如收购方不能是个人)。

我的经验:混合策略的 F1 值通常比纯模型高 3-5 个百分点,而且推理速度更快。但代价是需要维护两套系统,工程复杂度翻倍。

知识体系总览

下面这张图,是我对本章知识体系的总结。你可以把它当作一个“导航图”,方便回顾。

实体识别与关系抽取知识体系 信息抽取 命名实体识别 (NER) BiLSTM-CRF BERT + 分类头 关系抽取 Pipeline 方法 联合学习方法 实战策略 基于规则:正则 + 词典 基于模型:预训练微调 混合策略:规则兜底 + 模型提升

好了,这一章的内容就到这里。实体识别和关系抽取是智能投研的“地基”,地基打不牢,后面的知识图谱构建、推理分析都是空中楼阁。希望这些实战经验能帮你少踩一些坑。

专注资料整理