如何在gensim创建的word2vec上运行tsne?

时间:2016-11-14 02:17:09

标签: scikit-learn gensim word2vec

我想想象一下从gensim库创建的word2vec。我尝试了sklearn,但似乎我需要安装一个开发人员版本来获取它。我尝试安装开发人员版本,但这不适用于我的机器。是否可以修改此代码以显示word2vec模型?

tsne_python

2 个答案:

答案 0 :(得分:20)

您不需要开发者版本的scikit-learn - 只需通过 pip conda 通常install scikit-learn

要访问word2vec创建的单词向量,只需使用单词词典作为模型的索引:

X = model[model.wv.vocab]

以下是一个简单但完整的代码示例,它可以加载一些新闻组数据,应用非常基本的数据准备(清理和分解句子),训练word2vec模型,使用t-SNE缩小尺寸,并可视化输出。

from gensim.models.word2vec import Word2Vec
from sklearn.manifold import TSNE
from sklearn.datasets import fetch_20newsgroups
import re
import matplotlib.pyplot as plt

# download example data ( may take a while)
train = fetch_20newsgroups()

def clean(text):
    """Remove posting header, split by sentences and words, keep only letters"""
    lines = re.split('[?!.:]\s', re.sub('^.*Lines: \d+', '', re.sub('\n', ' ', text)))
    return [re.sub('[^a-zA-Z]', ' ', line).lower().split() for line in lines]

sentences = [line for text in train.data for line in clean(text)]

model = Word2Vec(sentences, workers=4, size=100, min_count=50, window=10, sample=1e-3)

print (model.most_similar('memory'))

X = model[model.wv.vocab]

tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)

plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show()

答案 1 :(得分:1)

使用下面的代码,而不是X使用numpy.vstack将所有单词嵌入垂直连接到矩阵X中,然后fit_transform它。

import numpy as np
from sklearn.manifold import TSNE
X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
model = TSNE(n_components=2, random_state=0)
np.set_printoptions(suppress=True)
model.fit_transform(X) 

fit_transform的输出具有形状vocab_size x 2,因此您可以将其可视化。

vocab = sorted(word2vec_model.get_vocab()) #not sure the exact api
emb_tuple = tuple([word2vec_model[v] for v in vocab])
X = numpy.vstack(emb_tuple)