私はでWord2vecを使用しており、Googleのトレーニングを受けているGoogleのトレーニングを受けたベータ版がGoogleニュースで訓練されています。私はWord2Vec
オブジェクトに直接インデックス検索を行うことによってアクセスすることができますワードベクトルは単位ベクトルではないことに気づいた:Word2vecベクターの長さはどのような意味を持っていますか?
>>> import numpy
>>> from gensim.models import Word2Vec
>>> w2v = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
>>> king_vector = w2v['king']
>>> numpy.linalg.norm(king_vector)
2.9022589
しかし、most_similar
方法では、これらの非単位ベクトルが使用されていません。代わりに、正規化されたバージョンのみの単位ベクトルを含む非公開.syn0norm
プロパティから使用されている:
>>> w2v.init_sims()
>>> unit_king_vector = w2v.syn0norm[w2v.vocab['king'].index]
>>> numpy.linalg.norm(unit_king_vector)
0.99999994
大きなベクトルは単位ベクトルだけスケールアップ版である:その単語の類似性を考えると
>>> king_vector - numpy.linalg.norm(king_vector) * unit_king_vector
array([ 0.00000000e+00, -1.86264515e-09, 0.00000000e+00,
0.00000000e+00, -1.86264515e-09, 0.00000000e+00,
-7.45058060e-09, 0.00000000e+00, 3.72529030e-09,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
... (some lines omitted) ...
-1.86264515e-09, -3.72529030e-09, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00], dtype=float32)
Word2Vecでの比較はcosine similarityで行われていますが、非正規化ベクトルの長さの意味はわかりません。.syn0norm
で単位ベクトルを公開するのではなく、gensimがそれらを私に公開するので、の何かを 。
これらの正規化されていないWord2vecベクトルの長さはどのように生成され、その意味は?どのような計算のために、正規化されたベクトルを使用するのが理にかなっています。
関連:[word2vecの単語ベクトルを使用する前に正規化するか?](http://stats.stackexchange.com/q/177905/12359) –