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

时间:2019-04-30 15:36:33

标签: python machine-learning gensim doc2vec

我正在尝试使用训练数据来训练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"在字典中。

2 个答案:

答案 0 :(得分:1)

训练Doc2Vec模型的行为使它保留了从训练数据中学到的doc-vector的记录,是的,most_similar()只是在这些向量中寻找。

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

  • 忽略新文档中所有未知的单词
  • 可能会受益于参数调整,尤其是对于简短文档
  • 目前仅在一个线程中一次只完成一个文档-因此,获取大量N-数千文档的推断向量实际上比在相同N-千文档上训练新模型要慢。
  • 不一定要是确定性的,除非您采取额外的步骤,因为底层的算法会在训练/推理过程中使用随机初始化和随机选择过程
  • 只是为您提供向量,而无需将其加载到任何方便的存储对象中以进行进一步的most_similar()式比较

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

您提到的n_similarity()方法并不真正适合您的需求:它期望现有文档向量的查找关键字(“标签”)列表,而不是原始向量您正在供应。<​​/ p>

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

您可能只想使用“培训文档”和“测试文档”来培训一个全新的模型。然后,作为批量培训的一部分,所有“测试文档”都将计算出其文档向量,并将其存储在模型中。对于许多可能的应用程序来说这是一个适当的选择,并且确实可以基于完全没有监督的方式基于仅出现在“测试文档”中的单词来学习有趣的关系。而且您的问题中还没有任何部分可以说明为什么无法在此处考虑该问题的原因。

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

答案 1 :(得分:0)

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

但是,由于我还需要手动比较特定文档和测试数据中的所有其他文档,因此该问题并不是非常理想,因此我暂时将其悬而未决。而且,它会比较文档中的单词而不是可能影响准确性的矢量。