Visualiser word2vec généré à partir de gensim
J'ai formé un doc2vec et correspondant word2vec sur mon propre corpus à l'aide de gensim. Je veux visualiser le word2vec à l'aide de t-end avec les mots. Comme dans chacun des points de la figure a la "parole" aussi avec elle.
J'ai regardé une question similaire ici : t-end sur word2vec
Qui la suit, j'ai ce code :
importation gensim
importation gensim.les modèles que g
from sklearn.manifold import TSNE
import re
import matplotlib.pyplot as plt
modelPath="/Users/tarun/Desktop/PE/doc2vec/model3_100_newCorpus60_1min_6window_100trainEpoch.bin"
model = g.Doc2Vec.load(modelPath)
X = model[model.wv.vocab]
print len(X)
print X[0]
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X[:1000,:])
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show()
Cela donne une figure avec des points mais pas de mots. Ce n'est que je ne sais pas de quel point est représentatif de ce qui word. Comment puis-je afficher le mot avec la dot?
Vous devez vous connecter pour publier un commentaire.
Deux parties de la réponse: comment obtenir le mot étiquettes, et comment tracer les étiquettes sur un nuage de points.
Mot étiquettes dans gensim de word2vec
model.wv.vocab
est un dict de {mot: objet du numérique vecteur}. Pour charger les données dansX
pour des tee-END, j'ai fait un changement d'état.Il en résulte deux choses: (1) il est autonome
vocab
liste pour la finale dataframe de la parcelle, et (2) lors de l'indexation d'model
, vous pouvez être sûr que vous savez l'ordre des mots.Procéder comme avant avec
Maintenant, nous allons mettre
X_tsne
avec levocab
liste. C'est facile avec les pandas, doncimport pandas as pd
si vous n'avez pas encore.Le vocabulaire les mots sont les indices du dataframe maintenant.
Je n'ai pas votre jeu de données, mais dans le les autres, de SORTE vous l'avez mentionné, un exemple
df
qui utilise sklearn de groupes de discussion devrait ressembler à quelque chose commeNuage de points
J'aime l'approche orientée objet pour matplotlib, de sorte que cela commence un peu différent.
Enfin, la
annotate
méthode étiquette coordonnées. Les deux premiers arguments sont le texte d'étiquette et le 2-n-uplet. À l'aide deiterrows()
, cela peut être très succinct:[Merci à Ricardo dans les commentaires pour cette suggestion.]
Puis faire
plt.show()
oufig.savefig()
. En fonction de vos données, vous allez probablement avoir à jouer avec l'ax.set_xlim
etax.set_ylim
de voir dans un nuage dense. C'est le groupe de discussion exemple, sans peaufinage:Vous pouvez modifier le point la taille, la couleur, etc., trop. Heureux de réglage fin!
df = pd.DataFrame(X2, vocab, ['x', 'y'])
et puisfor word, pos in df.iterrows(): plt.annotate(word, pos)
. c'est à dire utiliser les mots que l'index. Vous pouvez vous débarrasser de laconcat
et d'autres lignes.vocab
que df et l'indice deiterrows
simplification. Merci, @RicardoCruz!