Python 使用Gensim将余弦距离缩放为0-1

Python 使用Gensim将余弦距离缩放为0-1,python,math,nlp,text-mining,gensim,Python,Math,Nlp,Text Mining,Gensim,我已经构建了一个Doc2Vec模型,其中包含大约300万个文档,现在我想将其与我以前构建的另一个模型进行比较。第二个模型已缩放到0-1,因此我现在还希望将gensim模型缩放到相同的范围,以便它们具有可比性。 这是我第一次使用gensim,所以我不确定这是怎么做到的。这并没有什么特别之处,但这是我到目前为止所拥有的代码(模型生成代码ommited)。我考虑过对推断的向量(v1和v2)进行缩放(以向量并集的max/min进行最小-最大缩放),但我认为这不是正确的方法。 这里的想法是比较两个文档(语

我已经构建了一个Doc2Vec模型,其中包含大约300万个文档,现在我想将其与我以前构建的另一个模型进行比较。第二个模型已缩放到0-1,因此我现在还希望将gensim模型缩放到相同的范围,以便它们具有可比性。 这是我第一次使用gensim,所以我不确定这是怎么做到的。这并没有什么特别之处,但这是我到目前为止所拥有的代码(模型生成代码ommited)。我考虑过对推断的向量(v1和v2)进行缩放(以向量并集的max/min进行最小-最大缩放),但我认为这不是正确的方法。 这里的想法是比较两个文档(语料库中可能有标记)并输出它们之间的相似性分数。我看过一些Gensim的教程,他们经常将单个字符串与语料库的文档进行比较,这在这里并不是真正的想法


有什么建议吗?

请注意,“余弦相似性”和“余弦距离”是不同的东西

余弦相似性的范围可以是
-1.0
1.0
——但在某些模型中,例如仅基于正字数的模型中,实际上可能只能看到
0.0
1.0
之间的值。但在这两种情况下,相似性接近
1.0
的项目最为相似

另一方面,余弦距离可以从
0.0
2.0
,距离
0.0
的项目距离最小(或最近)。余弦距离可以大于
1.0
——但您可能只在使用密集坐标空间(如
Doc2Vec
)的模型中看到这种距离,而在保留一半坐标空间(所有负坐标)的字数计算模型中看不到这种距离

所以:如果函数返回一个距离,并且现在返回的是超出
1.0
的意外数字,那么您不应该真正调用函数
similarity
,这没有什么错:在某些模型中是可能的,但在其他模型中是不可能的

您可以天真地将
0.0
重新缩放到
2.0
距离,您的计算将通过
Doc2Vec
向量获得,使用一些粗糙的锤子,如:

new_distance = old_distance / 2
然而,请注意,一般来说,不同模型的绝对相似性仍然不一定具有意义上的可比性。这在两种不同的
Doc2Vec
模型之间更是如此。它们的大小受到模型元参数等因素的高度影响

例如,如果使用完全相同的足够大的文本集来训练100维
Doc2Vec
模型和300维
Doc2Vec
模型,这两个模型可能会非常有用。对于文档a,其最近的邻居可能始终是文档B。实际上,其前10个邻居可能非常相似或相同

但是余弦相似性的最大值/范围可能相差很远,就像同一个邻居B在一个中的相似性
0.9
,但在另一个中的相似性
0.6
。它们是相同的文档,并且正确地被识别为“最相似”,而且无论是
0.9
还是
0.6
都不是一个更糟糕的报告数字,因为在这两种情况下,最相似的文档都位于排名的顶部。这些模型只是以不同的方式使用了可用的坐标空间。因此,您不应该将
0.6
0.9
相似性(或在您的情况下,其他距离数字)与其他模型进行比较–尤其是如果模型使用不同的算法,您的情况似乎就是这样。(如果看起来您可能正在比较单词计数模型与密集学习的
Doc2Vec
模型的绝对余弦距离。)


比较模型之间的结果排名可能更有意义。也就是说,忽略原始的相似性编号,但要注意其他文档的理想文档是否出现在前N名中。或者,也可以学习一些使距离更具可比性的缩放规则,但如果不知道比较模型的最终目标,就很难提出更具体的建议,甚至不知道这是否是一个好的步骤。

谢谢您的回答!这个余弦相似性是从“推断向量”推导出来的吗?我查找了不同的资源,但从不确定推断向量输出是否在[-1,1]范围内。目标不是直接比较相似度,而是根据不同的余弦相似度阈值范围(0-1)检查精确度和召回率。这就是为什么我想要一个输出在这个范围内的模型。还有,我应该使用哪个函数来计算余弦相似性?我尝试使用推断向量,但余弦相似性有时高于1…
推断向量()
仅返回完整向量-它不进行相似性比较。
similarity()
方法可以比较模型中的两个向量,通过它们的键(doc标记):-如果需要进行向量到向量的计算,可以使用余弦相似性的定义–赋范向量的点积–如基于查找的函数的代码所示:是的,我使用expert_vector获得向量,然后将nltk.cluster.util.cosine_distance(v1,v2)应用于余弦距离(我假设这是相同的计算),但是一些余弦距离大于1。我曾考虑过应用相似性(),但我的一些文档在训练语料库中缺少标记。我可以检查标记是否在语料库中,并删除那些不在语料库中的标记,但我不确定为每个标记查询语料库的效率有多高……啊哈!我忽略了你把术语“相似性”(从
0.0
1.0
范围)和“余弦距离”混为一谈。余弦相似性有时从
0.0
1.0
(在某些限制性使用中),有时从
-1.0
1.0
——但通常,最相似的项目的相似性接近
1.0
余弦距离',由
nltk.c提供
new_distance = old_distance / 2