【问题标题】:How to use word2vec to calculate the similarity distance by giving 2 words?如何使用 word2vec 通过给出 2 个单词来计算相似度距离?
【发布时间】:2014-03-25 15:44:15
【问题描述】:

Word2vec 是 Google 提供的用于计算单词距离的开源工具。它可以通过输入一个单词并根据相似度输出排序的单词列表来使用。例如

输入:

france

输出:

            Word       Cosine distance

            spain              0.678515
          belgium              0.665923
      netherlands              0.652428
            italy              0.633130
      switzerland              0.622323
       luxembourg              0.610033
         portugal              0.577154
           russia              0.571507
          germany              0.563291
        catalonia              0.534176

但是,我需要做的是通过给出 2 个单词来计算相似度距离。如果我给'法国'和'西班牙',我怎么能得到0.678515的分数而不通过只给'法国'来阅读整个单词列表。

【问题讨论】:

    标签: word2vec


    【解决方案1】:

    gensim 有一个 Word2Vec 的 Python 实现,它提供了一个内置实用程序,用于查找用户输入的两个单词之间的相似性。您可以参考以下内容:

    1. 简介:http://radimrehurek.com/gensim/models/word2vec.html
    2. 教程:http://radimrehurek.com/2014/02/word2vec-tutorial/

    更新:Gensim 4.0.0 及更高版本

    Python 中查找两个单词相似度的语法如下:

    >> from gensim.models import Word2Vec
    >> model = Word2Vec.load(path/to/your/model)
    >> model.wv.similarity('france', 'spain')
    

    【讨论】:

    • 如果在这方面有帮助,请参阅 here 以了解使用原始 word2vec c 语言实现创建的矢量文件。
    • @Satarupa Guha:这个相似函数是什么?是余弦吗?
    • 是的,确实是余弦相似函数。
    【解决方案2】:

    如您所知,word2vec 可以将单词表示为数学向量。所以一旦你训练了模型,你就可以获得spain和france这两个词的向量并计算余弦距离(点积)。

    一个简单的方法是使用 word2vec 的this Python 包装器。您可以使用以下方法获取向量:

    >>> model['computer'] # raw numpy vector of a word
    array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
    

    要计算两个单词之间的距离,您可以执行以下操作:

    >>> import numpy    
    >>> cosine_similarity = numpy.dot(model['spain'], model['france'])/(numpy.linalg.norm(model['spain'])* numpy.linalg.norm(model['france']))
    

    【讨论】:

    【解决方案3】:

    我只是在寻找如何通过修改原始 distance.c 版本而不是使用像 gensim 之类的其他库来执行此操作时偶然发现。

    我没有找到答案,所以我做了一些研究,并在这里分享给其他也想知道如何在原始实现中做到这一点的人。

    查看C源代码后,你会发现'bi'是一个索引数组。如果您提供两个单词,则 word1 的索引将在 bi[0] 中,word2 的索引将在 bi[1] 中。

    模型“M”是一个向量数组。每个单词都表示为一个维度为“size”的向量。

    使用这两个索引和向量的模型,查找它们并计算余弦距离(与点积相同)如下:

    dist = 0;
    for (a = 0; a < size; a++) {
        dist += M[a + bi[0] * size] * M[a + bi[1] * size];
    }
    

    完成后,'dist'的值就是两个词的余弦相似度。

    【讨论】:

      【解决方案4】:

      我开发了一个代码来帮助使用 gensim 计算 2 个句子/SKU 的余弦相似度。代码可以在这里找到 https://github.com/aviralmathur/Word2Vec

      代码使用数据在 Crowdflower 上进行 Kaggle 比赛

      它是使用 Word2Vec 上的 Kaggle 教程代码开发的,可在此处获得 https://www.kaggle.com/c/word2vec-nlp-tutorial

      希望对你有帮助

      【讨论】:

      • 欢迎来到 StackOverflow,感谢您回答这个问题。我们不希望答案只是链接,因为如果链接发生变化或主机出现故障,您的答案将变得毫无用处。请编辑此答案并包含您在此答案中链接的代码中的要点。
      • @AaronD 太糟糕了 Stack Exchange 不使用 web.archive.org 来镜像链接。
      【解决方案5】:

      如果你看一下Gensim的native方法计算单词相似度的source code,你会发现它使用以下方法计算单词相似度:

      import numpy as np
      from gensim import matutils  # utility fnc for pickling, common scipy operations etc
      
      def similarity_cosine(vec1, vec2):
          cosine_similarity = np.dot(matutils.unitvec(vec1), matutils.unitvec(vec2))
          return cosine_similarity
      
      similarity_cosine(model.wv['space'], model.wv['france'])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        • 2017-05-12
        • 2019-07-02
        • 2020-10-14
        • 1970-01-01
        • 2013-07-18
        • 1970-01-01
        相关资源
        最近更新 更多