第三章:实体识别与关系抽取

命名实体识别(NER)在财报中的应用

做财报分析,第一步是什么?

我个人习惯,先把一堆非结构化的文本,变成结构化的数据。说白了,就是让机器能看懂财报里到底在说谁、说了什么。

命名实体识别(NER)就是干这个的。它能把文本里的专有名词拎出来,比如公司名、人名、地名、金额、日期。我刚开始做这个项目时,觉得这玩意儿挺简单,不就是个词性标注吗?后来发现,财报里的坑,比想象中多得多。

财报中常见的实体类型:

  • 公司实体:比如“贵州茅台”、“腾讯控股”、“中国平安”
  • 人物实体:比如“马化腾”、“张勇”、“王健林”
  • 金额实体:比如“1.2亿元”、“500万美元”、“同比增长15%”
  • 时间实体:比如“2023年”、“第一季度”、“截至12月31日”
  • 产品实体:比如“飞天茅台”、“微信支付”、“iPhone 15”

你想想看,如果连“贵州茅台”和“贵州茅台酒”都分不清,后面的关系抽取就全乱套了。我在项目中遇到过,有些模型把“茅台集团”和“贵州茅台”当成同一个实体,结果股权结构图直接画错了。

关系抽取技术

实体识别完了,接下来就是关系抽取。这一步,说白了就是找“谁和谁有什么关系”。

举个例子:“腾讯持有美团17%的股份”。这里“腾讯”和“美团”是实体,“持有股份”就是关系。关系抽取的目标,就是把这种语义关系从文本里挖出来。

常用的关系抽取方法,我总结了一下:

方法 原理 适用场景
基于规则 写正则表达式或模板匹配 格式固定的文本,比如“XX公司持有YY公司XX%股份”
基于机器学习 用CRF、SVM等模型做序列标注 数据量中等,需要一定泛化能力
基于深度学习 用BERT、LSTM等模型做端到端抽取 数据量大,文本表达多样
基于大模型 用GPT、LLaMA等做少样本或零样本抽取 冷启动、快速验证

我的经验:别一上来就上大模型。财报文本其实很有规律,比如“截至报告期末,公司持有XX公司XX%股权”这种句式,用规则就能搞定80%。剩下的20%,再用深度学习兜底。我曾经在一个项目里,光靠50条正则规则,就覆盖了90%的股权关系。

构建财务实体关系三元组

实体和关系都有了,接下来就是组装成三元组。三元组的结构很简单:(头实体, 关系, 尾实体)

比如:

  • (腾讯, 持有股份, 美团)
  • (马化腾, 担任职务, 腾讯董事会主席)
  • (贵州茅台, 营业收入, 1.2亿元)

这些三元组,就是知识图谱的基本单元。你想想看,把几万条这样的三元组连起来,就能画出一张完整的财务关系网。

构建三元组时,有几个坑要注意:

  • 实体消歧:“苹果”到底是水果还是公司?财报里一般指公司,但也要看上下文。
  • 关系重叠:同一句话里可能有多个关系,比如“张三担任A公司CEO,同时持有B公司股份”。
  • 长距离依赖:主语和宾语可能隔了好几个从句,比如“报告期内,公司通过全资子公司XX,间接持有YY公司15%的股权”。

我曾经踩过一个坑:把“公司”这个泛指实体也抽出来了,结果三元组里全是(公司, 持有, 公司)这种废话。后来我加了一个实体过滤规则,只保留专有名词,才把数据质量提上来。

下面是我常用的一个简单抽取流程,用Python伪代码表示:

def extract_triples(text):
    # 1. 实体识别
    entities = ner_model.predict(text)
    # 2. 关系抽取
    relations = re_model.predict(text, entities)
    # 3. 组装三元组
    triples = []
    for rel in relations:
        head = rel.head_entity
        tail = rel.tail_entity
        relation = rel.relation_type
        triples.append((head, relation, tail))
    return triples

嗯,这里要注意:实体识别和关系抽取,最好是联合训练,而不是pipeline式分开做。因为关系信息能反过来帮助实体识别。比如,如果模型知道“持有股份”这个关系,那它就更可能把“腾讯”识别为公司实体。

最后,我画了一张图,把整个流程串起来:

财务实体关系三元组构建流程 财报文本 命名实体识别 公司/人物/金额/时间 关系抽取 持有/任职/交易 三元组 示例三元组 (腾讯, 持有股份, 美团) (马化腾, 担任职务, 腾讯董事会主席) (贵州茅台, 营业收入, 1.2亿元)

这张图把整个流程串起来了。从财报文本出发,经过实体识别和关系抽取,最终得到三元组。你想想看,如果每个财报都这么处理一遍,积累下来的知识图谱,能帮我们做多少事?

核心要点回顾:

  • NER是基础,关系抽取是核心,三元组是最终产出
  • 别迷信大模型,规则+深度学习组合最实用
  • 实体消歧和关系重叠是常见坑,需要专门处理
  • 联合训练比pipeline效果更好

专注资料整理