我正在尝试使用训练数据训练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"
,因为字体中没有向量。
训练Doc2Vec
模型的行为留下了从训练数据中学习的doc向量的记录,是的,most_similar()
只是在这些向量中查找。
通常,对不属于培训的新文档进行任何操作都需要使用infer_vector()
。请注意这样的推断:
most_similar()
类比较另一方面,来自“冻结”模型的这种推断可以跨过程或机器并行化。
您提到的n_similarity()
方法并不适合您的需求:它期望现有doc向量的查找键('tags')列表,而不是您提供的原始向量。
您在答案中提到的similarity_unseen_docs()
方法有点合适,但只需要一对文档,每次重新计算它们的向量 - 如果需要将一个新文档的doc-vector与许多其他新文档进行比较,那么有点浪费向量。
您可能只想训练一个全新的模型,包括您的“培训文档”和“测试文档”。然后,所有“测试文档”都会计算出他们的doc-vectors,并存储在模型中,作为批量训练的一部分。这是许多可能的应用程序的合适选择,并且实际上可以基于仅以完全无监督的方式出现在“测试文档”中的单词来学习有趣的关系。而且你的问题中还没有任何一部分说明为什么不能在这里考虑它。
或者,你想要infer_vector()
所有新的“测试文档”,并将它们放入像KeyedVectors
中的各种gensim
实用程序类这样的结构中 - 记住一个数组中的所有向量,记住从doc-key到vector-index的映射,并在矢量集上提供有效的批量most_similar()
。
事实证明,有一个名为similarity_unseen_docs(...)
的函数可用于查找测试数据中2个文档的相似性。
但是,我暂时还没有解决这个问题,因为它不是最优的,因为我需要手动将特定文档与测试数据中的每个其他文档进行比较。此外,它比较文档中的单词而不是可能影响准确性的向量。