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

Python 使用相同来源的余弦相似性和完全不同的结果,python,machine-learning,cosine-similarity,word-embedding,machine-translation,Python,Machine Learning,Cosine Similarity,Word Embedding,Machine Translation,我正在学习单词嵌入和余弦相似性。我的数据由两组相同的单词组成,但使用两种不同的语言 我做了两个测试: 我用词向量的平均值来衡量余弦相似度(我认为应该称之为软余弦相似度) 我用词向量测量了余弦相似性 我应该期望得到完全相同的结果吗?我注意到有时我会得到两个相反的结果。因为我对这方面还不熟悉,所以我试图弄清楚我是否做错了什么,或者背后是否有解释。根据我所读的,软余弦相似性应该比通常的余弦相似性更准确 现在,是时候展示一些数据了。不幸的是,我不能发布我的一部分数据(文字本身),但我会尽我最大的努力给你

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

我做了两个测试:

  • 我用词向量的平均值来衡量余弦相似度(我认为应该称之为软余弦相似度)
  • 我用词向量测量了余弦相似性
  • 我应该期望得到完全相同的结果吗?我注意到有时我会得到两个相反的结果。因为我对这方面还不熟悉,所以我试图弄清楚我是否做错了什么,或者背后是否有解释。根据我所读的,软余弦相似性应该比通常的余弦相似性更准确

    现在,是时候展示一些数据了。不幸的是,我不能发布我的一部分数据(文字本身),但我会尽我最大的努力给你我能给你的信息

    之前的一些其他细节:

    • 我正在使用FastText创建嵌入、skipgram模型和 默认参数
    • 对于软余弦相似性,我使用。根据一些人的建议,为了测量余弦相似性,我似乎应该从公式中减去1,例如:
    (1-distance.cosine(数据['LANG1\u AVG'].iloc[i],数据['LANG2\u AVG'].iloc[i])

    • 对于通常的余弦相似性,我使用from,定义如下:

      @classmethod
      定义余弦相似性(cls、向量a、向量b):
      “”“计算向量a和向量b之间的余弦相似性”“”
      返回np.dot(向量a,向量b)/\
      (np.linalg.norm(向量a)*np.linalg.norm(向量b))

    正如您将从这里的图像中看到的,对于一些单词,我使用这两种方法获得了相同或非常相似的结果。对于其他人,我得到了两个完全不同的结果。我怎么解释呢


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

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

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


    注:法语中“能干”的翻译是“能干”和“不能”;)

    在进一步研究之后,我发现了一篇2014年的论文(),该论文解释了何时以及如何使用特征的平均值,并解释了什么是软余弦度量:

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


    生成一个最小的示例。如果你不能显示你正在使用的单词,试试其他你可以显示的单词。平均值的公式是什么?我从来没有听说过用这种方法计算向量的相似性,这看起来很奇怪,因为你想保留一个向量相对于另一个向量的位置信息,如果你计算平均值,你就会丢失这些信息。。。还有,为什么你认为结果会相似呢?@roadrunner66我补充道example@qmeeus我不确定它们是否应该相似。这是我第一次这样做,所以我有点困惑:我问过周围的人,他们说这可能只是一个向量维度的问题。平均值的公式是对同一单词的值的简单统计平均值。