web-dev-qa-db-fra.com

Visualisez les intégrations de Gensim Word2vec dans le projecteur Tensorboard

Je n'ai vu que quelques questions qui posent cette question, et aucune d'entre elles n'a encore de réponse, alors j'ai pensé que je pourrais aussi bien essayer. J'ai utilisé le modèle Word2vec de gensim pour créer des vecteurs. Je les ai exportés en texte et j'ai essayé de l'importer sur le modèle en direct de tensorflow du projecteur d'intégration. Un problème. Cela n'a pas fonctionné. Il m'a dit que les tenseurs étaient mal formatés. Donc, étant un débutant, j'ai pensé demander à des personnes plus expérimentées des solutions possibles.
Équivalent à mon code:

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)

Cela crée le modèle, enregistre les vecteurs, puis imprime les résultats Nice et joli dans un fichier délimité par des tabulations avec des valeurs pour toutes les dimensions. Je comprends comment faire ce que je fais, je ne peux pas comprendre ce qui ne va pas avec la façon dont je le mets dans tensorflow, car la documentation à ce sujet est assez rare pour autant que je sache.
Une idée qui m'a été présentée consiste à implémenter le code tensorflow approprié, mais je ne sais pas comment coder cela, il suffit d'importer des fichiers dans la démo en direct.

Edit: j'ai un nouveau problème maintenant. L'objet dans lequel j'ai mes vecteurs n'est pas itérable car Gensim a apparemment décidé de créer ses propres structures de données qui ne sont pas compatibles avec ce que j'essaie de faire.
D'accord. Fait aussi avec ça! Merci de votre aide!

11
I. Blum

Ce que vous décrivez est possible. Ce que vous devez garder à l'esprit, c'est que Tensorboard lit à partir des binaires tensorflow enregistrés qui représentent vos variables sur le disque.

Plus d'informations sur l'enregistrement et la restauration du graphique et des variables tensorflow ici

La tâche principale est donc d'obtenir les plongements en tant que variables tf enregistrées.

Hypothèses:

  • dans le code suivant embeddings est un python dict {Word:np.array (np.shape==[embedding_size])}

  • la version python est 3.5+

  • les bibliothèques utilisées sont numpy as np, tensorflow as tf

  • le répertoire pour stocker les variables tf est model_dir/


Étape 1: empilez les plongements pour obtenir un seul np.array

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

Étape 2: enregistrez le tf.Variable sur le disque

# 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 doit contenir des fichiers checkpoint, model.ckpt-1.data-00000-of-00001, model.ckpt-1.index, model.ckpt-1.meta


Étape 3: générer un metadata.tsv

Pour avoir un joli nuage d'étiquettes incorporées, vous pouvez fournir au tensorboard des métadonnées sous forme de valeurs séparées par des tabulations (tsv) ( cf.ici ).

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

Étape 4: Visualisez

Courir $ tensorboard --logdir model_dir -> Projecteur .

Pour charger des métadonnées, la magie opère ici:

load_meta


Pour rappel, certaines projections d'intégration Word2vec sont également disponibles sur http://projector.tensorflow.org/

10
syltruong

Gensim a en fait la manière officielle de le faire.

Documentation à ce sujet

1
Marco Oliveira

Les réponses ci-dessus n'ont pas fonctionné pour moi. Ce que j'ai trouvé assez utile était ce script (sera ajouté à gensim à l'avenir) Source

Pour transformer les données en métadonnées:

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')

Ou suivez ceci Gist

0
Gonzalo Garcia