所有手记

事件抽取

关系抽取给出的是静态的边,事件抽取补上时间、参与者与动作本身。从 ACE 的触发词与论元讲起,梳理标注体系、方法脉络、事理图谱与金融领域的完整落地。

2026.09.1721 分钟KnowledgeGraph

关系抽取的输出形如 (中兴通讯, 客户, 中国联通),结构干净,但缺一个维度:这条三元组是什么时候成真的。同一对公司,2013 年的材料里写着「合作伙伴」,2015 年的新闻里写着「客户」。两条三元组同时放进图谱,图谱本身没有机制告诉你哪条在前,更不会告诉你「先成为客户、后变成合作伙伴」意味着什么。事件抽取要补的就是这个洞。

一、事件比关系多了什么

事件(event)的定义是:发生在特定时间点或时间段、特定地域范围内,由一个或多个角色参与的一个或多个动作组成的状态的改变事件抽取(event extraction)则是从自然语言文本中抽取出用户感兴趣的事件,并以结构化形式呈现出来:什么人、什么组织,在什么时间、什么地点,做了什么事。

关系抽取盯着两个实体之间的语义关系,事件抽取盯着一个动作或状态改变,它的锚点不是实体对,而是一个词。ACE 评测里的经典例句可以说明这件事:

Barry Diller on Wednesday quit as chief of Vivendi Universal Entertainment.

触发词是 quit,标注出的事件类型是 Personnel/End-Position(人事/离职)。围绕这个词可以列出四组论元:Barry Diller/Person、Vivendi Universal Entertainment/Organization、Chief/Position、Wednesday (2003-03-04)/Time-within。这四组论元加上触发词,构成一个事件的最小完整形态。两类抽取的差别不在粒度,而在结构。

关系与事件的结构差异
关系与事件的结构差异
对比维度 关系抽取 事件抽取
基本锚点 实体对 事件触发词(动作/状态改变)
输出单元 三元组(实体,关系,实体) 事件实例:类型 + 触发词 + 若干(论元,角色)
论元数量 固定为 2 可变,一种事件类型一套角色模板
时间与地点 通常不作为必需项 是一等角色,Time-within、地点都要单独标注
子任务 关系分类(实体通常已给定) 触发词检测 + 触发词分类 + 论元识别 + 论元角色分类
错误传播 链条短 链条长,前一步错则全盘错
与图谱的关系 填充实体的属性与关系 补充动态事实、事件之间的关系

用一句话概括这个差别:关系抽取给图谱加上静态的边,事件抽取给图谱加上带时间戳、带参与者名单的动作节点,后者才能支撑「后来呢」这类追问。

事件抽取的两个子任务组

事件抽取拆下来是两个子任务组。

子任务组 包含的具体任务 英文名
事件发现 事件触发词检测、事件触发词分类 Event Trigger Detection / Event Trigger Typing
事件元素抽取 事件元素识别、事件元素角色识别 Event Argument Identification / Event Argument Role Identification

围绕这两个子任务组有四个基础术语:事件提及(Event Mention)指描述事件的那句话;事件触发词(Event Trigger)指标记事件类型的词汇;事件元素(Event Argument,也叫论元)指事件的参与者;事件角色(Event Role)指元素在事件句中扮演的角色。

二、事件图谱与事理图谱

事件知识比实体知识多出一层表达能力。实体知识那一栏是「刘备、关羽、张飞、桃树、酒」,事件知识那一栏写的是「东汉末年,刘备、关羽、张飞在桃园三结义」。后者多出来的不只是时间地点,而是动作本身成了可检索的单位

事件图谱的定义是:包含事件、事件属性、事件间关联关系的,以事件为基本单位的知识网络。「基本单位」这四个字是关键,它和以实体为基本单位的知识图谱是两套骨架。

事件图谱与事理图谱的关系
事件图谱与事理图谱的关系

再往下一层是事理图谱(Event Evolutionary Graph, EEG):描述事件之间顺承、因果关系的事理演化逻辑有向有环图,节点表示抽象、泛化的事件,有向边表示事件之间的顺承与因果。它本质上是一个事理逻辑知识库。两者容易混淆,对比表如下。

对比项 事理图谱 知识图谱
研究对象 谓词性事件及其关系 名词性实体及其关系
组织形式 有向有环图 有向有环图
知识形式 事理逻辑关系、概率转移信息 实体属性和关系
知识属性 事件间的演化关系大多是不确定 大部分实体关系是确定

组织形式的相同与知识属性的相反,是这张表里最值得注意的两格。知识图谱里 A 是 B 的父亲、B 是 C 的父亲,不会有人期望 C 又变成 A 的父亲;但「货币超发」这类场景画出来的,就是一张环状事理图谱。事件可以转圈,实体的父子关系不行。

三、标注体系与数据集

把事件抽取的评测历史摊开看一遍,能理清「为什么 ACE 成了事实标准」。

评测 全称 组织者 时间 内容
MUC Message Understanding Conference DARPA 1987–1997 抽取指定事件,包括参与事件的各个实体、属性和关系
TDT Topic Detection and Tracking DARPA 1998–2004 把文本切割为不同新闻报道,监控新事件报道,把同一话题下的分散报道按某种结构组织起来;有 240 个 Topic
ACE / KBP Automatic Content Extraction NIST ACE:2000–2008;KBP:2014–2017 从指定源语言中发现特定类型事件,识别相关信息填入预设事件模板;ACE 共 8 个大类、33 个小类事件

ACE 的「填模板」思路是整套方法论的起点:事件类型先定义好,每个类型有固定角色槽位,抽取就是往槽里填。

中文这边要重点看 DuEE,全称 baiDu Event Extraction dataset,被称为「业界已知规模最大的中文事件抽取数据集」,来自 2020 年语言与智能技术竞赛,论文是 DuEE: A Large-scale Dataset for Chinese Event Extraction in Real-world Scenarios,NLPCC 2020。

数据集 事件数 事件类型数
ACE 2005 2.5K 33
KBP 2017 2.5K 18
DuEE 1.0 20K 65

把「事件类型数」和「事件数」并排看,比只看总量有用。ACE 2005 用 33 个类型摊 2.5K 个事件,平均每类不到 80 个。这就是事件抽取特别吃数据、也特别容易过拟合到头部类型的原因。

四、方法脉络:从模板到联合模型

方法大致分四类:基于模板和规则(定义语义框架和短语模式,表示特定领域事件的抽取模式)、基于机器学习(当作传统分类任务做,依赖依存分析、句法分析、词性标注等工具)、基于深度学习(分 Pipeline 与 Joint Model 两条)、基于知识库(利用外部资源做远程监督标注)。

Pipeline 把四个子任务串成流水线:触发词识别 → 触发词分类 → 元素识别 → 元素角色分类。Joint Model 想把这四步放进一个模型里一起做,它的优势可以收成三条:

  • 避免误差累积传播导致模型性能下降
  • 用一个模型同时抽取所有事件信息
  • 用从整体结构中学到的全局特征,提升对局部信息的预测能力
代表工作 路线 核心做法 公开成绩(ACE 2005)
DMCNN(Chen et al. 2015) Pipeline 词汇级 + 句子级特征;按元素与触发词切分 feature map 的三段动态多池化 触发词分类 F1 69.1,论元角色 F1 53.5
JRNN(Nguyen et al. 2016) Joint 双层双向 RNN 编码;用记忆向量/矩阵编码 trigger 与 role 间依赖,迭代预测 触发词分类 F1 69.3,论元角色 F1 55.4
FrameNet 扩数据(Liu et al. 2016) 知识库 ACE 训基础 ED 模型 → 判 FrameNet 句子 → PSL 全局推断 → 反哺训练数据 论元识别 F1 70.7(基线 DMCNN 69.1)

DMCNN:为什么需要句子级特征

两个句子就能说明这件事:S1: Obama beats McCain. 是 Elect 事件,S2: Tyson beats his opponent. 是 Attack 事件。同样是 beats,事件类型不同,光看词本身不够。

DMCNN 的句子级特征有三类:

特征 含义
上下文特征(WF) 论元候选词的上下文
位置特征(PF) 当前词与待预测类型候选词的相对距离
事件类型特征(EF) 把触发词的事件类型编码成特征,辅助元素识别与分类

Dynamic Multi-Pooling 则针对池化方式:传统 max pooling 对整个 feature map 做一次 max,dynamic pooling 把每个 feature map 按候选元素和触发词的位置切成三块再分别取 max,让三区的特征不互相淹没。

JRNN:把角色依赖记进记忆里

JRNN 的预测阶段是这一系列方法里结构最完整的设计。它为触发词建记忆向量 GiTG_i^T、为事件元素建二元记忆矩阵 GiEG_i^E,用来编码 trigger labels 与 argument roles 之间的依赖,两者初始都置 0,在预测过程中不断更新

迭代过程是:对当前词 wiw_i 做 Trigger Prediction,再针对它给每个实体做 Argument Role Prediction,每轮用上一轮的结果更新记忆,没命中的位置置为 "other"。这个做法的实质,是把「哪个角色跟着哪个触发词出现」当成可学习的结构先验,而不是靠流水线在模型外部硬拼。

知识库线:用 FrameNet 扩训练数据

FrameNet 是语言学家定义的语义框架资源:一个 Frame 描述事件、关系或实体的类型及其参与者,同时也是词法数据库,含一千多个框架、一万多个词法单元(Lexical Unit, LU),层级里 LU 对应 Trigger、FEs 对应 Arguments。

这条路线的方法分四步:用 ACE 语料训一个基础事件检测模型;用它给 FrameNet 的句子做初始判断;基于三条软约束假设(Same frame same event、Related frame same event、Same LU same event)用 PSL(Probabilistic Soft Logic,概率软逻辑)做全局推断;最后用扩充后的数据重训,扩展 ACE 训练集。

论元识别 F1 从 69.1 提到 70.7。这个数字的重点不在涨幅本身,而在召回率上有 8.7 个点的提升:补召回正是扩数据这类做法的典型收益。

五、难点

这些坑散在各个环节里,没有集中在同一处。

触发词歧义

beats 就是最小例子,同一个词在 Elect 和 Attack 两种类型下都是触发词。DMCNN 加句子级特征、加动态多池化,本质都是在给「同一个词的不同事件类型」提供区分信号。

候选事件组合爆炸

一个关键事实:不同实体组合、或其中任何一个实体的内容改变,都会形成新的候选事件,导致候选事件数量呈指数级增长;但实际公告文档里一篇包含的事件不会超过 5 个。理论空间爆炸,真实分布极稀疏,这是设计任何方案的前提,直接做「候选事件二分类」必然被负例淹没。

论元跨句与上下文

工程答案是上下文嵌入:把上下文信息编码进句子向量之后,模型性能最高提升 14.1 个百分点,最少也提升 4.8 个百分点,整体提升 6.7 个百分点。

事件关系:顺承与因果

顺承关系指两个事件在时间上先后发生的偏序关系,英语体系里又称时序关系。顺承事件对之间存在介于 0 到 1 之间的转移概率,例子是「吃过午饭后,小明到前台买单,然后离开了餐馆。」

因果关系在满足顺承时序约束的基础上强调前因后果,因果关系是顺承关系的子集,因果事件对之间存在介于 0 到 1 之间的因果强度值,例子是「核泄漏引起了严重的海洋污染。」

顺承是因果的超集,这一条在工程上很好用:因果识别可以只在顺承候选对上做,省掉一大截标注。

中文的特殊问题

中文事件抽取走字粒度,事件元素抽取用 BERT + CRF 以字符为单位做序列标注。金融领域的系统本身就是这个答案,理由也直接:中文触发词跨词边界的情况多,先分词再标注会引入额外误差。

六、金融领域的落地:一份完整的工程答案

金融领域的事件抽取系统实现里,每个抽象概念都对应到了具体模块。系统分五块:数据采集、知识库构建、数据标注、模型训练与评估、在线服务。抽取目标是五种上市公司公告事件:股权质押、回购、冻结、增持和减持

事件本体

事件本体是知识库的骨架,构建遵循三条原则:一致性、可扩展性、最小编码偏差。本体里的角色分核心角色非核心角色,核心角色表示构成一个事件所必须的信息,缺任意一个核心角色都无法构成一个完整的事件

事件类型 核心角色(名/类型) 非核心角色(名/类型)
股权质押 (EquityPledge, EP) EquityHolder 股权质押方(人名/机构名)、Pledgee 股权质权方(机构名) StartDate 开始日期、EndDate 截止日期、ReleasedDate 解除质押日期(日期);TotalPledgedShares 总计质押股票数量、TotalHoldingShares 总计持有股票数量(数量);TotalHoldingRatio 总计质押股票比例(百分比)
股权冻结 (EquityFreeze, EF) EquityHolder 股权持有方(人名/机构名)、LegalInstitution 冻结机构(机构名) StartDate 开始日期、EndDate 截止日期、UnfrozeDate 解冻日期(日期)

知识库构建:Fonduer 的三个阶段

知识库构建用 Fonduer,结合机器学习、弱监督学习、规则和词典,从公告文档中抽结构化事件。整个流程分三个阶段。

阶段 做什么 关键概念
把 PDF 转成 Fonduer 的 Data Model 有向无环图(DAG),根节点是文档,按章节切分,章节含文本和表格(表格可切出行、列和标题属性),这个结构允许从文档的不同上下文抽出事件元素并组成候选事件
抽出指定类型实体,按本体组合成候选事件,再滤掉负例 匹配器(正则、字典过滤或自建规则)负责抽实体;过滤器负责筛负例,规则是必须含核心类型实体、实体须按一定顺序出现
为每个候选事件生成多模态特征(文本、表格、视觉),走弱监督分类 标记函数(把候选事件标成正例、负例或放弃标注的数据编程范式)提供弱监督标注,再经「模型学 → 小样本测试 → 调标记函数」迭代到可用

这套做法还改进了远程监督的对齐方式:用定向链接把抽出的知识再回标到原文形成训练语料,拿高置信度的结果反过来当弱标注。

抽取模型

抽取模型基于 Joint Model,由事件元素抽取事件类型检测两部分组成,共享输入层和 BERT 层,用超参数 λ\lambda 调节两个任务的损失在整体损失中的比重。

子任务 形式 做法
事件元素抽取 序列标注 BIO 格式,BERT 给字符语义向量,前馈网络映射到标签维度,CRF 解码
事件类型检测 分类 多层 Transformer 编码器把上下文嵌进句子向量,并为每种事件类型定义一个二分类模型

规模与在线服务

五种事件类型合计 31748 篇文档、46960 个结构化事件,分布如下。

事件类型 文档数 事件数
股权质押 15533 24737
股权增持 5787 8449
股权减持 5593 7343
股权回购 3667 4531
股权冻结 1168 1900

在线服务用 Django 搭建,支持批量发送金融公告 PDF。下面这段 JSON 是系统返回结果的抽取整理:

{
  "doc_id": "SZ001696_2013-07-12",
  "events": {
    "EquityRepurchase": [
      {
        "key_sen_id": 5,
        "key_sentence": "截止2013年7月11日,公司回购股数量为23752504股,占公司总股本的比例为2.09%,成交的最高价为5.28元/股,最低价为4.40元/股。",
        "event_roles": {
          "CompanyName": "重庆宗申动力机械股份有限公司",
          "HighestTradingPrice": "5.28元",
          "LowestTradingPrice": "4.40元",
          "RepurchasedShares": "23752504股"
        }
      }
    ]
  }
}

key_sentence 按上下文标点拼接成一行;ClosingDateRepurchaseAmount 两个字段存在,但取值无法辨认,此处省略未补。

七、事理图谱怎么造出来、用在哪

构建流水线

数据清洗 → NLP 预处理 → 事件抽取和泛化 → 生成候选事件对;然后分三支:顺承关系识别、顺承方向识别、因果关系识别;再接转移概率计算。

因果对的抽取走规则法:用因果触发词构造填充模板做正则匹配,得到 cause 和 effect 子句,模板形如 (+) (导致|引起|造成) (+) (下跌|上涨);再对两个子句分词、词性标注、做词性过滤,取动词、名词、形容词构成的句子主干作为最终的 cause 和 effect。实例有「中兴通讯利润下滑引发股价大跌」「双汇并购史密斯菲尔德消息使得双汇发展股价大涨」。

财经新闻里的因果有两种形态:显式因果(带关联词),如「塑化剂事件导致白酒股大跌」;隐式因果(无关联词),如「百度 Q2 财报:净利同比增 82.9%,股价盘后上涨 7%」。除因果之外还有大量顺承关系,如「停牌了近半个月的科大讯飞(002230.SZ)复牌,股价开盘即涨停」。

产出规模

数据来自腾讯、网易、和讯等网站的财经新闻文本,以及人民日报、中国青年报等开放领域新闻文本。关键技术含事件抽取、事件间顺承和因果关系识别、事件转移概率计算、事件类别识别和事件要素提取。

指标 数值
文档 1165 万篇
事件节点 138 万
因果关系对 141 万
因果事件关系抽取 F1 72.6%(对随机选取的 1000 条因果关系做人工评价)

形态上有三种:「看电影」场景下的链状「结婚」场景下的树状「货币超发」场景下的环状

应用与前沿

应用场景有三类:智能对话系统(对话中出现事件 A 时,回复里可提及 A 的前提或后继事件)、消费意图识别与推荐系统(「去旅行」「爬山」这类消费意图显著事件能触发一系列后续消费事件)、常识推理

研究前沿有两条。统计脚本学习关注事件链条抽取、事件预测和事件间转移概率建模,经常用一个十分抽象的动词或依存关系表示事件。事件间时序因果关系识别关注如何识别两个事件之间的时序、因果关系及关系方向。

八、评测与工程建议

指标这块没有单独开一节的通行讲解,但可以反推出几条判断。

别只看整体 F1

金融系统那张对比表里,五类事件的 F1 跨度很大:最高的股权回购(With-Context)到 87.0,最低的股权增持只有 54.8。只看 Micro 66.7 会误判系统的可用性。

分阶段看指标

DMCNN 和 JRNN 的触发词分类 F1 是 69.1 / 69.3,几乎打平;论元角色 F1 是 53.5 / 55.4,拉开 1.9 个点。论元角色才是瓶颈,因为它依赖触发词已经判对。

核心角色缺失等于事件不存在

拿不到 EquityHolderPledgee,就不该算作抽对了的股权质押事件,哪怕其他非核心角色全对。这条口径需要在评测前定下来,否则指标会虚高。

正负例极度不均衡是设计前提

候选事件指数级增长,而真实事件一篇文档不超过 5 个。这不是数据异常,是任务本身的分布特征,采样策略、损失函数和阈值都要围绕它设计。

工程顺序上的几条建议

  • 先把事件本体定死。 核心角色是哪几个、类型和值域是什么,比选模型重要得多,后面所有标注、过滤、评测口径都挂在这上面。
  • 数据不够就走知识库线。 ACE 2005 每类不到 80 个事件,FrameNet 那条路线(外部语义框架资源 + PSL 全局推断)扩的正是召回。
  • 中文走字粒度。 按字符做序列标注,避免分词误差叠加到触发词与论元边界上。
  • 不必急着上大模型。 经典方法在 46960 个结构化事件的规模上已经跑通,而且可解释、能定位错误、能算置信度。在有三万篇标注文档的垂直领域,把这条基线打满更划算。
  • 服务层要解耦。 用 Django 把模型包成服务、支持批量 PDF 输入,这一步是「抽取模型」变成「事件知识库」的必经环节。

九、小结

事件抽取的价值在于它补上了知识图谱缺失的时间维度与动作维度。代价是链条变长、标注变贵、评测变复杂:四个子任务串起来,任何一步出错都会传到最终结果,而核心角色的缺失又会让整个事件实例失去意义。

落到工程上,判断顺序是:先定事件本体,再定标注与评测口径,最后才选模型。顺序反过来,通常会得到一批指标看着不错、但无法用于下游查询的事件实例。

MUSIC

Kyoto’s Jam

Mateus Asato

0:004:27

试听流来自 QQ 音乐 · 打开歌曲 ↗

MY MUSIC

我的歌单

赛丽亚的旅馆(ACT.5-大转移前) - gate new

打开原歌单

正在准备搜索索引…

选择Enter 打开Esc 关闭