2014-02-24 39 views
17

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

输入:

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的分数,而不用通过给出'法国'来阅读整个单词列表。

回答

20

gensim有一个Python实现Word2Vec的它提供了一个内置的实用工具用于找出由用户输入的两个词之间的相似性。你可以参考以下几点:

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

两个词之间找到相似的Python语法是这样的:

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

如果在这方面很有用,请参阅[这里](http://radimrehurek.com/gensim/models/word2vec.html)使用由原始word2vec c语言实现创建的矢量文件。 – matanster

+2

@Satarupa Guha:这种相似性功能是什么?这是余弦吗? –

+0

是的,这的确是余弦相似函数。 –

22

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

一个简单的方法是使用word2vec的Python包装this。您可以使用此获得的载体:

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

Word2vec获取余弦距离结果,并且numpy.dot只是余弦距离以外的多个2向量? – zhfkt

+0

@zhfkt是的,你是对的。我编辑了公式。 – phyrox

+1

相似性函数可以通过简单的方式获得相同的结果http://radimrehurek.com/gensim/models/word2vec.html – zhfkt

0

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

的代码使用数据上Crowdflower

Kaggle竞争

已使用代码开发Kaggle教程Word2Vec可以在这里 https://www.kaggle.com/c/word2vec-nlp-tutorial

我希望这有助于

+4

欢迎来到StackOverflow,并感谢您回答此问题。我们不希望答案只是链接,因为如果链接发生变化或主机停机,您的答案就变得毫无用处。请编辑此答案,并包含您在此答案中链接的代码中的要点。 –

3

我只是在寻找如何通过修改原始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 '是这两个词之间的余弦相似度。