Word2Vec 平均词向量作为 LSTM 的输入

问题描述

我正在使用 NLP 进行实验。我使用 Word2vec 来获得输入文本的分布式向量表示,然后将这些表示提供给不同的机器学习 (ML) 和深度学习 (DL) 算法以衡量性能。这是一个二元分类任务,我有目标标签

关于我在 this 帖子中使用的方法的 ML 模型,它基本上计算每个观察的平均词向量,并将其作为输入提供给帖子的案例,提供给 RandomForestClassifier。

关于 CNN 或 LSTM 等深度学习方法和实现我遇到过诸如 this 之类的实现,作者构建了一个嵌入矩阵,该矩阵充当字典,用于返回输入标记中每个单词的相应向量表示顺序。代码总结如下:

num_words = 100000
embedding_matrix = np.zeros((num_words,200))
for word,i in tokenizer.word_index.items():
    if i >= num_words:
        continue
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None:
        embedding_matrix[i] = embedding_vector

我正在尝试实现一个 LSTM 模型,该模型将使用每次观察的平均向量(输入标记序列)的方法。但是,抛出了一个错误,我不知道如何解决。此外,我还看到了 this,尤其是 this 帖子,其中作者有完全相同的问题。我尝试了回答的命题,但仍然无法使其工作。

到目前为止我尝试过的:

  • 生成 trainDataVectors、testDataVectors 就像在 ML 方法中一样,并将它们直接提供给 LSTM 模型,而无需添加嵌入层。不起作用,形状不匹配错误
  • 我无法理解 last post 中的答案我有不同的语法。

我对 LSTM 的实现是这样的:

model = Sequential()

model.add(Embedding(input_dim=num_words,output_dim=embedding_size,weights= [embedding_matrix],input_length=max_tokens,trainable=False,#the layer is not trained
                    name='embedding_layer'))
model.add(LSTM(units = embedding_size,dropout=0.2,recurrent_dropout=0.2))
model.add(Dense(1,activation='sigmoid'))

model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

history = model.fit(train_seq_pad,y_train,validation_data=(test_seq_pad,y_test),epochs=20,batch_size=30)

embedding_matrix 的构造如上图所示。 train_seq_pad 包含输入标记序列。它的形状是 [number_of_observations,max_token_length]。它的一个实例如下所示:

array([   1,2,1481,20,795,1073,3,9,11,91,10,0])

我在每个序列的末尾填充零,以便在需要时满足 max_token_length。数字代表嵌入矩阵中的索引,以便知道从每个输入序列中恢复哪些词向量。

我只想修改一个实现,以便将每个输入标记序列的平均向量作为输入,就像在 ML 方法中执行的那样。

有什么建议或提示吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)