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

Doc2Vec - Finding document similarity in test data

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

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

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

原来有一个叫做similarity_unseen_docs(...)的函数可以用来找出测试数据中2个文档的相似度。

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

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

一般来说,对不属于训练的新文档进行任何操作都需要使用 infer_vector()。注意这样的推论:

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

另一方面,来自 "frozen" 模型的这种推理可以跨进程或机器并行化。

您提到的 n_similarity() 方法并不真正适合您的需要:它期望现有文档向量的查找键列表 ('tags'), 像您提供的那样的原始向量。

你在回答中提到的similarity_unseen_docs()方法有点合适,但只需要一对文档,每次都重新计算它们的向量——如果需要一个新文档的文档向量,有点浪费与许多其他新文档的文档向量相比。

您可能只想用 "training documents" 和 "test documents" 训练一个全新的模型。然后所有 "test documents" 计算出它们的文档向量,并将其存储在模型中,作为批量训练的一部分。对于许多可能的应用程序来说,这是一个合适的选择,并且确实可以以完全无监督的方式基于仅出现在 "test docs" 中的单词学习有趣的关系。你的问题中还没有任何部分说明为什么不能在这里考虑它的原因。

或者,您想要 infer_vector() 所有新的 "test docs",并将它们放入类似于 [=18] 中的各种 KeyedVectors 实用程序 类 的结构中=] - 记住一个数组中的所有向量,记住从 doc-key 到 vector-index 的映射,并在向量集上提供有效的批量 most_similar()