2014-02-24 11 views
17

Word2vec는 Google에서 제공하는 단어 거리를 계산하는 오픈 소스 도구입니다. 단어를 입력하고 유사성에 따라 순위가 매겨진 단어 목록을 출력하여 사용할 수 있습니다. 예 :2 단어를 제공하여 유사 거리를 계산하는 방법을 word2vec를 사용하는 방법

입력 :

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 

그러나, 제가해야 할 것은이 개 단어를 제공함으로써 유사성 거리를 계산하는 것입니다. 내가 '프랑스'와 '스페인'을 주면, '프랑스'라고 말하면서 전체 단어 목록을 읽지 않고 어떻게 점수 0.678515를 얻을 수 있습니까?

답변

20

gensim는 내장 유틸리티를 제공합니다 Word2Vec의 파이썬 구현이를 사용자에 의해 입력 된 두 단어 사이의 유사성을 찾는다. 다음을 참조 할 수 있습니다 :

  1. 소개 : http://radimrehurek.com/gensim/models/word2vec.html
  2. 자습서 : http://radimrehurek.com/2014/02/word2vec-tutorial/

두 단어 사이의 유사성을 찾기위한 파이썬의 구문은 다음과 같이 진행됩니다

>> 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의 벡터를 얻을 수 있고 코사인 거리 (내적)를 계산할 수 있습니다.

쉬운 방법은 this 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'])) 
+0

Word2vec는 코사인 거리 결과를 얻고, 코사인 거리가 아닌 여러 개의 2 벡터 만 numpy.dot합니까? – zhfkt

+0

@ zhfkt 네, 맞습니다. 나는 공식을 편집했다. – phyrox

+1

유사 기능은 간단한 결과로 동일한 결과를 얻을 수 있습니다. http://radimrehurek.com/gensim/models/word2vec.html – zhfkt

0

I gensim을 사용하여 2 문장/SKU에 대한 코사인 유사성을 계산하는 데 도움이되는 코드를 개발했습니다. 코드는 여기 코드는 Crowdflower

에 Kaggle 경쟁에 대한 데이터를 사용 https://github.com/aviralmathur/Word2Vec

을 찾을 수 있습니다 그것은 여기에 해당 Word2Vec에 Kaggle 튜토리얼에 대한 코드를 사용하여 개발 된

내가 희망 https://www.kaggle.com/c/word2vec-nlp-tutorial

을하는 데 도움이
+4

StackOverflow에 오신 것을 환영합니다.이 질문에 답변 해 주셔서 감사합니다. 링크가 변경되거나 호스트가 다운되면 답변이 쓸모 없게되기 때문에 답변 만 링크가되기를 원하지 않습니다. 이 답변을 편집하고이 답변에서 링크 한 코드의 주요 사항을 포함하십시오. –

3

gensim과 같은 다른 라이브러리를 사용하지 않고 원래 distance.c 버전을 수정하여이 작업을 수행하는 방법을 찾고있는 동안 방금이 걸림돌을 발견했습니다.

나는 약간의 연구를 했으므로 답을 찾지 못했고 원래의 구현에서 그것을 수행하는 방법을 알고 싶어하는 다른 사람들을 위해 여기에서 공유하고 있습니다.

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 :

이런 (내적과 동일 함) 코사인 거리들을 찾아보고 계산, 두 인덱스와 벡터의 모델을 사용하여 '는 두 단어 사이의 코사인 유사성입니다.