keras 在LSTM的padded_sequence中添加另一个数组

4szc88ey  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(86)

我刚开始做RNN。我正在做一个LSTM模型,需要接受twitter帖子作为文本和情感。我遇到了如何为模型准备预处理数据的问题。
我使用的是tesorflow v2.12.0。
posts是一个twitter帖子数组。情绪分为neg,neu和pos。

posts=data['post'].values.tolist()

sent_neg=np.array(data['sent_neg'])
sent_neu=np.array(data['sent_neu'])
sent_pos=np.array(data['sent_pos'])
sequences=tokenizer.texts_to_sequences(posts)
maxlen = max(len(seq) for seq in sequences)
padded_sequence = tf.keras.preprocessing.sequence.pad_sequences(sequences, truncating='post', padding='post', maxlen=maxlen)

我使用的是VaderSentiment,它返回文本的情感,它的形式是[0,1,2]。由于RNN接受顺序数据,我想知道如何将情感添加到填充数据中。
sent_array是一个数组,每个post都有sent,其中sent_array[0]posts[0]的sent。
目前,我已经添加发送到这样的填充数据。

input = np.concatenate((padded_sequence, sent_array), axis=1)

尽管colab让我运行和训练这个模型,但当我试图通过flask在我的localhost上进行预测时,它给了我一个错误,我接受了一个单一的文本,并在上面运行维达情绪
这是 flask 上的密码

text = request.get_json()['text']
padded = preprocessing(text)
sentiment_dict = sent_analysis(text) # returns sent in [0,1,2,3] format
print(sentiment_dict)
sent_arr = [value for value in sentiment_dict.values()]
sent_arr.pop() # last value not needed  

sent_neg = np.array(sent_arr[0])
sent_neu = np.array(sent_arr[1])
sent_pos = np.array(sent_arr[2]) 

sentiment_array = np.stack((sent_neg,sent_neu,sent_pos), axis=0)

sentiment_array = sentiment_array.reshape((1, -1))
  
input = np.concatenate((padded, sentiment_array), axis=1) `

返回以下错误这,
ValueError:串联轴的所有输入数组维度必须完全匹配,但沿着维度,索引为的数组的大小为248,索引为1的数组的大小为1
我想知道我是否已经在两端正确地预处理了我的数据。提前感谢您的任何反馈:)

k2fxgqgv

k2fxgqgv1#

如果我理解正确的话,你有一组帖子作为输入,它们的形状经过标记化后为(nr. of posts, max_len)。现在你想以某种方式在其输入中包含每篇帖子的情感信息。
我认为有两种方法可以做到这一点。
首先,您可以在每个分词输入之前添加其情感值,因此您将获得一个新的输入形状(nr. of posts, 1 + max_len)。在这里,您必须注意情感值[0,1,2]不要与分词器的值重叠。因此,您需要找出分词器不使用的值。可能,[-1,-2,-3]应该有效。
另一种选择是在嵌入输入标记之后添加情感信息。在这种情况下,您可以再次将值前置或实际将情感值求和到嵌入的向量(在这种情况下,我会将情感值重新缩放为[-1,0,1])。
我认为在代码中它看起来像这样:

temp = np.zeros((padded_sequence.shape[0], padded_sequence[1]+1)) # assumes padded_sequence has shape (n_samples, max_len) 

temp[:, 1:] = padded_sequence

for i in range(temp.shape[0]):
    temp[i,0] = all_sents[0] - 3

padded_sequence = temp

padded_sequence现在在该帖子的每个序列的开始处嵌入了情感值。我使用-3,因为这些值不应该与tokenisers的输出值重叠。
希望,这有助于我正确理解你的问题。

相关问题