Vik*_*ant 1 python nlp gensim sentence-similarity doc2vec
我有大约 20k 个包含 60 - 150 个单词的文档。在这 20K 份文档中,有 400 份文档的相似文档是已知的。这400个文档作为我的测试数据。
目前我正在删除这 400 个文档,并使用剩余的 19600 个文档来训练 doc2vec。然后我提取训练数据和测试数据的向量。现在,对于每个测试数据文档,我找到它与所有 19600 个训练文档的余弦距离,并选择余弦距离最小的前 5 个。如果标记的相似文档出现在前 5 个文档中,则认为它是准确的。准确率% = 准确记录数/记录总数。
我找到类似文档的另一种方法是使用 doc2Vec 最相似的方法。然后使用上面的公式计算准确度。
上面两个精度不匹配。随着每个时期,一个增加,另一个减少。
我正在使用此处给出的代码:https ://medium.com/scaleabout/a-gentle-introduction-to-doc2vec-db3e8c0cce5e 。用于训练 Doc2Vec。
我想知道如何调整超参数,以便我可以使用上述公式获得准确度。我应该使用余弦距离来查找最相似的文档还是应该使用 gensim 的最相似函数?
您引用的文章对该Doc2Vec算法进行了合理的阐述,但其示例代码包含一个非常具有破坏性的反模式:train()在循环中多次调用,同时手动管理alpha.这绝不是一个好主意,而且很容易出错。
相反,不要更改默认值min_alpha,train()只需使用所需的值调用一次epochs,然后让该方法顺利管理alpha自身。
您的一般方法是合理的:根据一些先前的想法开发一种可重复的方法对模型进行评分,然后尝试各种模型参数并选择得分最高的参数。
\n当您说您自己的两种精度计算方法不匹配时,这有点令人担忧,因为该most_similar()方法实际上会根据所有已知的文档向量检查您的查询点,并返回具有最大余弦相似度的那些。这些应该与您计算出的具有最小余弦距离的那些相同。如果您在问题中添加了确切的代码 \xe2\x80\x93 如何计算余弦距离,以及如何调用most_similar()\xe2\x80\x93 那么可能会清楚造成什么细微的差异或错误的差异。(不应该有任何本质的区别,但考虑到:您可能想要使用结果most_similar(),因为它们已知没有错误,并且使用高效的批量数组库操作,这些操作可能比您使用的任何循环都要快撰写。)
请注意,您不一定必须保留一组已知的高度相似的文档对。由于Doc2Vec是无监督算法,因此您在训练期间不会向其提供首选的“确保这些文档相似”结果。在全套文档上进行训练是相当合理的,然后选择最能捕获您想要的最相似关系的模型,并相信包含更多文档实际上可以帮助您找到最佳参数。
(然而,这样的过程可能会稍微高估未来未见过的文档或其他一些假设的“其他 20K”训练文档的预期准确性。但在给定训练数据的情况下,它仍然可能找到“最佳可能”元参数。)
\n(如果您在训练期间没有将它们全部喂给,那么在测试期间您将需要使用infer_vector()看不见的文档,而不仅仅是查找训练中学习到的向量。您还没有显示用于此类评分/推理的代码,但这又是一个可能会出错的步骤。如果您只是一起训练所有可用文档的向量,那么就消除了后期重新推理发生错误的可能性。)
检查所需文档是否位于最相似的前 5 个(或前 N 个)中只是对模型进行评分的一种方法。另一种方法是在几篇原始的“段落向量”( Doc2Vec) 论文中使用的,对于每一对已知相关文档,也随机选择另一个文档。每次模型报告已知相似的文档比第三个随机选择的文档更接近时,就将模型视为准确。
这样的评估并不完美 - 有时,当第三个文档偶然确实是一个更好的相似性匹配(纯粹是运气)时,它会将模型标记为失败。但总的来说,通过以批量和自动化的方式利用已知的现有关系,通常会给更好地模仿已知关系的模型提供更高的分数。
\n在最初的“段落向量”论文中,现有的搜索排名系统(报告某些文本片段以响应相同的探测查询)或手工策划的类别(如维基百科或 Arxiv)被用来生成这样的评估对:检查相同的搜索结果页面或相同的类别,看看它们在模型内是否比其他随机文档更“接近”。
\n如果您的问题扩展为更多地描述您尝试过的一些初始参数(例如您提供给Doc2Vec和 的完整参数train()),以及似乎有帮助或有害的内容,那么可能会建议其他范围值得检查的参数。