使用相同来源的余弦相似度和完全不同的结果

时间:2019-07-24 23:45:54

标签: python machine-learning cosine-similarity word-embedding machine-translation

我正在学习单词嵌入和余弦相似度。我的数据由两组相同的单词组成,但是使用2种不同的语言。

我做了两个测试:

  1. 我使用单词向量的平均值测量了余弦相似度(我认为应该将其称为软余弦相似度我用单词向量测量了余弦相似度

我应该获得完全相同的结果吗?我注意到有时我有两个相反的结果。由于这是我的新手,因此我试图找出我做错了什么还是背后有解释。根据我的阅读,软余弦相似度应该比通常的余弦相似度更准确。

现在是时候显示一些数据了。不幸的是,我无法发布部分数据(单词本身),但是我会尽力为您提供我可以提供的最大信息。

之前的一些其他详细信息:

  • 我正在使用FastText创建嵌入,skipgram模型, 默认参数。
  • 出于柔和余弦的相似性,我使用Scipy spatial distance cosine。遵循一些人的建议,要测量余弦相似度,似乎我应该从公式中减去1,例如:

(1-distance.cosine(data['LANG1_AVG'].iloc[i],data['LANG2_AVG'].iloc[i]))

  • 对于通常的余弦相似性,我使用Fast Vector cosine similarity中的FastText Multilingual,其定义方式如下:

    @classmethod def cosine_similarity(cls, vec_a, vec_b): """Compute cosine similarity between vec_a and vec_b""" return np.dot(vec_a, vec_b) / \ (np.linalg.norm(vec_a) * np.linalg.norm(vec_b))

正如您从此处的图片中所看到的,对于某些词,使用这两种方法我获得了相同或相当的结果。对于其他人,我获得了两个完全不同的结果。我该怎么解释?

My data v2

2 个答案:

答案 0 :(得分:1)

据我了解,两个向量x和y之间的软相似性由(avg(x)* avg(y))/(abs(avg(x))* abs(avg(y)))= sign(avg(x)* avg(y)),取1或-1,取决于平均值是否具有相同的符号。这可能不是很有帮助。

通过(x * y)/(|| x || * || y ||)计算余弦相似度。指向相同方向的2个矢量的相似度为1(x * x = || x || ^ 2),指向相反方向的2个矢量的相似度为-1(x * -x =-|| x || ^ 2)和2个垂直向量的相似度为0((1,0)*(0,1)= 0)。如果向量之间的角度不等于0、90、180或270之一,则您将获得(但不等于)-1和1之间的相似度得分。

底线:忘记平均值,仅使用余弦相似度。请注意,余弦相似度是比较向量的方向而不是长度。

PS:法语中“ able”的翻译是“ capable”而不是“ able”;)

答案 1 :(得分:0)

经过更多的研究,我发现了2014年的论文(Soft Similarity and Soft Cosine Measure: Similarity of Features in Vector Space Model)解释了何时以及如何使用特征的平均值可能有用,并且还解释了什么是精确的软余弦量度:< / p>

  

我们的想法更笼统:我们建议修改   向量空间模型中相似度的计算方式   考虑到功能的相似性。如果我们申请   这个想法到余弦度量,然后是“软余弦   引入了“措施”,而不是传统的“硬性措施”   余弦”,忽略了特征的相似性。注意   当我们考虑每对特征的相似性时,   等同于在VSM中引入新功能。   本质上,我们在两对之间具有相似性矩阵   的功能,所有这些功能代表了VSM中的新维度。