【问题标题】:Doc2Vec - Finding document similarity in test dataDoc2Vec - 在测试数据中查找文档相似性
【发布时间】:2019-04-30 15:36:33
【问题描述】:

我正在尝试使用训练数据训练 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


    【解决方案1】:

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

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

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

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

    您提到的n_similarity() 方法并不真正适合您的需求:它需要现有文档向量的查找键(“标签”)列表,不是像你这样的原始向量'补货。

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

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

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

    【讨论】:

    • 感谢您的详细解答!我不只是重新训练包括测试数据在内的所有数据的原因主要是因为应用程序可以在恒定时间内获取新数据的速度和性能原因。至于你答案的最后一部分?您的意思是手动推断向量然后将它们合并到一个数组中以便我可以将它们用作模型吗?据我了解,KeyedVectors 仅适用于 Word2Vec 功能。这不是真的吗?
    • 好吧,这取决于您的“培训”和“测试”文档的相对大小,以及如果在初始培训期间包含“测试”文档以及可用的计算预算,模型会好多少,它仍然可能值得考虑。如前所述:批量推理(鉴于当前的实现)将比批量训练慢 - 并且在新文档可能会教授数据中的新单词和新模式的范围内,只有重新训练才能收集到这些信息。 (一种混合方法可能是:在新文档到达时对其进行推断,但定期重新构建基本模型作为偶尔的后台工作。)
    • Doc2Vec 模型的.docvecs 属性本身就是KeyedVectors 的一种(特别是Doc2VecKeyedVectors)。 gensim 的keyedvectors.py (github.com/RaRe-Technologies/gensim/blob/develop/gensim/models/…) 中的各种类支持在 word2vec-related-family 模型系列中的大量使用的类似操作。我发现它们当前的化身有点奇怪/重复,但我的观点是,其中可能有一些东西你可以用来保存你自己的增量批次推断向量——或者用作你自己的类似功能代码的模型/基础。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      相关资源
      最近更新 更多