web-dev-qa-db-ja.com

TensorboardプロジェクターでGensim Word2vec埋め込みを視覚化する

私はこれを尋ねるいくつかの質問を見ただけで、それらのどれもまだ答えを持っていないので、私は試してみようと思いました。私はいくつかのベクトルを作成するためにgensimのWord2vecモデルを使用しています。それらをテキストにエクスポートし、埋め込みプロジェクターのテンソルフローのライブモデルにインポートしてみました。一つの問題。 うまくいきませんでした。テンソルの形式が不適切であることがわかりました。だから、初心者なので、可能な解決策についてもっと経験のある人に聞いてみようと思いました。
私のコードと同等:

import gensim
corpus = [["words","in","sentence","one"],["words","in","sentence","two"]]
model = gensim.models.Word2Vec(iter = 5,size = 64)
model.build_vocab(corpus)
# save memory
vectors = model.wv
del model
vectors.save_Word2vec_format("vect.txt",binary = False)

これにより、モデルが作成され、ベクトルが保存され、すべての次元の値を含むタブ区切りファイルに、Niceとprettyの結果が出力されます。私がやっていることを行う方法を理解していますが、それに関するドキュメントが私が知る限りかなり不足しているため、テンソルフローに配置する方法の何が問題になっているのか理解できません。
提示されたアイデアの1つは、適切なテンソルフローコードを実装することですが、それをコード化する方法がわかりません。ライブデモにファイルをインポートするだけです。

編集:私は今、新しい問題を抱えています。 gensimが、自分がやろうとしていることと互換性のない独自のデータ構造を作成することを明らかにしたため、私がベクターを入れているオブジェクトは反復不可能です。
OK。それも終わりました!ご協力いただきありがとうございます!

11
I. Blum

あなたが説明していることは可能です。 Tensorboardは、ディスク上の変数を表す保存されたテンソルフローバイナリから読み取ることを覚えておく必要があります。

Tensorflowグラフと変数の保存と復元の詳細 here

したがって、主なタスクは、埋め込みを保存されたtf変数として取得することです

仮定:

  • 次のコードではembeddingsはpython dict {Word:np.array (np.shape==[embedding_size])}です

  • pythonバージョンは3.5+です

  • 使用されるライブラリはnumpy as nptensorflow as tfです

  • tf変数を格納するディレクトリはmodel_dir/です


ステップ1:埋め込みをスタックして単一のnp.arrayを取得します

embeddings_vectors = np.stack(list(embeddings.values(), axis=0))
# shape [n_words, embedding_size]

ステップ2:tf.Variableをディスクに保存する

# Create some variables.
emb = tf.Variable(embeddings_vectors, name='Word_embeddings')

# Add an op to initialize the variable.
init_op = tf.global_variables_initializer()

# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, initialize the variables and save the
# variables to disk.
with tf.Session() as sess:
   sess.run(init_op)

# Save the variables to disk.
   save_path = saver.save(sess, "model_dir/model.ckpt")
   print("Model saved in path: %s" % save_path)

model_dirにはファイルcheckpointmodel.ckpt-1.data-00000-of-00001model.ckpt-1.indexmodel.ckpt-1.metaを含める必要があります


ステップ3:metadata.tsvを生成する

埋め込みの美しいラベル付きクラウドを作成するには、タブ区切り値(tsv)(cf。here )としてメタデータをテンソルボードに提供できます。

words = '\n'.join(list(embeddings.keys()))

with open(os.path.join('model_dir', 'metadata.tsv'), 'w') as f:
   f.write(words)

# .tsv file written in model_dir/metadata.tsv

ステップ4:視覚化する

$ tensorboard --logdir model_dir->Projectorを実行します。

メタデータをロードするために、魔法はここで起こります:

load_meta


注意として、一部のWord2vec埋め込みプロジェクションは http://projector.tensorflow.org/ でも利用できます。

10
syltruong

Gensimには実際にこれを行う公式の方法があります。

それに関するドキュメント

1
Marco Oliveira

上記の答えは私にはうまくいきませんでした。私がかなり便利だとわかったのは、このスクリプトです(将来的にgensimに追加される予定です) Source

データをメタデータに変換するには:

model = gensim.models.Word2Vec.load_Word2vec_format(model_path, binary=True)
with open( tensorsfp, 'w+') as tensors:
    with open( metadatafp, 'w+') as metadata:
         for Word in model.index2Word:
           encoded=Word.encode('utf-8')
           metadata.write(encoded + '\n')
           vector_row = '\t'.join(map(str, model[Word]))
           tensors.write(vector_row + '\n')

またはこれに従う 要旨

0
Gonzalo Garcia