【问题标题】:Interpreting negative Word2Vec similarity from gensim从 gensim 解释负 Word2Vec 相似性
【发布时间】:2017-07-11 22:28:28
【问题描述】:

例如我们使用gensim训练一个word2vec模型:

from gensim import corpora, models, similarities
from gensim.models.word2vec import Word2Vec

documents = ["Human machine interface for lab abc computer applications",
              "A survey of user opinion of computer system response time",
              "The EPS user interface management system",
              "System and human system engineering testing of EPS",
              "Relation of user perceived response time to error measurement",
              "The generation of random binary unordered trees",
              "The intersection graph of paths in trees",
              "Graph minors IV Widths of trees and well quasi ordering",
              "Graph minors A survey"]

texts = [[word for word in document.lower().split()] for document in documents]
w2v_model = Word2Vec(texts, size=500, window=5, min_count=1)

当我们查询单词之间的相似度时,我们会发现负相似度分数:

>>> w2v_model.similarity('graph', 'computer')
0.046929569156789336
>>> w2v_model.similarity('graph', 'system')
0.063683518562347399
>>> w2v_model.similarity('survey', 'generation')
-0.040026775040430063
>>> w2v_model.similarity('graph', 'trees')
-0.0072684112978664561

我们如何解释负分?

如果是余弦相似度,范围不应该是[0,1]吗?

Word2Vec.similarity(x,y)函数的上限和下限是多少?文档里写的不多:https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec.similarity =(

查看 Python 包装器代码,也没有太多:https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/models/word2vec.py#L1165

(如果可能的话,请指点我实现相似功能的.pyx代码。)

【问题讨论】:

  • 如果使用余弦相似度,则范围为 [-1, 1]。来自维基百科文章:“因此这是对方向而非大小的判断:具有相同方向的两个向量的余弦相似度为 1,90° 处的两个向量的相似度为 0,截然相反的两个向量的相似度为-1,与它们的大小无关。”
  • 余弦相似度可以解释为点积。因此,如果两个词的余弦相似度为 0,则它们是完全正交的,这意味着它们具有两个不同的“含义”并且完全不相关。而负相似性意味着这两个词在成分上是相关的,但以相反(或负)的方式。

标签: python nlp similarity gensim word2vec


【解决方案1】:

余弦相似度范围为 -1 到 1,与常规余弦波相同。

至于来源:

https://github.com/RaRe-Technologies/gensim/blob/ba1ce894a5192fc493a865c535202695bb3c0424/gensim/models/word2vec.py#L1511

def similarity(self, w1, w2):
    """
    Compute cosine similarity between two words.
    Example::
      >>> trained_model.similarity('woman', 'man')
      0.73723527
      >>> trained_model.similarity('woman', 'woman')
      1.0
    """
    return dot(matutils.unitvec(self[w1]), matutils.unitvec(self[w2])

【讨论】:

    【解决方案2】:

    正如其他人所说,余弦相似度的范围可以从 -1 到 1,具体取决于被比较的两个向量之间的角度。 gensim 中的确切实现是归一化向量的简单点积。

    https://github.com/RaRe-Technologies/gensim/blob/4f0e2ae0531d67cee8d3e06636e82298cb554b04/gensim/models/keyedvectors.py#L581

    def similarity(self, w1, w2):
            """
            Compute cosine similarity between two words.
            Example::
              >>> trained_model.similarity('woman', 'man')
              0.73723527
              >>> trained_model.similarity('woman', 'woman')
              1.0
            """
            return dot(matutils.unitvec(self[w1]), matutils.unitvec(self[w2]))
    

    在解释方面,您可以像考虑相关系数一样考虑这些值。值为 1 表示词向量之间的完美关系(例如,“woman”与“woman”相比),值为 0 表示词之间没有关系,值为 -1 表示词之间完全相反的关系。

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2023-03-19
      • 2020-06-02
      • 2019-07-01
      • 1970-01-01
      相关资源
      最近更新 更多