0

我已经成功地使用Gensim的word2vec库创建了一个矢量模型。相关矢量之间的距离很好(也就是说,从人类的角度来看,派生的相似度是有意义的)。显然随机矢量绘图:TSNE

但是,试图将这些向量映射到图上已经证明具有挑战性。当然,矢量的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() 

但是,与矢量由此而来点似乎是基本上是随机的 - 有只是一对夫妇的异常值的一个巨大的集群。

math py graph

在一个典型的例子:注意最近邻居 “幻觉” 在集群

vectors

的边缘但实际矢量返回的USNG model.most_similar()是

[('agitated',0.7707732319831848),('restless',0.740711510181427), ('disorientated',0 ('困惑',0.6573441624641418),('累犯',0.6566967964172363),('困', 0.7215688228607178),('aggressive',0.71 69249057769775),('昏昏欲睡',0.6654224395751953) ,0.6562871932983398),(“摇”, 0.6419488191604614)

我可以开始什么方式来处理这个尝试,使输出更理智?

+0

阅读文档并处理所有这些参数。当然,这样一个困难的任务可能需要微调。 – sascha

+0

“wvs”的形状是什么?你为什么跳过TSNE的第一个100('wvs [100 ::]')? –

+0

@ImanolLuengo尺寸显然是(6708 * 100)。跳过只是为了测试的目的,我会把它从引用的代码 – Stumbler

回答

2

绝对阅读@MattiLyra链接的文章。除了基于我所知的内容(没有看到实际数据)之外,您可能需要增加n_iter参数。通常1000次迭代不会将您带入静态。此外,您可能还想玩method参数。为sklearn.manifold.TSNE文档状态:

“默认梯度计算算法使用为O运行(NlogN)时间方法巴恩斯小屋近似=‘精确’将上运行速度较慢,但​​确切的说,算法在O( N^2)时间,当最近邻误差需要优于3%时,应使用精确算法,但确切的方法不能缩放到数百万个例子。

如果将方法更改为'精确',则可以使用参数n_iter_without_progress,基本上允许模型找到静态点。