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

Posted

技术标签:

【中文标题】Gensim Doc2Vec most_similar() 方法未按预期工作【英文标题】:Gensim Doc2Vec most_similar() method not working as expected 【发布时间】:2018-09-12 21:06:14 【问题描述】:

我在 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】:

Doc2Vec 不适用于玩具大小的示例。 (已发布的作品使用数万到数百万个文本,甚至gensim 内部的微小单元测试也使用数百个文本,结合更小的向量size 和更多iter epochs,以获得只是勉强可靠的结果。)

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

使用小数据维护大向量 size(这会导致严重的模型过度拟合) 使用min_count=1(因为没有很多不同用法示例的单词无法获得好的向量) 更改 min_alpha 以保持与较大的起始 alpha 相同(因为随机梯度下降学习算法通常有益的行为依赖于此更新率的逐渐衰减) 使用只有几个单词的文档(因为 doc-vector 的训练与其包含的单词数成比例)

最后,即使其他一切正常,infer_vector() 通常也比默认的 5 受益更多的steps(到几十或几百),有时起始 alpha 不如它的推理默认值(0.1 ) 更像是训练值 (0.025)。

所以:

不要更改min_countmin_alpha 获取更多数据 如果不是数万条文本,请使用更小的向量 size 和更多的 epochs(但要意识到结果可能在数据集较小时仍然很弱) 如果每个文本都很小,请使用更多 epochs(但要意识到结果可能仍然比使用更长的文本更弱) 尝试其他infer_vector()参数,如steps=50(或更多,尤其是小文本)和alpha=0.025

【讨论】:

以上是关于Gensim Doc2Vec most_similar() 方法未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

改进Gensim Doc2vec结果

doc2vec 利用gensim 生成文档向量

如何从 gensim 模型中的 Doc2Vec 相似度分数访问文档详细信息?

如何将 Gensim doc2vec 与预训练的词向量一起使用?

机器学习使用gensim 的 doc2vec 实现文本相似度检测

doc2vec使用说明gensim工具包 LabeledSentence