【问题标题】:Cosine similarity of word2vec more than 1word2vec的余弦相似度大于1
【发布时间】:2016-12-30 05:34:13
【问题描述】:

我使用 spark 的 word2vec 算法来计算文本的文档向量。

然后我使用模型对象的findSynonyms 函数来获取几个单词的同义词。

我看到这样的东西:

w2vmodel.findSynonyms('science',4).show(5)
+------------+------------------+
|        word|        similarity|
+------------+------------------+
|     physics| 1.714908638833209|
|     fiction|1.5189824643358183|
|neuroscience|1.4968051528391833|
|  psychology| 1.458865636374223|
+------------+------------------+

我不明白为什么余弦相似度被计算为大于 1。余弦相似度应该在 0 到 1 或最大 -1 到 +1 之间(取负角)。

为什么这里大于 1?这里出了什么问题?

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    您应该对从word2vec 获得的词向量进行归一化,否则您将获得无限的点积或余弦相似度值。

    来自Levy et al., 2015(实际上,大部分关于词嵌入的文献):

    向量在用于相似度计算之前被归一化为单位长度,使余弦相似度和点积等效。

    如何进行归一化?

    您可以执行以下操作。

    import numpy as np
    
    def normalize(word_vec):
        norm=np.linalg.norm(word_vec)
        if norm == 0: 
           return word_vec
        return word_vec/norm
    

    参考文献

    更新:为什么 word2vec 的余弦相似度大于 1?

    根据answer,在 word2vec 的 spark 实现中,findSynonyms 实际上并不返回余弦距离,而是余弦距离乘以查询向量的范数。

    排序和相对值与真实余弦距离一致,但实际值都是按比例缩放的。

    【讨论】:

    • 谢谢。但快速的问题。如果我对向量进行归一化然后取余弦相似度,它类似于只取点积。如果我不规范化然后取余弦相似度,在余弦相似度的公式中,我们确实将点积除以每个向量的范数。因此在计算余弦相似度时会发生归一化。所以我不确定为什么要特别要求对其进行规范化。最终公式相同,计算应该相同
    • 谢谢我知道规范化部分。但我的问题是为什么会改变余弦相似度。如果你规范化或不规范化,公式保持不变
    • 你是完全正确的。那么我相信你应该检查你是如何计算余弦相似度的!如果您使用任何库或包,则应确保按预期计算相似度。除此之外,我认为您的理解没有任何问题。
    • 我没有计算余弦相似度。当你调用 findSynonyms 时,Spark Word2Vec 已经计算好了
    • 对,这就是为什么我说,你没有得到你期望的东西。您的理解是正确的,但您可能不知道 spark 是如何实现 word2vec 的。请参阅我的答案中的更新。
    猜你喜欢
    • 2016-01-26
    • 2018-10-27
    • 2016-11-20
    • 2013-05-29
    • 2011-02-21
    • 2020-08-12
    • 2021-07-10
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多