Gensim Doc2Vec most_similar()方法无法按预期工作

时间:2018-04-03 13:47:24

标签: python nlp gensim doc2vec sentence-similarity

我正在与Doc2Vec挣扎,我看不出我做错了什么。 我有一个带句子的文本文件。我想知道,对于给定的句子,我们可以在该文件中找到的最接近的句子是什么。

以下是模型创建的代码:

sentences = LabeledLineSentence(filename)

model = models.Doc2Vec(size=300, min_count=1, workers=4, window=5, alpha=0.025, min_alpha=0.025)
model.build_vocab(sentences)
model.train(sentences, epochs=50, total_examples=model.corpus_count)
model.save(modelName)

出于测试目的,这是我的文件:

uduidhud duidihdd
dsfsdf sdf sddfv
dcv dfv dfvdf g fgbfgbfdgnb
i like dogs
sgfggggggggggggggggg ggfggg

这是我的测试:

test = "i love dogs".split()
print(model.docvecs.most_similar([model.infer_vector(test)]))

无论训练什么参数,这显然应该告诉我最相似的句子是第4个(SENT_3或SENT_4,我不知道他们的索引是如何工作的,但句子标签是这种形式)。但结果如下:

[('SENT_0', 0.15669342875480652),
 ('SENT_2', 0.0008485736325383186),
 ('SENT_4', -0.009077289141714573)]

我错过了什么?如果我尝试同样的句子(我喜欢狗),我有SENT_2,然后是1然后4 ...我真的不明白。为什么这么低的数字呢?当我连续几次连续运行时,我也没有得到相同的结果。

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

Doc2Vec在玩具大小的示例上效果不佳。 (已发表的作品使用了数万到数百万的文本,甚至gensim内的微小单元测试也使用了数百个文本,结合了更小的向量size以及更多{{1}时代,以获得几乎不可靠的结果。)

因此,我不希望您的代码具有一致或有意义的结果。在以下情况尤其如此:

  • 使用微小数据维护大型向量iter(允许严重模型过度拟合)
  • 使用size(因为没有多少用法示例的单词无法获得良好的向量)
  • min_count=1更改为与较大的起始alpha保持一致(因为随机梯度下降学习算法的通常有益行为依赖于此更新率的逐渐衰减)
  • 使用几个单词的文档(因为doc-vectors按照它们包含的单词数量的比例进行训练)

最后,即使其他所有内容都有效,min_alpha通常会受益于更多infer_vector()而不是默认值5(到数十或数百),有时候更少steps喜欢它的推理默认值(0.1),更像是训练值(0.025)。

所以:

  • 不要更改alphamin_count
  • 获取更多数据
  • 如果它不是成千上万的文本,请使用较小的向量min_alpha以及更多size(但实现小数据集的结果可能仍然较弱)
  • 如果每个文字很小,请使用更多epochs(但实现结果可能仍然比较长的文本弱)
  • 尝试其他epochs参数,例如infer_vector()(或更多,尤其是小文本)和steps=50