45

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

输入:

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 的分数。

4

5 回答 5

52

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')
于 2014-08-21T06:04:54.240 回答
36

如您所知word2vec,可以将单词表示为数学向量。因此,一旦您训练了模型,您就可以获得单词的向量spainfrance计算余弦距离(点积)。

一个简单的方法是使用这个word2vec 的 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']))
于 2014-02-26T09:42:23.950 回答
4

我只是在寻找如何通过修改原始 distance.c 版本而不是使用像 gensim 这样的其他库来做到这一点时偶然发现了这一点。

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

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

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

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

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

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

于 2016-03-18T16:52:26.090 回答
0

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

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

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

我希望这有帮助

于 2015-08-19T14:18:45.263 回答
0

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

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'])
于 2021-09-10T05:34:45.713 回答