使用深度学习突出显示句子中的重要单词

时间:2018-07-23 11:43:20

标签: python tensorflow keras lstm pytorch

我试图突出显示imdb数据集中的重要词,这些词最终有助于情感分析预测。

数据集如下:

X_train-以字符串形式进行审核。

Y_train-0或1

现在,在使用Glove嵌入来嵌入X_train值之后,我可以将其馈送到神经网络了。

现在我的问题是,我该如何突出概率重要的最重要的单词?就像deepmoji.mit.edu吗?

我尝试过什么:

  1. 我尝试将输入的句子拆分为二元语法,并使用一维CNN对其进行训练。稍后,当我们要查找X_test的重要单词时,我们将X_test拆分成两个字母,并找到它们的概率。它有效,但不准确。

  2. 我尝试使用预构建的分层注意网络并成功。我得到了想要的东西,但是我无法从代码中找出每一行和所有概念。这对我来说就像一个黑匣子。

我知道神经网络的工作原理,我可以使用numpy对其进行编码,并从头开始进行手动反向传播。我对lstm的工作原理以及忘记,更新和输出门实际输出的内容有详细的了解。但是我仍然无法弄清楚如何提取注意力权重以及如何将数据制作成3D数组(我们的2D数据的时间步长是什么?)

因此,欢迎任何类型的指导

1 个答案:

答案 0 :(得分:0)

这里是带有Attention(不是Hierarchical)的版本,但是您应该也能弄清楚如何使其与层次结构一起使用-如果没有,我也可以提供帮助。诀窍是定义2个模型,并使用1个模型进行训练(模型),并使用另一个模型来提取注意力值(model_with_attention_output):

# Tensorflow 1.9; Keras 2.2.0 (latest versions)
# should be backwards compatible upto Keras 2.0.9 and tf 1.5
from keras.models import Model
from keras.layers import *
import numpy as np

dictionary_size=1000

def create_models():
  #Get a sequence of indexes of words as input:
  # Keras supports dynamic input lengths if you provide (None,) as the 
  #  input shape
  inp = Input((None,))
  #Embed words into vectors of size 10 each:
  # Output shape is (None,10)
  embs = Embedding(dictionary_size, 10)(inp)
  # Run LSTM on these vectors and return output on each timestep
  # Output shape is (None,5)
  lstm = LSTM(5, return_sequences=True)(embs)
  ##Attention Block
  #Transform each timestep into 1 value (attention_value) 
  # Output shape is (None,1)
  attention = TimeDistributed(Dense(1))(lstm)
  #By running softmax on axis 1 we force attention_values
  # to sum up to 1. We are effectively assigning a "weight" to each timestep
  # Output shape is still (None,1) but each value changes
  attention_vals = Softmax(axis=1)(attention)
  # Multiply the encoded timestep by the respective weight
  # I.e. we are scaling each timestep based on its weight
  # Output shape is (None,5): (None,5)*(None,1)=(None,5)
  scaled_vecs = Multiply()([lstm,attention_vals])
  # Sum up all scaled timesteps into 1 vector 
  # i.e. obtain a weighted sum of timesteps
  # Output shape is (5,) : Observe the time dimension got collapsed
  context_vector = Lambda(lambda x: K.sum(x,axis=1))(scaled_vecs)
  ##Attention Block over
  # Get the output out
  out = Dense(1,activation='sigmoid')(context_vector)

  model = Model(inp, out)
  model_with_attention_output = Model(inp, [out, attention_vals])
  model.compile(optimizer='adam',loss='binary_crossentropy')
  return model, model_with_attention_output

model,model_with_attention_output = create_models()


model.fit(np.array([[1,2,3]]),[1],batch_size=1)
print ('Attention Over each word: ',model_with_attention_output.predict(np.array([[1,2,3]]),batch_size=1)[1])

输出将是带有每个单词的关注值的numpy数组-值越高,单词就越重要

编辑:您可能想用embs代替乘法中的lstm,以获得更好的解释,但会导致性能更差...