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を取得できます。
gensimには、Python Word2Vecの実装があり、ユーザーが入力として指定した2つの単語間の類似性を見つけるための組み込みユーティリティを提供します。以下を参照できます。
2つの単語間の類似性を見つけるためのPythonの構文は次のようになります。
>> from gensim.models import Word2Vec
>> model = Word2Vec.load(path/to/your/model)
>> model.similarity('france', 'spain')
あなたが知っているように 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']))
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つの単語間のコサイン類似度になります。