如何使用 word2vec 通过给出 2 个单词来计算相似度距离?

Posted

技术标签:

【中文标题】如何使用 word2vec 通过给出 2 个单词来计算相似度距离?【英文标题】:How to use word2vec to calculate the similarity distance by giving 2 words? 【发布时间】: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的分数而不通过只给'法国'来阅读整个单词列表。

【问题讨论】:

【参考方案1】:

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

    简介:http://radimrehurek.com/gensim/models/word2vec.html 教程: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 可以将单词表示为数学向量。所以一旦你训练了模型,你就可以获得spainfrance这两个词的向量并计算余弦距离(点积)。

一个简单的方法是使用 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']))

【讨论】:

Word2vec 得到余弦距离结果,numpy.dot 是否只是余弦距离以外的 2 个向量? 相似函数可以用简单的方法得到同样的结果radimrehurek.com/gensim/models/word2vec.html【参考方案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

希望对你有帮助

【讨论】:

欢迎来到 ***,感谢您回答这个问题。我们不希望答案只是链接,因为如果链接发生变化或主机出现故障,您的答案将变得毫无用处。请编辑此答案并包含您在此答案中链接的代码中的要点。 @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'])

【讨论】:

以上是关于如何使用 word2vec 通过给出 2 个单词来计算相似度距离?的主要内容,如果未能解决你的问题,请参考以下文章

word2vec高效训练方法

如何学习word2vec

如何使用 word2vec 找到最接近向量的单词

Word2vec ------算法岗面试题

使用带有 LSTM 的预训练 word2vec 进行单词生成

word2vec如何解析文本文件?