使用LSTM预训练Word2Vec,预测句子中的下一个单词

时间:2019-02-13 16:27:23

标签: python machine-learning keras nlp lstm

我有一个文本语料库。对于预处理数据,我使用gensim Word2Vec对所有文本进行了矢量化处理。 我不明白我做错了什么。作为基础,我进行了此讨论(以及不错的教程)predict next word。代码:Source code

作为输入,我有几行句子。我要接受每一行,然后接受此行的word [0]->预测word [1]。然后使用单词[0]和单词[1]预测单词[3],依此类推直到行尾。

在本教程中,每次都会预测单词的固定长度。 我的工作:

def on_epoch_end(epoch, _):
    print('\nGenerating text after epoch: %d' % epoch)
    for sentence in inpt:
        word_first=sentence.split()[0]
        sample = generate_next(word_first, len(sentence))
        print('%s... -> %s' % (word_first, sample))

我选择第一个单词,然后用它生成所有单词。作为第二个参数,我给出了句子的长度(不是num_generated=10),如本教程所述。但这对我完全没有帮助。每当我得到输出预测的单词序列时,其长度都是随机的(在我看来)。

我在做什么错以及如何解决?

1 个答案:

答案 0 :(得分:0)

我的测试脚本:

texts = [
    'neural network',
    'this',
    'it is very',
]
for text in texts:
  print('%s... -> %s' % (text, generate_next(text, num_generated=5)))

输出:

neural network... -> neural network that making isometry adopted riskaverting
this... -> this dropout formalize locally secondly spectrogram
it is very... -> it is very achievable machinery our past possibly

您可以看到输出的长度是num_generated加输入的长度。

我猜您期望所有输出的长度为num_generated。但这不是generate_next的工作方式。此函数实际上会生成num_generated个单词,并将它们附加到原始输入中。

如果要输出固定长度的输出,请尝试:

generate_next(text, num_generated=5-len(text.split()))