3. 实体识别与关系抽取:从文本中挖出投资线索

做投资分析,最头疼的是什么?

我个人觉得,是信息太多。每天几百份研报、新闻、公告,光靠人眼看,根本看不过来。你想想看,如果能用程序自动把「公司A收购了公司B」、「张三辞去CEO职务」这类关键信息抽出来,那该多爽?

嗯,这就是实体识别和关系抽取要干的事。

3.1 命名实体识别(NER)——先找到「谁」和「什么」

命名实体识别,说白了就是让机器学会认人、认公司、认钱。

比如这句话:「宁德时代与特斯拉签署了2026年供货协议,涉及金额约200亿元。」

NER要能标出:

  • 宁德时代 → 公司实体
  • 特斯拉 → 公司实体
  • 2026年 → 时间实体
  • 200亿元 → 金额实体

我在项目中遇到过最坑的事:把「小米」识别成粮食公司,而不是科技公司。这种歧义在投资领域特别致命。你想想,如果系统把「小米宣布造车」理解成粮食涨价,那投资决策就全歪了。

投资领域常见实体类型:

  • 公司名(含简称、曾用名、股票代码)
  • 人名(高管、股东、监管人员)
  • 金额(营收、利润、融资额)
  • 时间(财报日、解禁日、会议日期)
  • 产品名(药品、车型、软件版本)
  • 行业术语(PE、ROE、DCF)

3.2 关系分类——把孤立的实体连起来

光认出实体还不够。你得知道它们之间是什么关系。

比如:

  • 「宁德时代」和「特斯拉」是供货关系
  • 「张三」和「某公司」是任职关系
  • 「某公司」和「200亿」是融资关系

关系分类的难点在哪?我举个例子:

「腾讯投资了小红书,同时小红书与阿里有合作。」

这里「腾讯」和「小红书」是投资关系,「小红书」和「阿里」是合作关系。同一个实体「小红书」,跟不同对象的关系完全不同。机器得学会区分。

我的经验:关系分类别贪多。一开始只做5-10种核心关系(投资、收购、任职、供货、竞争、合作),准确率能到85%以上。贪多嚼不烂,我见过有人一口气定义50种关系,结果模型直接崩了。

3.3 基于规则的方法——老派但管用

别一上来就搞深度学习。规则方法在某些场景下又快又准。

规则方法的核心就是:写模板,做匹配。

# 一个简单的投资关系规则
规则1:如果句子包含「投资了」,且前后都是公司名
        → 判定为「投资关系」
        
规则2:如果句子包含「收购了」,且前后都是公司名
        → 判定为「收购关系」

规则3:如果句子包含「担任CEO」,且前面是人名,后面是公司名
        → 判定为「任职关系」

我曾经用纯规则方法处理过一批财报公告。效果出奇的好——准确率92%,而且处理速度是深度学习模型的10倍。为什么?因为财报语言非常规范,规则几乎全覆盖。

注意:规则方法的死穴是「没见过的情况」。比如「张三空降某公司任CEO」这种表达,如果规则里没写「空降」,就抓不到。所以规则需要持续维护,我一般每两周更新一次规则库。

3.4 基于深度学习的方法——灵活但费资源

深度学习的好处是:不用手写规则,模型自己学。

目前主流方案:

  • BERT + 序列标注:做NER,效果最好
  • BiLSTM + CRF:经典组合,适合小数据集
  • 预训练语言模型微调:比如用金融领域预训练的FinBERT

我建议的实践路径:

  1. 先用规则方法快速出活(1-2周)
  2. 同时用规则方法标注一批数据(几千条就够了)
  3. 用标注数据训练一个深度学习模型
  4. 规则+模型混合使用:规则能处理的走规则,规则处理不了的走模型

混合策略效果:

方法 准确率 召回率 处理速度
纯规则 92% 65%
纯深度学习 88% 83%
规则+深度学习混合 91% 88% 中等

3.5 知识体系框架图

下面这张图,是我自己梳理的实体识别与关系抽取的整体流程。你看一眼就能明白各模块怎么配合。

实体识别与关系抽取知识体系 原始文本输入 文本预处理 基于规则的方法 基于深度学习的方法 正则表达式 · 模板匹配 词典匹配 · 句法规则 BERT · BiLSTM-CRF 预训练模型微调 · 序列标注 实体 + 关系 结构化输出

3.6 避坑指南

做这块几年下来,踩过的坑不少。分享几个印象深刻的:

  • 别迷信准确率:模型报告准确率95%,但一上线就崩。为什么?因为测试集和真实数据分布不一样。我建议用真实业务数据做验证,别用公开数据集。
  • 注意实体嵌套:比如「北京小米科技有限公司」,里面包含「北京」(地名)、「小米」(公司名)、「科技有限公司」(公司类型)。普通NER模型容易只认出最外层。
  • 关系抽取的负样本问题:很多句子里根本没有关系,但模型会强行给你抽一个。我一般会加一个「无关系」类别,让模型学会说「不」。
  • 长文本处理:一篇研报5000字,模型上下文窗口只有512。怎么办?我习惯用滑动窗口+实体链接,把跨段的同一实体合并。

一个小技巧:做投资领域的NER,一定要维护一个「公司别名表」。比如「阿里」、「阿里巴巴」、「9988.HK」指的是同一家公司。这个表我每周更新一次,从公告和新闻里自动提取。

实体识别和关系抽取,是投资知识网络的基石。没有这一步,后面的推理和决策支持都是空中楼阁。我个人觉得,这块做扎实了,整个投资分析系统的上限能提高一大截。


公众号:蓝海资料掘金营,微信deep3321