私はWord2vecを gensim まで使用しており、GoogleニュースでトレーニングされたGoogleの事前トレーニングされたベクターを使用しています。 Word2Vec
オブジェクトで直接インデックスルックアップを実行してアクセスできるWordベクトルは単位ベクトルではないことに気づきました。
>>> 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での単語の類似性の比較が コサイン類似性 によって行われることを考えると、正規化されていないベクトルの長さが何を意味するのかは私にはわかりません-意味すると思いますが gensimは.syn0norm
の単位ベクトルを公開するだけでなく、それらを公開するため、something。
これらの正規化されていないWord2vecベクトルの長さはどのように生成され、それらの意味は何ですか?正規化されたベクトルを使用することはどのような計算に意味があり、正規化されていないベクトルをいつ使用する必要がありますか?
あなたが探している答えは、2015年の論文 単語の分散表現を使用した単語の有意性の測定 AdriaanSchakelとBenjaminWilsonによって説明されていると思います。キーポイント:
Wordがさまざまなコンテキストで表示されると、更新中にそのベクトルがさまざまな方向に移動します。最終的なベクトルは、さまざまなコンテキストでのある種の加重平均を表します。異なる方向を指すベクトルを平均すると、通常、Wordが表示されるさまざまなコンテキストの数が増えるとベクトルが短くなります。単語が多くの異なる文脈で使用されるためには、それらはほとんど意味を持たなければなりません。このような重要でない単語の代表的な例は、高頻度のストップワードです。これは、高頻度の頻度にもかかわらず、実際には短いベクトルで表されます。
与えられた項の頻度に対して、ベクトルの長さは狭い間隔でのみ値をとるように見えます。その間隔は、最初は周波数の増加とともに上方にシフトします。約30の頻度で、その傾向は逆転し、間隔は下にシフトします。
.。
ここでは、Wordベクトルの長さを決定する両方の力が働いています。低頻度の単語は一貫して使用される傾向があるため、そのような単語が頻繁に出現するほど、それらのベクトルは長くなります。この傾向は、低周波数での図3の上昇傾向に反映されています。一方、高頻度の単語は、さまざまなコンテキストで使用される傾向があり、使用頻度が高いほど、頻繁に使用されます。増加する数の異なるコンテキストで平均化すると、そのような単語を表すベクトルが短くなります。この傾向は、図3の高頻度での下降傾向に明確に反映されており、句読点と最後に短いベクトルを持つストップワードで最高潮に達します。
.。
図3:すべての単語の単語ベクトルの長さvと用語の頻度tf hep-th語彙で。周波数軸で使用されている対数目盛に注意してください。暗い記号は、ビンの平均を示します。 k区間[2の頻度を含むビンk-1、2k − 1] withk= 1、2、3 、。 。 ..これらの手段は目のガイドとして含まれています。水平線は、平均ベクトルの長さv= 1.37を示します
4。討議
これまでのところ、Word2vecを介して取得された単語の分散表現のほとんどのアプリケーションは、セマンティクスを中心としていました。多くの実験により、Wordベクトルの方向がセマンティクスをキャプチャする範囲が実証されています。この簡単なレポートでは、方向だけでなく、Wordベクトルの長さも重要な情報を持っていることが指摘されました。具体的には、単語のベクトルの長さが、用語の頻度と組み合わせて、単語の重要性の有用な尺度を提供することが示されました。
事前に冗長であることをお詫び申し上げます。
Word埋め込みモデルの目的関数は、モデルの下でのデータ対数尤度を最大化することです。 Word2vecでは、これは、Wordコンテキストが与えられた場合のWordの予測ベクトル(コンテキストを使用)と実際のベクトル(現在の表現)のdot product
(softmax
で正規化)を最小化することによって実現されます。
Wordベクトルがトレーニングされるタスクは、Wordで指定されたコンテキスト、またはWordで指定されたコンテキスト(skip-gram
とcbow
)のいずれかを予測することであることに注意してください。 単語の長さ-ベクトル自体には意味がありませんが、ベクトル自体には興味深いプロパティ/アプリケーションがあることがわかります。
類似した単語を見つけるには、コサイン類似度が最大の単語を検索します(ベクトルを単位正規化した後、ユークリッド距離が最小の単語を検索するのと同じです。 link )、 most_similar
関数が実行しています。
類推を見つけるには、Wordベクトルの生のベクトル表現間の差(または方向)ベクトルを使用するだけです。例えば、
gensim
では、
model = gensim.models.Word2Vec.load_Word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
model.most_similar(positive=['good', 'sad'], negative=['bad'])
[(u'wonderful', 0.6414928436279297),
(u'happy', 0.6154338121414185),
(u'great', 0.5803680419921875),
(u'Nice', 0.5683973431587219),
(u'saddening', 0.5588893294334412),
(u'bittersweet', 0.5544661283493042),
(u'glad', 0.5512036681175232),
(u'fantastic', 0.5471092462539673),
(u'proud', 0.530515193939209),
(u'saddened', 0.5293528437614441)]
参照:
回答を関連するものにコピーする(まだ回答されていない 質問 )