web-dev-qa-db-ja.com

Word2vecを使用して2つの単語を与えることで類似距離を計算する方法は?

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つの単語を指定して類似距離を計算する必要があります。 「france」と「spain」を指定すると、「france」だけを指定して単語リスト全体を読まずにスコア0.678515を取得できます。

32
zhfkt

gensimには、Python Word2Vecの実装があり、ユーザーが入力として指定した2つの単語間の類似性を見つけるための組み込みユーティリティを提供します。以下を参照できます。

  1. イントロ: http://radimrehurek.com/gensim/models/Word2vec.html
  2. チュートリアル: http://radimrehurek.com/2014/02/Word2vec-tutorial/

2つの単語間の類似性を見つけるためのPythonの構文は次のようになります。

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

あなたが知っているように Word2vecは、Wordを数学的なベクトルとして表すことができます。したがって、モデルをトレーニングすると、単語spainおよびfranceのベクトルを取得し、コサイン距離(内積)を計算できます。

これを行う簡単な方法は this Python Word2vecのラッパーです。これを使用してベクターを取得できます。

>>> model['computer'] # raw numpy vector of a Word
array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)

2つの単語間の距離を計算するには、次のことができます。

>>> import numpy    
>>> cosine_similarity = numpy.dot(model['spain'], model['france'])/(numpy.linalg.norm(model['spain'])* numpy.linalg.norm(model['france']))
29
phyrox

Gensimのような別のライブラリを使用するのではなく、元のdistance.cバージョンを変更してこれを行う方法を探しているときに、私はこれにつまずいた。

私は答えを見つけられなかったので、いくつかの調査を行い、元の実装でそれを行う方法を知りたい他の人のためにここで共有しています。

Cソースを調べると、「bi」はインデックスの配列であることがわかります。 2つの単語を指定すると、Word1のインデックスはbi [0]になり、Word2のインデックスはbi [1]になります。

モデル「M」はベクトルの配列です。各Wordは、ディメンション「サイズ」を持つベクトルとして表されます。

これらの2つのインデックスとベクトルのモデルを使用して、それらを検索し、コサイン距離(内積と同じ)を次のように計算します。

dist = 0;
for (a = 0; a < size; a++) {
    dist += M[a + bi[0] * size] * M[a + bi[1] * size];
}

これが完了すると、値 'dist'は2つの単語間のコサイン類似度になります。

4
binarymax