私はこれを尋ねるいくつかの質問を見ただけで、それらのどれもまだ答えを持っていないので、私は試してみようと思いました。私はいくつかのベクトルを作成するために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。それも終わりました!ご協力いただきありがとうございます!
あなたが説明していることは可能です。 Tensorboardは、ディスク上の変数を表す保存されたテンソルフローバイナリから読み取ることを覚えておく必要があります。
Tensorflowグラフと変数の保存と復元の詳細 here
したがって、主なタスクは、埋め込みを保存されたtf変数として取得することです
仮定:
次のコードでは
embeddings
はpython dict{Word:np.array (np.shape==[embedding_size])}
ですpythonバージョンは3.5+です
使用されるライブラリは
numpy as np
、tensorflow as tf
ですtf変数を格納するディレクトリは
model_dir/
です
np.array
を取得しますembeddings_vectors = np.stack(list(embeddings.values(), axis=0))
# shape [n_words, embedding_size]
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
にはファイルcheckpoint
、model.ckpt-1.data-00000-of-00001
、model.ckpt-1.index
、model.ckpt-1.meta
を含める必要があります
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
$ tensorboard --logdir model_dir
->Projectorを実行します。
メタデータをロードするために、魔法はここで起こります:
注意として、一部のWord2vec埋め込みプロジェクションは http://projector.tensorflow.org/ でも利用できます。
Gensimには実際にこれを行う公式の方法があります。
上記の答えは私にはうまくいきませんでした。私がかなり便利だとわかったのは、このスクリプトです(将来的に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')
またはこれに従う 要旨