Doc2Vec - 在测试数据中查找文档相似性

问题描述 投票:0回答:2

我正在尝试使用训练数据训练doc2vec模型,然后使用训练有素的doc2vec模型找到测试数据中测试数据中每个文档的相似性。但是,我无法确定如何执行此操作。

我目前正在使用model.docvecs.most_similar(...)。但是,该功能仅查找测试数据中特定文档的训练数据中每个文档的相似性。

我尝试使用model.docvecs.n_similarity(inferred_vector.tolist(), testvectors[i].tolist())手动比较测试数据中特定文档的推断向量与测试数据中每个其他文档的推断向量,但这会返回KeyError: "tag '-0.3502606451511383' not seen in training corpus/invalid",因为字体中没有向量。

python machine-learning gensim doc2vec
2个回答
1
投票

训练Doc2Vec模型的行为留下了从训练数据中学习的doc向量的记录,是的,most_similar()只是在这些向量中查找。

通常,对不属于培训的新文档进行任何操作都需要使用infer_vector()。请注意这样的推断:

  • 忽略新文档中的任何未知单词
  • 可以从参数调整中受益,特别是对于短文档
  • 目前只在一个线程中完成了一个文档 - 因此,获取一大批N-000个文档的推断向量实际上比在相同的N-000个文档上训练新模型要慢
  • 除非你采取额外的步骤,否则不一定是确定性的,因为基础算法在训练/推理期间使用随机初始化和随机选择过程
  • 只是给你矢量,而不是加载到任何方便的存储对象,以进行进一步的most_similar()类比较

另一方面,来自“冻结”模型的这种推断可以跨过程或机器并行化。

您提到的n_similarity()方法并不适合您的需求:它期望现有doc向量的查找键('tags')列表,而不是您提供的原始向量。

您在答案中提到的similarity_unseen_docs()方法有点合适,但只需要一对文档,每次重新计算它们的向量 - 如果需要将一个新文档的doc-vector与许多其他新文档进行比较,那么有点浪费向量。

您可能只想训练一个全新的模型,包括您的“培训文档”和“测试文档”。然后,所有“测试文档”都会计算出他们的doc-vectors,并存储在模型中,作为批量训练的一部分。这是许多可能的应用程序的合适选择,并且实际上可以基于仅以完全无监督的方式出现在“测试文档”中的单词来学习有趣的关系。而且你的问题中还没有任何一部分说明为什么不能在这里考虑它。

或者,你想要infer_vector()所有新的“测试文档”,并将它们放入像KeyedVectors中的各种gensim实用程序类这样的结构中 - 记住一个数组中的所有向量,记住从doc-key到vector-index的映射,并在矢量集上提供有效的批量most_similar()


0
投票

事实证明,有一个名为similarity_unseen_docs(...)的函数可用于查找测试数据中2个文档的相似性。

但是,我暂时还没有解决这个问题,因为它不是最优的,因为我需要手动将特定文档与测试数据中的每个其他文档进行比较。此外,它比较文档中的单词而不是可能影响准确性的向量。

© www.soinside.com 2019 - 2024. All rights reserved.