关系抽取专题(一)Relation Classification via Convolutional Deep Neural Network

关系抽取论文笔记: Relation Classification via Convolutional Deep Neural Network

Author: Daojian Zeng, Kang Liu, Siwei Lai, Guangyou Zhou and Jun Zhao

中科院自动化所

来源:COLING14

1.1 研究动机

本文是中科院自动化所在14年COLING上发表的一篇文章,是关系抽取早期比较经典的一个工作。本文的主要动机,是将卷积神经网络应用到关系分类上,而不是人工的去筛选词汇层面和句子层面的特征。

1.2 研究方法

本文采用的方法从架构上来看,主要分成3层,词表示层 (即将每一个单词转换成向量,本文的实现时选取了两个当时主流的可选项:senna(50), google word2vec(300)),特征抽取层(词汇特征和句子特征),线性分类层(即一个全连接层加一个softmax输出关系分类),如下图所示:
网络架构

该架构的关键是特征抽取层,将词汇层面的特征和句子层面的特征进行拼接。 词汇层面的特征,论文中表示使用的是实体本身及其实体前后各一个词作为context以及wordnet的义原的上位词,将这些特征进行拼接,构成lexical feature。论文的代码实现这一块非常清晰,只不过没有采用wordnet的义原,当然这部分也可以直接通过gensim添加。

def _lexical_feature(raw_example):
  def _entity_context(e_idx, sent):
    ''' return [w(e-1), w(e), w(e+1)]
    '''
    context = []
    context.append(sent[e_idx])

    if e_idx >= 1:
      context.append(sent[e_idx-1])
    else:
      context.append(sent[e_idx])
    
    if e_idx < len(sent)-1:
      context.append(sent[e_idx+1])
    else:
      context.append(sent[e_idx])
    
    return context

    
  e1_idx = raw_example.entity1.first
  e2_idx = raw_example.entity2.first

  context1 = _entity_context(e1_idx, raw_example.sentence)
  context2 = _entity_context(e2_idx, raw_example.sentence)

  # ignore WordNet hypernyms in paper
  lexical = context1 + context2
  return lexical

句子层面的特征,则是将句子中的每一个词的word feature(WF)和位置向量进行拼接,送入一个卷积+池化层,得到句子层级的特征。本文的WF其实是一个滑动窗口,包含这个词以及它前后两个词。举文中一个简单例子,一句话S : [People]0 have1 been2 moving3 back4 into5 [downtown]6,这里的WF可以表示成 [ x s , x 0 , x 1 ] , [ x 0 , x 1 , x 2 ] , ⋅ ⋅ ⋅ , [ x 5 , x 6 , x e ] 5 {[x_s, x_0, x_1], [x_0, x_1, x_2], · · · , [x_5, x_6, x_e]}^5 [xs,x0,x1],[x0,x1,x2],,[x5,x6,xe]5。而位置特征,则用到两个名词的距离来表示,即 P F = [ d 1 , d 2 ] PF = [d_1, d_2] PF=[d1,d2]。整个句子特征的获得可以从下图看出:
句子特征获取 句子层级特征提取的代码如下,其实也就是标准的卷积层+池化层,卷积核取了[3,4,5]三种,数目为每种100个。

def cnn_forward(name, sent_pos, lexical, num_filters):
  with tf.variable_scope(name):
    input = tf.expand_dims(sent_pos, axis=-1)
    input_dim = input.shape.as_list()[2]

    # convolutional layer
    pool_outputs = []
    for filter_size in [3,4,5]:
      with tf.variable_scope('conv-%s' % filter_size):
        conv_weight = tf.get_variable('W1', 
                            [filter_size, input_dim, 1, num_filters],
                            initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv_bias = tf.get_variable('b1', [num_filters], 
                              initializer=tf.constant_initializer(0.1))
        conv = tf.nn.conv2d(input,
                            conv_weight,
                            strides=[1, 1, input_dim, 1],
                            padding='SAME')
        conv = tf.nn.relu(conv + conv_bias) # batch_size, max_len, 1, num_filters
        max_len = FLAGS.max_len
        pool = tf.nn.max_pool(conv, 
                              ksize= [1, max_len, 1, 1], 
                              strides=[1, max_len, 1, 1], 
                              padding='SAME') # batch_size, 1, 1, num_filters
        pool_outputs.append(pool)
    pools = tf.reshape(tf.concat(pool_outputs, 3), [-1, 3*num_filters])

    # feature 
    feature = pools
    if lexical is not None:
      feature = tf.concat([lexical, feature], axis=1)
    return feature

1.3 实验结果

本文提出的方法在当时的任务SemEval-2010任务8的数据集上,取得了STOA。从下面给出的实验结果中,看出比较分类器
从特征的作用上看,位置特征在关系抽取中起到最重要的作用,而组合特征也可以明显提高F1值。下表中L1 是实体名词1,L2是实体名词2,L3是实体1的上下文,L4是实体名词2的上下文,L5是实体的义原特征
F1值

1.4 创新点

本文的主要创新点有三:

  1. 采用CNN来抽取特征
  2. 将词汇特征和句子特征拼接
  3. 采用了位置嵌入的方式来强化句子特征

1.5 个人点评

本文的一个非常重要的贡献是将CNN合理的应用于关系抽取任务,并很好的对实体和句子进行了很好的表示学习。位置编码手动加入特征层,对于后续的关系抽取任务影响深远。对于词特征的表达,作者想到将context编码进去,在当时是非常有前瞻性的思路,尽管实现方式粗糙。

1.6 模型调试心得

1.6.1 模型地址

本文的源码有开源的实现:https://github.com/FrankWork/conv_relation

1.6.2 模型运行环境

tensorflow 1.4.0
python 3.5

1.6.3 数据集选择与下载

数据集是文章的dataset: SemEval2010 task8

1.6.4 模型运行步骤

下周源码,直接运行./run的脚本就好。注意低于1.4的本版,需要稍作修改,比如tf.data 改 成早期打tf.contrib.data。 这里设置打是运行200step, 词向量50维度。 在没有特别调参的情况下,基本可以达到作者文中所说的指标 (略低是因为代码实现的时候lexical feature没有考虑义原特征)

训练

Test: python src/train.py --num_epochs=200 --word_dim=50 --test 得到最准率 0.7799,得到result.txt.

result
用per脚本分析,得到F1F1

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值