2014-02-24 35 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 '是這兩個詞之間的餘弦相似度。