我使用Gensim的word2vec库成功创建了一个矢量模型。相关矢量之间的距离很好(也就是说,从人的角度来看,派生的相似性是有意义的)。
然而,尝试将这些向量映射到图表已证明具有挑战性。当然,需要减少向量的N维以便能够绘图:为此我使用了TSNE。
import gensim, logging, os
import codecs
import numpy as np
import matplotlib.pyplot as plt
import gensim, logging, os
from sklearn.manifold import TSNE
wvs = model.syn1neg
vocabulary = model.wv.vocab
tsne = TSNE(n_components=2, random_state=0)
np.set_printoptions(suppress=True)
Y = tsne.fit_transform(wvs[::])
plt.scatter(Y[:, 0], Y[:, 1])
for label, x, y in zip(vocabulary, Y[:, 0], Y[:, 1]):
plt.annotate(label, xy=(x, y), xytext=(0, 0), textcoords='offset points')
plt.show()
然而,与矢量相关的结果点看起来基本上是随机的 - 只有一个巨大的集群有几个异常值。
一个恰当的例子:注意在群集边缘“幻觉”的最近邻居
但是实际的向量返回了模型.most_similar()是
[('agitated',0.7707732319831848),('restless',0.740711510181427), ('迷失',0.7242116332054138),('迷茫', 0.7215688228607178),( '攻击性',0.71 69249057769775),( '昏昏欲睡',0.6654224395751953),( '含泪',0.6573441624641418),( 'aggitated',0.6566967964172363),( '困',0.6562871932983398),( '摇动', 0.6419488191604614)]
我可以采用哪种方式来尝试使输出更合理?
答案 0 :(得分:2)
绝对阅读@MattiLyra链接的文章。除此之外,基于我所知道的(没有看到实际数据),您可能希望稍微增加n_iter
参数。通常1000次迭代不会使您进入静态状态。此外,您可能还想使用method
参数。 sklearn.manifold.TSNE
州的文档:
“默认情况下,梯度计算算法使用在O(NlogN)时间运行的Barnes-Hut近似。方法='精确'将在O(N ^ 2)时间内运行较慢但精确的算法。精确算法当最近邻误差需要优于3%时应该使用。但是,确切的方法不能扩展到数百万个例子。“
如果将方法更改为“确切”,则可以使用n_iter_without_progress
参数,并且基本上允许模型找到静态点。