关系抽取专题(二)Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification

1. 论文研读笔记

1.1 研究动机

本文是中科院自动化所在16年ACL上发表的一篇短文,是关系抽取非常经典的一个工作。本文的主要动机,是将当时在NLP的很多任务上成功应用的BiLSTM+attention架构应用到关系抽取,这个框架的好处是完全的端到端,不用做任何的特征工程。上一篇的CNN虽然减少了很多特征选择的工作,但还是精心设计了词汇特征和句子特征,精心选取了上为词和位置编码,而本文则是完全的端到端。

1.2 研究方法

本文采用的方法从架构上来看,从输入层向上,先是一个词嵌入,然后是两个并行的LSTM层(前项+后项),结果拼接之后过一个attention层,之后送入softmax层,得到最后的关系分类,如下图所示:
关系抽取专题(二)Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification

1.3 实验结果

实验的结果在当时得到了STOA,F1 达到84%,比上一篇的CNN的方法提高了2%。具体结果如下图:
关系抽取专题(二)Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification

1.4 创新点

本文的主要创新点有:

  1. 应用了在Transformer和预训练模型框架出现前,效果最好的端到端框架LSTM+attention
  2. 取得了数据集上的STOA

1.5 个人点评

因为Bi-LSTM +attention的使用较多,这里有两点值得探究,一是Bi-LSTM 的前后项,实际中,经常是拼接,这里采用按位加,感觉差别不大,但个人觉得可能拼接得到的效果更好,毕竟attention的权重,本质上依据的是向量的相似性。另一个问题是,这里仅仅采用了一个基本的attention,其实在关系抽取中,根据本身的实体,可以设计多级别的attention进行增强。 此外,文章一直强调没有使用外部信息,其实,现在的理解更多的是如何在网络中增加常识信息。 感觉这是一个轮回。

2. 模型调试心得

2.1 模型地址

主要参考了https://github.com/SeoSangwoo/Attention-Based-BiLSTM-relation-extraction.git,这里感谢代码贡献者。

2.2 模型运行环境

tensorflow 1.4.0+
python 3.5+
nltk
glove 预训练词向量

2.3 数据集选择与下载

数据集是文章的dataset: SemEval2010 task8

2.4 模型运行步骤

1)训练 python train.py --embedding_path “{词向量路径}”
关系抽取专题(二)Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification
2 测试 python eval.py --checkpoint_dir “runs/1523902663/checkpoints/”
关系抽取专题(二)Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification

2.5 问题与解决方法汇总

一个小问题 ,就是如果nltk安装的时候,没有下载数据,可能会运行报错。解决方法
python -> import nltk -> nltk.download(‘punkt’)
其中,nltk.tokenize.punkt中包含了很多预先训练好的tokenize模型。详见Dive into NLTK II. 具体应用如下:

import nltk.data
tokenizer = nltk.data.load(‘tokenizers/punkt/english.pickle’)
tokenizer.tokenize(text)

2.6 个人点评

这个实现的写法异常熟悉,和之前的文本分类的textrnn几乎一模一样, 写的非常的清晰,区别就是这里遵循论文的写法,双向lstm 的两个输出用了相加而不是拼接。一个奇怪的地方是,他没有固定embedding层,而是一起训练,我感觉没有充分利用预训练模型,所以最终f1只有81.15,低于文章所说。后面我会补充修改后的训练和测试结果。