如何使用word2vec计算给定两个单词之间的相似度距离?

50

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

然而,我需要做的是通过给定两个单词来计算相似性距离。如果我给出'france'和'spain',在不读取整个单词列表的情况下如何获得得分0.678515。

5个回答

60

gensim提供了Python版的Word2Vec实现,内置了一个工具,可以用于查找用户输入的两个单词之间的相似度。您可以参考以下链接:

  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')

如果需要,在这里可以查看使用原始word2vec c语言实现创建的向量文件的相关信息。 - matanster
2
@Satarupa Guha:这个相似度函数是什么?是余弦函数吗? - Chedi Bechikh
是的,确实是余弦相似度函数。 - Satarupa Guha

40

就像你所知道的一样,word2vec可以将一个单词表示为数学向量。因此,一旦你训练好模型,你可以获取单词spainfrance的向量并计算它们的余弦距离(点积)。

一个简单的方法是使用 这个 Python包装器来操作word2vec。你可以使用以下代码获得向量:

>>> 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']))

Word2vec得到余弦距离结果,而numpy.dot只是将两个向量相乘,而不是余弦距离。 - zhfkt
2
相似度函数可以以简单的方式获得相同的结果 http://radimrehurek.com/gensim/models/word2vec.html - zhfkt

5

我在寻找如何通过修改原始的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”将成为两个单词之间的余弦相似度。


0

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

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'])

0

12
欢迎来到 StackOverflow,并感谢您回答这个问题。我们不希望答案只是一个链接,因为如果链接变化或主机崩溃,你的答案就会变得无用。请编辑这个答案并包含来自你链接代码的主要要点。 - Aaron D
1
@AaronD 真遗憾 Stack Exchange 没有使用 https://web.archive.org 来镜像链接。 - Franck Dernoncourt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接