[论文笔记] A Joint Neural Model for Information Extraction with Global Features

2020 ACL会议《A Joint Neural Model for Information Extraction with Global Features》

论文地址

该论文提出一个名为ONEIE的信息抽取框架,增加一个全局特征,在实例之间和子任务之间进行联合决策。

1. Introduction

大多数的信息抽取的联合学习模型使用task-specific分类对独立实体进行标记而不是使用实体之间的交互信息。论文提出名为ONEIE的端到端信息抽取框架,整个过程分为四个操作阶段:

  1. 对输入语句进行编码(Embedding);
  2. 识别句中的实体(Entity)和事件(Event)并用结点(Node)进行表示;
  3. 使用句内信息(Local classifier)计算所有结点及其连接(Link)的标签分数(Label Score);
  4. 解码(Decoding)时使用束搜索(Beam search)找到全局最优图。

在解码阶段加入全局特征(Global Feature)捕捉实例之间(cross-instance)和子任务之间(cross-subtask)的联系(Interaction)。同时ONEIE框架没有使用任何特定语言的语法特征(Language-specific feature),所以很容易适应新语言。

框架示意图

2. Task

  1. Entity Extraction

    根据提前定义(Pre-defined)的实体分类识别语句中提及的实体。

  2. Relation Extraction

    对给定的实体对分配关系类型。

  3. Event Extraction

    涉及识别非结构语句中的事件触发语(Event trigger: the word or phrases that most clearly express event occurrences)及这些词语和短语的论据(Arguments: the words and phrases for participants in those events),并将这些短语根据类型和语法规则进行分类。

    一个Argument可以是一个实体、时间表达式或数值等。

对信息抽取的任务作如下规定:
对于给定的句子,目的是提取一个信息表示图: G = ( V , E ) G=(V,E) G=(V,E),其中 V V V E E E分别表示结点集和边集。

对于任意结点 v i = < a i , b i , l i > ∈ V v_i=<a_i, b_i, l_i>\in V vi=<ai,bi,li>V表示一个实体(Entity)或事件触发器(Event trigger),其中 a a a b b b分别表示结点起始和结束词语的索引(indices), l l l表示结点类型标签(Node type label)。

对于任意边 e i j = < i , j , l i j > ∈ E e_{ij}=<i,j,l_{ij}>\in E eij=<i,j,lij>E表示两个结点之间的关系,其中 i i i j j j分别表示两个相关结点的索引, l i j l_{ij} lij表示关系类型。

3. Approach

ONEIE框架对给定的语句进行信息网络提取,分为以下四步:encoding,identification,classification和decoding。我们使用预训练的BERT模型进行编码,然后对语句中的实体和事件触发器进行识别。之后计算所有的结点和相关的边的类型标签分数(Type label scores)。在解码阶段,我们使用束搜索(Beam Search)探索输入语句可能的信息网络。

3.1 Encoding

输入一句包含 L L L个词的语句,使用预训练的BERT模型将每个词表示为 x i x_i xi。实验发现使用最后三层BERT在大多数的子任务上表现较好。

3.2 Identification

这一阶段将识别句中的实体提及和事件触发器,并表示为信息网络中的结点。我们使用前馈神经网络FFN计算每个词的分数向量 y ^ i = F F N ( x i ) \hat{y}_i=FFN(x_i) y^i=FFN(xi) y ^ i \hat{y}_i y^i表示一个标签在目标标签集(Target tag set)中的分数。

之后使用CRF层捕捉标签之间的联系,计算tag path z ^ = { z 1 ^ , . . . , z ^ L } \hat{z}=\{\hat{z_1},...,\hat{z}_L\} z^={ z1^,...,z^L}的分数:
s ( X , z ^ ) = ∑ i = 1 L y ^ i , z i ^ + ∑ i = 1 L + 1 A z ^ i − 1 , z ^ i s(X,\hat{z})=\sum_{i=1}^{L}{\hat{y}_{i,\hat{z_i}}}+\sum_{i=1}^{L+1}{A_{\hat{z}_{i-1},\hat{z}_{i}}} s(X,z^)=i=1Ly^i,zi^+i=1L+1A

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是使用Python实现NEURAL NETWORKS Uplift model for multiple correlated responses WITH LOWRANK REGULARIZATION的代码示例: ```python import numpy as np import pandas as pd import tensorflow as tf from sklearn.model_selection import train_test_split # 导入数据集 data = pd.read_csv('data.csv') X = data.drop(['response', 'treatment'], axis=1).values y = data['response'].values t = data['treatment'].values # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test, t_train, t_test = train_test_split(X, y, t, test_size=0.2) # 定义常量 n_features = X.shape[1] n_components = 5 alpha = 0.01 # 定义占位符 X_ph = tf.placeholder(tf.float32, shape=[None, n_features], name='X') y_ph = tf.placeholder(tf.float32, shape=[None], name='y') t_ph = tf.placeholder(tf.float32, shape=[None], name='t') # 定义神经网络模型 hidden_layer_1 = tf.layers.dense(X_ph, 64, activation=tf.nn.relu) hidden_layer_2 = tf.layers.dense(hidden_layer_1, 32, activation=tf.nn.relu) y_pred = tf.layers.dense(hidden_layer_2, 1, activation=tf.nn.sigmoid) # 定义损失函数 treated = tf.cast(tf.equal(t_ph, 1), tf.float32) control = 1 - treated uplift = tf.reduce_mean((y_pred * treated - y_pred * control)) mse = tf.reduce_mean(tf.square(y_pred - y_ph)) lowrank = tf.reduce_sum(tf.svd(tf.transpose(hidden_layer_1), compute_uv=False)) loss = mse - alpha * uplift + alpha * lowrank # 定义优化器 optimizer = tf.train.AdamOptimizer(learning_rate=0.001) train_step = optimizer.minimize(loss) # 定义会话 sess = tf.Session() sess.run(tf.global_variables_initializer()) # 训练模型 for i in range(100): _, loss_value, uplift_value, mse_value, lowrank_value = sess.run([train_step, loss, uplift, mse, lowrank], feed_dict={X_ph: X_train, y_ph: y_train, t_ph: t_train}) print('Epoch %d - Loss: %.4f, Uplift: %.4f, MSE: %.4f, Lowrank: %.4f' % (i, loss_value, uplift_value, mse_value, lowrank_value)) # 预测响应变量的值 y_train_pred = sess.run(y_pred, feed_dict={X_ph: X_train}) y_test_pred = sess.run(y_pred, feed_dict={X_ph: X_test}) # 计算控制组和干预组之间的差异 uplift_train = np.mean(y_train_pred[t_train == 1] - y_train_pred[t_train == 0]) uplift_test = np.mean(y_test_pred[t_test == 1] - y_test_pred[t_test == 0]) # 输出结果 print('Train uplift: %.2f' % uplift_train) print('Test uplift: %.2f' % uplift_test) ``` 请注意,这只是一个简单的示例,实际实现可能涉及更多的数据预处理和模型调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值