Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有效地调整Gensim Doc2Vec的超参数,以实现文档相似性问题的最大准确性?_Python_Nlp_Gensim_Doc2vec_Sentence Similarity - Fatal编程技术网

Python 如何有效地调整Gensim Doc2Vec的超参数,以实现文档相似性问题的最大准确性?

Python 如何有效地调整Gensim Doc2Vec的超参数,以实现文档相似性问题的最大准确性?,python,nlp,gensim,doc2vec,sentence-similarity,Python,Nlp,Gensim,Doc2vec,Sentence Similarity,我有大约20k个60-150字的文档。在这20K份文件中,有400份文件是已知的类似文件。这400个文档作为我的测试数据 目前,我正在删除这400个文档,并使用剩余的19600个文档来培训doc2vec。然后提取列车和测试数据的向量。现在,对于每个测试数据文档,我找到它与所有19600个train文档的余弦距离,并选择余弦距离最小的前5个。如果前5项中有类似的文件标记,则认为其准确无误。准确度%=准确记录数/记录总数 我找到类似文档的另一种方法是使用doc2Vec最相似的方法。然后使用上述公式计

我有大约20k个60-150字的文档。在这20K份文件中,有400份文件是已知的类似文件。这400个文档作为我的测试数据

目前,我正在删除这400个文档,并使用剩余的19600个文档来培训doc2vec。然后提取列车和测试数据的向量。现在,对于每个测试数据文档,我找到它与所有19600个train文档的余弦距离,并选择余弦距离最小的前5个。如果前5项中有类似的文件标记,则认为其准确无误。准确度%=准确记录数/记录总数

我找到类似文档的另一种方法是使用doc2Vec最相似的方法。然后使用上述公式计算精度

以上两种精度不匹配。每过一个纪元,一个增加,一个减少

我正在使用此处给出的代码:。用于培训Doc2Vec


我想知道如何调整超参数,以便使用上述公式获得制造精度。我应该使用余弦距离来查找最相似的文档,还是应该使用gensim最相似的函数?

您参考的文章对
Doc2Vec
算法进行了合理的阐述,但其示例代码包括一个非常有害的反模式:在循环中多次调用
train(),手动管理
alpha
这几乎不是一个好主意,而且很容易出错。

相反,不要更改默认的
minu alpha
,只调用
train()
一次所需的
epoch
,让方法平滑地管理
alpha
本身

你的一般方法是合理的:根据之前关于什么的一些想法,开发一种可重复的模型评分方法,然后尝试各种各样的模型参数,选择一个评分最好的

当您说您自己的两种精度计算方法不匹配时,这有点令人担忧,因为
most\u similure()
方法实际上会根据所有已知文档向量检查您的查询点,并返回具有最大余弦相似性的查询点。这些应该与计算出的具有最小余弦距离的相同。如果您在问题中添加了确切的代码–您是如何计算余弦距离的,以及如何调用
最相似()
–那么可能很清楚导致差异的原因是什么细微的差异或错误。(应该没有什么本质区别,但考虑到这一点:您可能希望使用
most_similor()
结果,因为它们是已知的无缺陷的,并且使用可能比您编写的任何循环都快的高效大容量数组库操作。)

请注意,您不必保留一组已知的高度相似的文档对。由于
Doc2Vec
是一种无监督的算法,因此在培训过程中,您不会向它提供首选的“确保这些文档相似”结果。对全套文档进行培训是相当合理的,然后选择最能捕获您想要的最相似关系的模型,并相信包含更多文档实际上有助于您找到最佳参数

(然而,这样一个过程可能稍微高估了未来看不见的文档或其他一些假设的“其他20K”培训文档的预期准确性。但根据您的培训数据,它仍然可能找到“最佳”元参数。)

(如果您在训练期间没有将它们全部输入,那么在测试期间您需要使用
infer_vector()
对于看不见的文档,而不仅仅是从培训中查找学到的向量。您还没有显示此类评分/推断的代码,但这是另一个可能出错的步骤。如果您只是将所有可用文档的向量一起培训,则错误的可能性将被消除。)

检查所需文档是否在最相似的前5名(或前N名)中只是给模型打分的一种方法。另一种方法是,在两篇原始的“段落向量”(
Doc2Vec
)论文中使用的方法是,对于每一对这样的文档,还随机选取另一个文档。每次报告已知的相似文档时,将模型计算为精确,而不是第三个随机选择的文档。在最初的“段落向量”论文中,使用现有的搜索排名系统(报告某些文本片段以响应相同的探测查询)或手动分类(如Wikipedia或Arxiv)生成此类评估对:同一搜索结果页面中的文本,或同一分类,检查他们在模型中是否比其他随机文档更接近


如果您的问题被扩展到更多描述您尝试过的一些初始参数(例如您提供给
Doc2Vec
train()
)的完整参数),以及似乎有帮助或有害的内容,那么可能会建议其他值得检查的参数范围

嘿!非常感谢您提供的宝贵信息。我几乎没有疑问——如果我把双克和三克或者角色木瓦放进去会有意义吗?如果是,那怎么办?如果没有,那么概念上的问题是什么。论文中写到,PV-DM的性能比PV-DBOW好,但对于我的数据集来说,情况完全相反。你能解释一下原因吗?对于你的语料库和最终目的来说,字符n图、单词二元图或单词三元图是否有效,这是你必须评估的。(可能是这样,但这要视情况而定,一旦你对模型进行了可重复的定量评估,并返回你喜欢的结果类型,你就可以检查这些选项。)
Doc2Vec
只取你想要的