python - Gensim Doc2Vec most_similar() 方法没有按预期工作

标签 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……我真的不明白。为什么数字这么低?当我连续运行几次负载时,我也没有得到相同的结果。

谢谢你的帮助

最佳答案

Doc2Vec 不适用于玩具大小的示例。 (已发表的作品使用了数万到数百万的文本,甚至 gensim 中的微小单元测试也使用了数百个文本,并结合了更小的向量 size以及更多的 iter 时期,以获得勉强可靠的结果。)

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

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

最后,即使其他一切正常,infer_vector() 通常受益于比默认的 5(数十或数百)更多的步骤,有时起始 alpha 不太像它的推理默认值 (0.1) 而更像训练值 (0.025)。

所以:

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

关于python - Gensim Doc2Vec most_similar() 方法没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49631758/

相关文章:

python - 使用 Pandas 创建索引

perl - 从字符串中提取格式不一致的日期(日期解析,NLP)

machine-learning - 如何使用经过训练的模型创建模型?

Python gensim LDA : add the topic to the document after getting the topics

python - 为什么 werkzeugs `generate_password_hash` 的输出不是恒定的?

python - bokeh:在图形/绘图之间切换的小部件

python - f2py:在与 python 交互时在 fortran 中指定真正的精度?

python-3.x - `return_sequences = False` 在 pytorch LSTM 中等效

python - 使用 PerceptronTagger 阅读我自己的 NLTK 词性标记数据集

python - 包装器的 Gensim 模块属性错误