清晨六点,晨报编辑部灯火通明。热线电话一个接一个:“城西有家公司被收购了!”“今早九点发生爆炸!”“昨天有地产巨头宣布违约!”——这些说法颠三倒四、细节残缺、身份不明,而主编的任务只有一个:把它们快速改写成统一格式的“事件卡片”,填清五要素:谁、做了什么、对谁、什么时间、什么地点。AI 领域里有一项任务和主编的工作惊人地相似,它就是“事件抽取”。 事件抽取让机器读出文章里的“动作核心”与“参与者”,把一段自然语言压缩成一条条结构化事件记录。本文用“新闻编辑部”作比喻,带你从一张混乱的文本出发,走过触发词识别、论元抽取、角色标注的整条流水线,再看一看预训练语言模型如何给这条流水线装上“老编辑”的大脑,最终把事件卡片送进金融风控与舆情预警的前线。

岗位关联

掌握事件抽取,等于拥有把海量非结构化文本自动“归档成事件卡片”的能力,是构建金融监测、舆情预警、知识图谱等系统的核心技能。

目录
  1. 可视化演示
  2. 事件抽取概述
  3. 触发词识别
  4. 论元抽取
  5. 角色标注
  6. 核心挑战
  7. 流水线方法
  8. 应用与价值
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

事件抽取概述

主编的工作台上有两个筐:左边装满记者交来的杂乱报道,右边只有一叠印着空格的“事件卡片”。卡片顶行写着“触发词”,下面列着几个待填空位:主体、客体、时间、金额、地点。整篇文章能不能变成一行卡片,取决于编辑能否一眼认出“这写的是哪类事”“谁参与了”。事件抽取,就是把这个人工流程自动化。

在自然语言处理里,一个“事件”被定义为:由触发词唤起、由若干论元及其角色构成的一次具体发生。触发词通常是动词或名词,例如“收购”“爆炸”“违约”——它决定了事件类型;论元则是参与事件的实体与时空要素,例如“腾讯”“300亿元”“今日”;角色回答“它在事件中担任何职”,例如“收购方”“金额”“时间”。

事件抽取的输入是一段非结构化文本,输出是结构化的事件记录。形式化地看,它把句子集合映射成一组三元组:每个三元组包含一个触发词、一组论元片段以及对应的角色标注。这比单纯的实体识别更进一步——实体只是“原料”,事件抽取要回答“这些原料组成了哪件事”。

主编看到的不再是十几页口述记录,而是几行卡片:触发词“收购”、论元“腾讯”、“游戏公司”……事件抽取的目标,正是让机器把同样的“归档动作”做得又快又准。

EE: 文本↦{(t, A, R) | t∈T, A⊆文本片段, R∈R}\text{EE}: \ \text{文本} \mapsto \left\{ \bigl(t,\ A,\ R\bigr) \ \middle|\ t \in \mathcal{T},\ A \subseteq \text{文本片段},\ R \in \mathcal{R} \right\}
通俗地说:事件抽取就是给一段文字“归档”——找出题眼(触发词)、圈出素材(论元)、贴上标签(角色),输出一张结构化事件卡片。
  1. 映射符号EE 是一个函数,左边是输入文本,右边是输出的事件集合。
    EE: 文本↦{⋯ }\text{EE}: \ \text{文本} \mapsto \left\{ \cdots \right\}
  2. 触发词约束每个触发词 t 必须来自预定义的事件类型表 T,保证“说得清是哪类事”。
    t∈Tt \in \mathcal{T}
  3. 论元集合A 是原文中的若干连续片段,代表参与事件的实体、时间与地点。
    A⊆文本片段A \subseteq \text{文本片段}
  4. 角色指派R 给出每个论元的角色,来自该事件类型的角色体系。
    R∈RR \in \mathcal{R}

触发词识别

编辑定事件,先看动词。“收购”两字一出现,整件事的性质就被框死了——这是商业并购;“爆炸”则指向安全事故。这个举足轻重的“核心词”,在事件抽取里叫“触发词”:它是文本中能激活某一事件类型的词,也是整张事件卡片的“题眼”。

不过同一副面孔可能演不同角色。“他遭到袭击”里的“袭击”是刑事案件,而“陨石袭击地球”里的“袭击”更像自然现象——同一个词,在不同上下文里指向不同事件类型,这就是触发词歧义。所以触发词识别不能只看词面,必须借助上下文判断。

工程上,触发词识别通常被建模为 token 级分类:用预训练语言模型把每个 token 编码成向量 $\mathbf h_i$,经线性分类器映射到事件类型空间。候选生成阶段会先圈出所有可能是触发词的 token(例如动词、名词),避免在全词表上做无谓搜索;随后为每个 token 计算它属于各类事件的概率,取最大值对应的类型作为标签。

老编辑扫一眼“腾讯今日宣布以300亿元收购游戏公司”,上下文告诉他“收购”是商业事件的题眼。触发词识别,就是让模型学会这一扫。

P(ti∣x)=exp⁡ ⁣(wti⊤hi)∑j∈Texp⁡ ⁣(wj⊤hi)P\bigl(t_i \mid \mathbf x\bigr) = \frac{\exp\!\bigl(\mathbf w_{t_i}^{\top} \mathbf h_i\bigr)}{\sum_{j \in \mathcal{T}} \exp\!\bigl(\mathbf w_j^{\top} \mathbf h_i\bigr)}
一句话理解:对每个词计算它属于各类事件的可能性,把概率最高的那类作为它的触发词标签。
  1. 上下文向量句子 x 经预训练编码器后,第 i 个 token 得到向量 h_i,携带上下文语义。
    hi=Encoder(x)i\mathbf h_i = \mathrm{Encoder}(\mathbf x)_i
  2. 类型打分事件类型 j 有一个向量 w_j,与 h_i 内积得到该 token 属于类型 j 的分数。
    wti⊤hi\mathbf w_{t_i}^{\top} \mathbf h_i
  3. softmax 归一化对所有事件类型的分数取指数并归一,得到概率分布。
    exp⁡(wti⊤hi)∑j∈Texp⁡(wj⊤hi)\frac{\exp(\mathbf w_{t_i}^{\top} \mathbf h_i)}{\sum_{j \in \mathcal{T}} \exp(\mathbf w_j^{\top} \mathbf h_i)}
  4. 取最高分概率最高的类型就是触发词标签。
    t∗=arg⁡max⁡ti∈TP(ti∣x)t^{\ast} = \arg\max_{t_i \in \mathcal{T}} P\bigl(t_i \mid \mathbf x\bigr)

论元抽取

题眼找到了,主编开始问五个 W:谁收购?收购谁?何时?何地?多少钱?这些问题的答案就是“论元”。论元是文本中参与事件的片段,比如“腾讯”“今日”“300亿元”“游戏公司”。没有论元,事件卡片只是一句空洞的标题。

论元抽取的任务,是以触发词为锚点,从文本中找出所有相关片段,并判断哪些是论元。由于论元的类型随事件类型而变——收购事件关心“金额”,地震事件关心“震级”——抽取时必须带上触发词这个“上下文条件”。

主流做法是“片段级二分类”:枚举文本中所有候选片段(通常受长度约束),将片段起止位置的向量与触发词向量拼接,输入一个 sigmoid 分类器,判断该片段是否为论元。受触发词约束,离触发词过远的片段通常不再考虑,这既降低了计算量,也减少了无关噪声。

编辑的问题清单和论元抽取是同一个套路:“谁收购?”对应主体;“多少钱?”对应金额。把每个问题的答案从原文里圈出来,就是论元抽取。

P(a∣t,x)=σ ⁣(wa⊤[has; hae; ht]+ba)P\bigl(a \mid t, \mathbf x\bigr) = \sigma\!\Bigl( \mathbf w_a^{\top} \bigl[ \mathbf h_{a_s};\ \mathbf h_{a_e};\ \mathbf h_t \bigr] + b_a \Bigr)
通俗地说:针对每个候选片段,把“片段开头、片段结尾、触发词”三份信息拼在一起,交由一个二分类器回答“这是不是论元”。
  1. 起止表示候选论元片段 a 有起止位置 a_s 与 a_e,取这两个位置的上下文向量。
    has,hae\mathbf h_{a_s}, \quad \mathbf h_{a_e}
  2. 触发词条件把触发词向量 h_t 一并取出,让判定依赖“这是哪类事件”。
    ht\mathbf h_t
  3. 拼接融合三个向量拼接成联合表示,分类器既能看片段本身,也能看它与触发词的关系。
    [has; hae; ht]\bigl[ \mathbf h_{a_s};\ \mathbf h_{a_e};\ \mathbf h_t \bigr]
  4. sigmoid 判定线性打分后过 sigmoid 得 0~1 概率,大于阈值即判为论元。
    σ(wa⊤u+ba)\sigma(\mathbf w_a^{\top} \mathbf u + b_a)

角色标注

论元找到了,还得填对格子。“腾讯”填进“收购方”,“游戏公司”填进“被收购方”,填反了整张卡片就变成一个笑话。给每个论元分配它在事件中的职能,就是角色标注。

每个事件类型都有一张预定义的“事件模板”,也叫角色体系:收购事件的模板是 {收购方、被收购方、时间、金额},地震事件的模板是 {地点、震级、时间、伤亡}。角色标注就是把这些模板槽位分配给具体论元。

在 pipeline 方法中,角色标注通常建模为论元级多分类:对每个已判定的论元,取其片段表示 $\mathbf h_a$,与模板中每个角色的向量 $\mathbf u_r$ 做内积打分,softmax 归一化后取概率最高的角色。实际系统常额外加一个“非角色”类,防止噪声片段强行占坑。

填格子的活看似机械,却最考验细心。老编辑常提醒新人:模板是死的,论元是活的,机器要学会对号入座——角色标注就是那个“对号入座”。

r^=arg⁡max⁡r∈Rtexp⁡ ⁣(ur⊤ha)∑r′∈Rtexp⁡ ⁣(ur′⊤ha)\hat r = \arg\max_{r \in \mathcal{R}_t} \frac{\exp\!\bigl(\mathbf u_r^{\top} \mathbf h_a\bigr)}{\sum_{r' \in \mathcal{R}_t} \exp\!\bigl(\mathbf u_{r'}^{\top} \mathbf h_a\bigr)}
一句话理解:论元已经定下来了,现在只需在事件模板的所有角色里,挑一个和它最匹配的。
  1. 模板限定角色只能来自事件类型 t 的模板 R_t。
    r∈Rtr \in \mathcal{R}_t
  2. 论元表示h_a 是已被判定为论元的片段向量。
    ha\mathbf h_a
  3. 角色打分每个角色有向量 u_r,与 h_a 内积,分数越高说明这个论元越像该角色。
    ur⊤ha\mathbf u_r^{\top} \mathbf h_a
  4. 归一化取最大softmax 变成概率后取 argmax,得到最终角色。
    r^=arg⁡max⁡r∈RtP(r∣t,a)\hat r = \arg\max_{r \in \mathcal{R}_t} P\bigl(r \mid t, a\bigr)

核心挑战

编辑部最怕两种来电:一是“袭击”这种一词多义——说“流星袭击山林”,到底是刑事案件还是天文学新闻?编辑一旦定错题眼,后面所有论元全都填错位置。二是证人挤牙膏——“腾讯收购了它,花了300亿”,“它”指谁、钱在哪句,全散在前后文里,需要跨句拼接。

这两类困境对应事件抽取的两大核心挑战:触发词歧义与论元跨句。前者要求模型具备充分的上下文语义建模,后者要求模型突破单句边界,在篇章层面把分散的线索串成完整事件。除此之外,高质量标注数据稀缺也让训练雪上加霜——人工标注一条事件记录的成本远高于普通实体标注。

还有一类挑战来自方法本身:pipeline 流水线是串联结构,误差会沿链路累积。假设触发词识别准确率 90%、论元抽取 80%、角色标注 90%,即便三个环节相互独立,最终事件记录完全正确的概率也只有约 64.8%。一步错,步步错,这是设计系统时绕不开的账。

主编总结多年经验:“这一行出错不可怕,可怕的是错上加错。”流水线设计者要做的,正是用更好的模型和合理的候选过滤,把每一环的失误率压到最低。

P成功=P(t)×P(a∣t)×P(r∣t,a)P_{\text{成功}} = P\bigl(t\bigr) \times P\bigl(a \mid t\bigr) \times P\bigl(r \mid t, a\bigr)
通俗理解:三环相扣,环环相乘——任何一环失手,都会让最终成功率打折扣。
  1. 单环节准确率P(t) 是触发词识别这一环做对的概率。
    P(t)P\bigl(t\bigr)
  2. 条件论元概率P(a|t) 是触发词正确的条件下,论元也抽对的概率。
    P(a∣t)P\bigl(a \mid t\bigr)
  3. 条件角色概率P(r|t,a) 是前两步都对的条件下,角色还标对的概率。
    P(r∣t,a)P\bigl(r \mid t, a\bigr)
  4. 连乘累积三数相乘才是最终成功概率,任何一环的失误都会被放大到全局。
    P成功=P(t)×P(a∣t)×P(r∣t,a)P_{\text{成功}} = P(t) \times P(a \mid t) \times P(r \mid t, a)

流水线方法

为了应对挑战,编辑部引入了一条自动化流水线:第一步,全局扫描锁定题眼(触发词识别);第二步,围绕每个题眼枚举所有可能的填空候选(论元抽取);第三步,把候选一一对号入座(角色标注)。这套“先找词、再配对、后填格”的流程,就是事件抽取的 pipeline 方法。

pipeline 方法的核心组件是“触发词—论元对枚举”:找到触发词后,在它周围一定窗口内枚举候选论元片段,构成 (触发词,论元) 二元组,再逐一打分判断这对组合是否构成事件的要素、论元该扮演什么角色。预训练语言模型在这条流水线中扮演“老编辑”——它提供的上下文表示让每个 token 不再是孤立的词面,而是带着整句关系背景的理解。

打分函数的典型设计是:将触发词向量与论元向量各过一个线性层,相加后经 tanh 激活,再与一个可学习的向量做内积,得到一个匹配分数。这个分数既衡量“论元与触发词是否同属一个事件”,也作为后续角色分类的输入特征。

流水线的好处是每一步都可解释、可单独优化:题眼找不准就换触发词模型,填格老错就调角色分类器。主编看得明白,系统也更好维护——这正是 pipeline 在实际工程中长盛不衰的原因。

s(t,a)=v⊤ tanh⁡ ⁣(W1ht+W2ha+b)s(t, a) = \mathbf v^{\top}\, \tanh\!\bigl( \mathbf W_1 \mathbf h_t + \mathbf W_2 \mathbf h_a + \mathbf b \bigr)
通俗理解:把触发词和论元的语义向量搅在一起,用一个打分器判断这对组合“搭不搭”。
  1. 双表示变换W1 h_t 与 W2 h_a 分别把触发词、论元映射到同一语义空间。
    W1ht+W2ha+b\mathbf W_1 \mathbf h_t + \mathbf W_2 \mathbf h_a + \mathbf b
  2. 非线性激活tanh 让融合表示能刻画复杂的匹配关系。
    tanh⁡(⋅)\tanh(\cdot)
  3. 压缩成分数向量 v 与融合表示内积,输出一个标量匹配分数。
    s(t,a)=v⊤tanh⁡(⋯ )s(t, a) = \mathbf v^{\top} \tanh(\cdots)

应用与价值

事件卡片越积越多,编辑部不再只是写新闻,而是变成了一座“情报库”。风控专员每天扫一眼卡片墙:今天新增了几起“违约”?哪家“收购”金额异常?舆情值班员盯着“爆炸”“事故”卡片的地点和时间,判断要不要拉响警报。

在金融领域,事件抽取从公告、财报、研报中抽取并购、违约、增持、减持等事件,形成量化与风控系统的信号源:一条“某房企宣告违约,金额 30 亿”的事件卡片,可能直接触发风控模型的预警。在舆情领域,从社交平台与新闻中实时抽取突发事件要素,是突发事件监测系统的核心模块。在知识图谱与搜索推荐中,事件卡片被打造成事实三元组,支撑新闻时间线、专题聚合等产品。

评估事件抽取系统,行业标准是精确率与召回率:精确率回答“系统报出的事件里有多少是真的”,召回率回答“真实发生的事件里系统抓到了多少”。金融场景偏重精确率以免误报扰动交易,舆情场景偏重召回率以免漏掉重大事件——两个指标如何权衡,取决于业务要“少做假”还是要“不漏报”。

主编最后把两张指标表钉在墙上:“一面是别报错,一面是别漏掉。”事件抽取的工程价值,正是在这两端之间找到平衡,把文字变成可决策的情报。

Precision=TPTP+FP,Recall=TPTP+FN\text{Precision} = \frac{TP}{TP + FP}, \qquad \text{Recall} = \frac{TP}{TP + FN}
一句话理解:精确率看“报得准不准”,召回率看“抓得全不全”,两者共同衡量事件抽取系统的实战能力。
  1. TP 正确抽取系统抽出来且确实是真实事件的记录。
    TPTP
  2. 精确率分母加入 FP(误报的事件),衡量报得准不准。
    TPTP+FP\frac{TP}{TP + FP}
  3. 召回率分母加入 FN(漏掉的事件),衡量抓得全不全。
    TPTP+FN\frac{TP}{TP + FN}

AI 应用场景

金融违约与并购事件监测

阶段:数据预处理与结构化(NLP 事件抽取)

解决的问题:传统风控靠人工翻阅公告与财报,一天读不完几百份文档,且判断标准因人而异。事件抽取自动从公告中抽取“违约主体、金额、时间”等事件要素,生成事件卡片,喂给风控模型作为预警信号。

具体案例:某券商舆情系统每日抓取 2 万篇公司公告,用 pipeline 方法识别“收购、违约、增持、减持”四类事件。当某地产公司公告中出现“违约”触发词并抽到 30 亿金额论元时,系统 3 秒内生成事件卡片并推送给风控团队,提示信用风险。

舆情突发事件预警

阶段:应用部署与实时监测

解决的问题:社交媒体消息量大、噪音多,靠关键词搜索容易漏报且无法区分“真出事”与“调侃”。事件抽取把“地震、爆炸、交通事故”等突发事件从推文中抽成带地点、时间的结构化记录,大幅降低误报与漏报。

具体案例:某省级应急平台接入微博与新闻流,当出现“凌晨 2 点某市发生 5.2 级地震”这类文本时,系统抽取触发词“地震”及论元“地点/震级/时间”,在 10 秒内生成预警卡片,辅助应急响应。

新闻自动结构化

阶段:内容理解与知识入库

解决的问题:新闻网站需要为每篇报道打标签、做时间线、关联人物,纯人工成本高且速度慢。事件抽取把报道转为事件卡片后,自动完成专题聚合、时间线生成与知识图谱入库。

具体案例:某资讯 App 对“某科技公司收购案”的连续报道做事件抽取,把 50 篇报道合并成一张动态事件卡片,卡片上“宣布收购→完成交割”的时间线全部由机器自动生成。

Python 演示

python77 行
# -*- coding: utf-8 -*-"""事件抽取 Pipeline 演示: 触发词识别 -> 论元抽取 -> 角色标注""" import re EVENT_TYPES = {    '收购': {        'trigger': '收购',        'slots': {            '收购方': {'side': 'before', 'pattern': '[\u4e00-\u9fa5]{2,8}(?:公司|集团|银行|科技)'},            '被收购方': {'side': 'after', 'pattern': '[\u4e00-\u9fa5]{2,8}(?:公司|集团|银行|科技)'},            '时间': {'side': 'any', 'pattern': '\d{4}年\d{1,2}月\d{1,2}日|\d{1,2}月\d{1,2}日'},            '金额': {'side': 'any', 'pattern': '\d+(?:\.\d+)?(?:亿|万)?元'},        }    },    '地震': {        'trigger': '地震',        'slots': {            '地点': {'side': 'before', 'pattern': '[\u4e00-\u9fa5]{2,6}(?:市|县|省|区)'},            '时间': {'side': 'any', 'pattern': '\d{4}年\d{1,2}月\d{1,2}日|\d{1,2}月\d{1,2}日'},            '震级': {'side': 'after', 'pattern': '\d+(?:\.\d+)?级'},            '伤亡': {'side': 'after', 'pattern': '\d+人(?:遇难|受伤)'},        }    },    '违约': {        'trigger': '违约',        'slots': {            '违约主体': {'side': 'before', 'pattern': '[\u4e00-\u9fa5]{2,8}(?:公司|集团|证券|控股)'},            '时间': {'side': 'any', 'pattern': '\d{4}年\d{1,2}月\d{1,2}日|\d{1,2}月\d{1,2}日'},            '金额': {'side': 'any', 'pattern': '\d+(?:\.\d+)?(?:亿|万)?元'},        }    }}  def detect_triggers(text):    """阶段1: 扫描全文, 返回所有触发词候选"""    hits = []    for name, conf in EVENT_TYPES.items():        for m in re.finditer(conf['trigger'], text):            hits.append({'type': name, 'pos': m.start()})    return hits  def extract_arguments(text, trig):    """阶段2+3: 在触发词邻域按模板抽取论元并直接分配角色"""    conf = EVENT_TYPES[trig['type']]    args = {}    for slot, spec in conf['slots'].items():        best = None        for m in re.finditer(spec['pattern'], text):            center = m.start() + len(m.group()) // 2            if spec['side'] == 'before' and center >= trig['pos']:                continue            if spec['side'] == 'after' and center <= trig['pos']:                continue            dist = abs(center - trig['pos'])            if dist <= 30 and (best is None or dist < best[0]):                best = (dist, m.group())        if best:            args[slot] = best[1]    return args  if __name__ == '__main__':    samples = [        '2023年6月15日, 腾讯科技以300亿元收购星辉游戏公司.',        '2023年9月5日凌晨, 四川省泸定县发生6.8级地震, 已致5人遇难.'    ]    for text in samples:        print('=' * 30)        print('输入: ' + text)        for trig in detect_triggers(text):            args = extract_arguments(text, trig)            print('触发词: %s | 事件类型: %s' % (EVENT_TYPES[trig['type']]['trigger'], trig['type']))            for slot, value in sorted(args.items()):                print('  角色[%s]: %s' % (slot, value))
目的:用正则规则实现一个三阶段流水线,演示“触发词识别 → 论元抽取 → 角色标注”如何把中文新闻句子转成结构化事件卡片。
  1. hits.append({'type': name, 'pos': m.start()})记录触发词类型和它在文中的位置,作为后续抽取的锚点。
  2. for slot, spec in conf['slots'].items():遍历事件模板的每个角色槽位,逐个“对号入座”。
  3. if spec['side'] == 'before' and center >= trig['pos']:收购方必须在触发词之前,避免把被收购方错填给收购方。
  4. dist = abs(center - trig['pos'])用距离衡量候选与触发词的亲疏,事件要素通常离触发词很近。
  5. if best: args[slot] = best[1]每个槽位只保留最近匹配片段作为论元,得到最终事件卡片。
  6. for trig in detect_triggers(text):一个句子可能包含多个事件,逐个触发词独立完成卡片归档。

常见误区

误区我以为事件抽取就是抽实体,把文中的人名、公司名、时间、地点都标出来就算完成任务了,不需要管它们之间的关系。

正解实体只是“素材”,事件抽取的核心是“事件结构”:必须找到触发词确定事件类型,再把实体作为论元绑定到触发词上并分配角色。就像编辑部拿到一摞人名地名不等于拿到一条新闻——只有确认“谁收购了谁”才是一张事件卡片。

为何常见:初学者先学到命名实体识别,看到两者都在“圈片段”,容易把事件抽取当成实体识别的进阶版,忽略了触发词与角色这两根支柱。

误区触发词就是文中的动词或高频词,统计一下词频、挑出现最多的词不就行了?

正解触发词的有效性完全依赖上下文。“收购”在“收购游戏公司”里是触发词,在“人才培养收购体系”里则不是。词频无法区分“陨石袭击”与“持刀袭击”,必须靠预训练模型提供的上下文表示做 token 级分类。

为何常见:人类读文本时下意识靠“词面”抓重点,容易忽视一词多义与语境漂移,于是高估了词频等表面特征的判别力。

误区触发词识别、论元抽取、角色标注是三个独立模块,各自模型调好,系统自然就准了。

正解pipeline 是串联结构,误差会连乘放大:0.9 × 0.8 × 0.9 ≈ 0.65。上游的触发词错误会让下游在最坏的输入上做无用功。实际工程不仅要单独优化每个环节,还要做错误级联分析,甚至考虑端到端联合模型来缓解误差传播。

为何常见:模块化思维深入人心,“分而治之”看起来天经地义,但忽视了串联系统的短板效应。

误区论元不都在触发词那一句话里吗?跨句的情况是少数,不用专门处理。

正解真实文本中论元跨句非常普遍:前句说“腾讯收购了它”,后句才交代“花费300亿元”。只做句内抽取会丢掉大量信息,必须引入篇章级建模,让模型在多个句子范围内寻找论元。忽略跨句论元,召回率会明显下降。

为何常见:教科书例句大多短小精悍,论元与触发词同句;真实语料却常有指代与省略,初学者容易被“干净”的训练样例误导。

面试题

Q1. 事件抽取中,“触发词”指的是

单选题 · easy

  • A.文本中出现次数最多的词
  • B.能激活特定事件类型的核心词← 正确答案
  • C.句子中语法上的主语成分
  • D.文章标题中出现的关键词

答案:B。触发词是能激活某个事件类型的核心词,相当于新闻的“题眼”,决定事件类型。A 只讲词频,C 只是句法成分,D 标题关键词与事件类型没有必然对应关系。

Q2. 下列哪一项属于事件论元

单选题 · easy

  • A.触发词“收购”本身
  • B.事件类型“商业收购”
  • C.参与事件的实体与时间地点← 正确答案
  • D.事件模板的角色槽位

答案:C。论元是参与事件的实体、时间、地点等要素,相当于事件卡片上的填空答案。A 是题眼,B 是事件类型标签,D 是模板槽位本身,三者都不是“填进去的内容”。

Q3. 同一词“袭击”在“刑事袭击”与“陨石袭击”中指向不同事件,这属于

单选题 · mid

  • A.论元跨句现象
  • B.触发词歧义现象← 正确答案
  • C.数据稀疏问题
  • D.错误传播问题

答案:B。同一词面在不同上下文指向不同事件类型,正是触发词歧义。A 指论元散布在多个句子,C 指标注样本不足,D 指 pipeline 误差累积,均与题意不符。

Q4. Pipeline 方法中触发词识别错误,对结果的影响是

单选题 · mid

  • A.完全不影响最终结果
  • B.仅降低角色标注准确率
  • C.误差沿流水线逐级放大← 正确答案
  • D.反而会提高抽取召回率

答案:C。pipeline 是串联结构,后续的论元抽取、角色标注都以触发词为条件,触发词错了后面全错。误差按连乘累积,等价于 0.9×0.8×0.9 式的概率衰减,而不是局部影响。

Q5. “以300亿元收购”中“300亿元”应被标注为

单选题 · hard

  • A.触发词,类别为收购
  • B.论元,角色为金额← 正确答案
  • C.事件类型为商业收购
  • D.角色体系中的时间槽位

答案:B。“300亿元”是参与事件的金额要素,属于论元,角色为“金额”。触发词是“收购”,事件类型是“商业收购”,时间槽对应的是日期,三者都不能用来描述“300亿元”。

Q6. 事件模板(角色体系)的作用是

单选题 · mid

  • A.规定该事件类型的论元槽位← 正确答案
  • B.存储待处理的原始文本语料
  • C.训练触发词二分类器模型
  • D.对新闻文档进行相关度排序

答案:A。事件模板定义某事件类型包含哪些角色槽位(如收购事件含收购方、被收购方、时间、金额),是角色标注的“对号入座”依据。B、C、D 分别涉及数据存储、模型训练和排序,都不是模板的职责。

Q7. 事件抽取任务的输入与输出是

单选题 · easy

  • A.图像输入,文本输出
  • B.音频输入,文本输出
  • C.文本输入,结构化事件记录← 正确答案
  • D.文本输入,词向量输出

答案:C。事件抽取输入非结构化文本,输出结构化事件记录(触发词 + 论元 + 角色)。A、B 把输入当成了图像和音频,D 把输出当成了词向量,均偏离任务定义。

Q8. 下列属于事件抽取核心挑战的有

多选题 · mid

  • A.触发词存在一词多义歧义← 正确答案
  • B.论元可能出现在跨句位置← 正确答案
  • C.标注数据稀缺且成本高← 正确答案
  • D.预训练模型参数量过大

答案:ABC。三大核心挑战是触发词歧义、论元跨句、数据稀疏,分别对应 C 的表述。D 中模型参数量是通用工程问题,不是事件抽取特有的知识挑战。

Q9. 关于触发词-论元对枚举,下列说法正确的有

多选题 · hard

  • A.邻域窗口内枚举候选片段并配对← 正确答案
  • B.触发词与论元都用上下文向量表示← 正确答案
  • C.完全不需要预定义事件模板
  • D.可显式建模触发词与论元的关联← 正确答案

答案:ABD。触发词-论元对枚举在触发词邻域枚举候选,用预训练上下文向量打分配对,显式建模两者的关联,A、B、D 正确。角色标注仍依赖事件模板定义角色体系,C 说法错误。

Q10. 设触发词识别准确率90%、论元抽取80%、角色标注90%,三者相互独立,事件记录完全正确的概率约为

多选题 · extreme

  • A.约 64.8%← 正确答案
  • B.约 72.0%
  • C.约 90.0%
  • D.约 98.9%

答案:A。事件记录完全正确要求三环全对,概率 = 0.9 × 0.8 × 0.9 = 0.648,即约 64.8%。B 是 0.8×0.9 的产物,C 是简单平均,D 是加法式叠加,都不符合流水线误差连乘的逻辑。