scikit-learn - 可视化从gensim生成的word2vec

标签 scikit-learn data-visualization gensim word2vec

我已经使用gensim在自己的语料库上训练了doc2vec和相应的word2vec。我想使用带有单词的t-sne可视化word2vec。如图所示,图中的每个点也带有“单词”。

我在这里看了一个类似的问题:t-sne on word2vec

之后,我有此代码:

导入gensim
将gensim.models导入为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()

这给出了一个带有点但没有单词的图形。那就是我不知道哪个点代表哪个单词。如何显示带点的单词?

最佳答案

答案分为两个部分:如何获取单词标签,以及如何在散点图上绘制标签。

gensim的word2vec中的单词标签
model.wv.vocab是{word:数字 vector 对象}的字典。要将数据加载到t-SNE的X中,我进行了一项更改。

vocab = list(model.wv.vocab)
X = model[vocab]

这完成了两件事:(1)它为您提供了要绘制的最终数据帧的独立vocab列表,以及(2)在为model编制索引时,可以确保您知道单词的顺序。

像以前一样继续
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)

现在,让我们将X_tsnevocab列表放在一起。对于 Pandas 来说这很容易,所以如果还没有import pandas as pd的话。
df = pd.DataFrame(X_tsne, index=vocab, columns=['x', 'y'])

词汇词现在是数据帧的索引。

我没有您的数据集,但是在您提到的other SO中,使用sklearn的新闻组的示例df看起来像
                        x             y
politics    -1.524653e+20 -1.113538e+20
worry        2.065890e+19  1.403432e+20
mu          -1.333273e+21 -5.648459e+20
format      -4.780181e+19  2.397271e+19
recommended  8.694375e+20  1.358602e+21
arguing     -4.903531e+19  4.734511e+20
or          -3.658189e+19 -1.088200e+20
above        1.126082e+19 -4.933230e+19

散点图

我喜欢matplotlib的面向对象方法,因此开始时有所不同。
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

ax.scatter(df['x'], df['y'])

最后,annotate方法将标注坐标。前两个参数是文本标签和2元组。使用iterrows(),可以非常简洁:
for word, pos in df.iterrows():
    ax.annotate(word, pos)

[感谢里卡多对此建议的评论。]

然后执行plt.show()fig.savefig()。根据您的数据,您可能不得不弄混ax.set_xlimax.set_ylim才能看到密集的云。这是新闻组示例,无需进行任何调整:

scatterplot

您也可以修改点的大小,颜色等。祝您微调愉快!

关于scikit-learn - 可视化从gensim生成的word2vec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43776572/

相关文章:

python - 排序后的数据未绘制在正确的数据点中

matplotlib - 如何在 seaborn 线图中使用自定义误差线

python - 如何在 python 中使用 gensim 和 word2vec 查找语义相似性

python - Gensim LdaMulticore 没有正确地进行多处理(仅使用 4 个 worker )

scikit-learn - 属性错误: 'KMeans' object has no attribute 'inertia_'

python - 为什么 r2_score 在 train_test_split 和 pipeline cross_val_score 之间有很大不同?

python - Scipy/Numpy/scikits - 基于两个数组计算精度/召回分数

matlab - 按 2 个变量分组,一个变量具有独特的颜色,另一个变量具有独特的形状

R:将 "vline"和 "hline"语句组合在一起(ggplot2)

wikipedia - 使用在维基百科上预先训练的 Word2Vec 模型