如何使用 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
可以将单词表示为数学向量。所以一旦你训练了模型,你就可以获得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']))
【讨论】:
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 个单词来计算相似度距离?的主要内容,如果未能解决你的问题,请参考以下文章