Ying Zeng, Honghui Yang, Yansong Feng, Zheng Wang, Dongyan Zhao, “A Convolution BiLSTM Neural Network Model for Chinese Event Extraction”, NLPCC 2016
1 简介
这篇文章是用 CNN + BiLSTM 做事件抽取。CNN 能提取 local feature,也就是事件抽取任务中的 lexical features,LSTM 可以记住很久之前的特征,在这里就用来提取 sentence-level features
这篇文章的算法分成 trigger 和 argument 两个部分,两部分的模型结构差不多。
2 trigger 识别
首先,对于中文的 trigger 识别,有以下几个特殊的地方:
- 需要分词,分词的粒度对于最后的预测也有很大影响。
- 会有 cross-word triggers,即多个 token 组成一个 trigger,比如“落入法网”。
- 会有 inside-word triggers,即 trigger 可能是 token 里面的一部分,比如“击毙”这一个 token 就含有两个 trigger。
这三个问题是怎么解决的呢?第一个问题,利用 CNN 不同 width 的 kernel 解决;后两个问题,就把输入改成字向量,而非词向量。当然,由于 LSTM 每个单元代表的是子了,就没法把 trigger 识别当做分类问题来做。于是就将其视作 BIO 序列标注的问题,去标出 trigger 的 Begin 和 Inside。
当然,为了对比词向量和字向量的输入,这篇文章都得做,所以词向量输入的,也是解决 BIO 标注问题。下面是词向量输入的 ConvBiLSTM 结构:

左边是整体,右边是 CNN 的局部。输入词向量,通过 BiLSTM 得到表示 $h_t = [\overrightarrow{h_t};\overleftarrow{h_t}]$,再拼合 CNN 对词语 $w_t$ 的特征提取结果 $c_{w_t}$,即是 $w_t$ 既有 lexical 又有 sentence-level 的特征表示,最后过一层 softmax,得到这个词是 B 或 I 或 O 的概率。
CNN 是很普通的 textCNN,略。
基于词向量的模型,可能找不出 inside-word triggers,作者就建立了一个 global errata table,把没找到的手动记下来,然后在测试的时候,就直接用表项做替换。。。
字向量输入的模型,只是改个输入,其他不变。
3 argument 识别
argument 识别是只能输入词向量了(我认为,这是因为之前得到的 trigger 只能以词向量的形式使用)。那与 trigger 识别模型的不同就在于,输入的 embedding 除了纯粹的 word-embedding,还拼上了下列部分:
- 当前词是不是 trigger
- 当前词的 trigger type
- 这个词是不是 entity
- 这个词的 entity type( 3 和 4 都是 ACE 数据集中自带的)
argument 识别就不是 BIO 标注了,就还是分类。具体在模型上,在 CNN 中,把整句话作为邻居来卷积(这里我不明白,卷积不就是为了得到 localize 特征吗?为什么要整句卷?那不就是全连接网络了吗??)
4 实验
作者对比了 CNN + word embedding、Bi-LSTM + word embedding、CNN + Bi-LSTM + word embedding、CNN + Bi-LSTM + character embedding,以及两个 baseline,得到以下结论:
在 trigger 识别问题上:
- 词向量的准确率更好,字向量的召回率更好。作者分析,有如下原因:
- 词向量的存在之前说的 cross-word 和 inside-word 问题,字向量的在这些时候更好,召回率就高。
- 字向量的需要额外学习分词、会让 RNN 更长,词向量能表示更多的语义信息,因此词向量的准确度好。
- errata table 非常有用,准确率召回率都有提升。
- CNN + Bi-LSTM 要比单纯用 CNN 或者单纯用 Bi-LSTM 都好。
在 argument 识别问题上:
- 对于词向量和字向量两种方法得到的 trigger,后者的 trigger 更精确,所以在 argument 识别时,准确率召回率都是字向量的更好。
- errata table 没那么有用了,甚至准确率还会下降。
5 总结
中文没有分词是真的烦。这篇文章用的字向量,那能不能同时用呢?即不同范围的特征,我都用上呢?
[mathjax]