2017-03-02 19 views
1

this paper (Improving document ranking with dual word embeddings)などのword2vecの出力埋め込みを使用したいと思います。gensim word2vecで出力埋め込み(出力ベクトル)にアクセスするにはどうすればよいですか?

私は入力ベクトルがsyn0にあり、出力ベクトルはsyn1にあり、陰性サンプリングの場合はsyn1negであることがわかります。

しかし、出力ベクトルでmost_similarを計算したとき、syn1またはsyn1negを削除したためにいくつかの範囲で同じ結果が得られました。

これは私が得たものです。

IN[1]: model = Word2Vec.load('test_model.model') 

IN[2]: model.most_similar([model.syn1neg[0]]) 

OUT[2]: [('of', -0.04402521997690201), 
('has', -0.16387106478214264), 
('in', -0.16650712490081787), 
('is', -0.18117375671863556), 
('by', -0.2527652978897095), 
('was', -0.254993200302124), 
('from', -0.2659570872783661), 
('the', -0.26878535747528076), 
('on', -0.27521973848342896), 
('his', -0.2930959463119507)] 

しかし、別のsyn1neg numpyベクトルはすでに同様の出力です。

IN[3]: model.most_similar([model.syn1neg[50]]) 

OUT[3]: [('of', -0.07884830236434937), 
('has', -0.16942456364631653), 
('the', -0.1771494299173355), 
('his', -0.2043554037809372), 
('is', -0.23265135288238525), 
('in', -0.24725285172462463), 
('by', -0.27772971987724304), 
('was', -0.2979024648666382), 
('time', -0.3547973036766052), 
('he', -0.36455872654914856)] 

トレーニング中に保存された出力numpy配列(否定または否定)を取得したいと考えています。

純粋なsyn1またはsyn1neg、またはコードにアクセスするにはどうすればよいですか、またはいくつかのword2vecモジュールで出力の埋め込みを取得できます。

答えて

4

負のサンプリングでは、syn1negの重みは単語単位であり、syn0と同じ順序です。

あなたの2つの例が同様の結果を出すという事実だけでも、必ずしも間違っているとは限りません。単語はデフォルトで頻度でソートされているので、初期の単語(位置0と50の単語を含む)は非常に一般的な共起ベースの意味を持つ非常に頻繁な単語です(すべて互いに近いかもしれません)。

より明確な意味を持つ中頻度の単語を選び、より有意義な結果を得ることができます(コーパス/設定/ニーズが「二重単語埋め込み」のものと十分に似ている場合)。たとえば、あなたが比較したい場合があります

model.most_similar('cousin') 

... ...

model.most_similar(positive=[model.syn1neg[model.vocab['cousin'].index]) 

しかし、すべての場合には、既存のmost_similar()方法のみsyn0に同様のベクトルを探して - 'をIN 'という用語を使用しています。だから私は、上記のコードは、実際には、論文が「OUT-IN」類似性と呼ばれるものを計算するだけであると考えています。INベクトルが与えられたOUTベクトルに最も類似しているリスト。彼らは実際には逆の「IN-OUT」類似性を有用なものとして宣伝しているようです。 (これは、与えられたINベクトルに最も近いOUTベクトルです)

最新バージョンのgensimは、特定のWord2Vecモデルとは別に、文字列をキーとする単語ベクトルのセットを表現するためのKeyedVectorsクラスを導入しています。他の訓練方法。 syn0syn1negに置き換えて、ターゲットベクトルに似たOUTベクトルのリストを得る(そして、トップn 'IN-OUT'類似性または 'OUT-OUT'類似性を計算する)余分なKeyedVectorsインスタンスを作成することができます。

たとえば、このかもしれない仕事(私はそれをテストしていません):階層的なサンプリングを使用した場合

outv = KeyedVectors() 
outv.vocab = model.wv.vocab # same 
outv.index2word = model.wv.index2word # same 
outv.syn0 = model.syn1neg # different 
inout_similars = outv.most_similar(positive=[model['cousin']]) 

syn1のみ存在し、それは個々のためにどのような「出力埋め込み」あまり明確です言葉がそこにあるだろう。(1つの単語を予測することに対応する複数の出力ノードがあり、1つの単語を予測するためにはそれぞれ適切なそれぞれの0/1値に近づく必要がありますので、syn1negとは異なり、ベクトルを読み取る場所はありませんこれらの複数の出力ノードを適切な値に駆動するhidden->出力ウェイトを計算/近似しなければならない場合があります)

+0

コードはすばらしく機能します! 私に答えをくれてありがとうございます。 –

関連する問題