问题描述
我试图通过使用电影评论的公共数据集来熟悉doc2vec的结果。我已经清理了数据并运行模型。如您在下面看到的,有6个标签/类型。每个都是带有向量表示的文档。
soup = BeautifulSoup(page.content,'lxml')
“浪漫”和“喜剧”相当相似,而“动作”和“科幻”与“浪漫”相比则完全不同。到现在为止还挺好。但是,为了使结果可视化,我需要减小向量维数。因此,我先尝试t-SNE,然后再尝试PCA。这是代码和结果:
doc_tags = list(doc2vec_model.docvecs.doctags.keys())
print(doc_tags)
X = doc2vec_model[doc_tags]
print(X)
['animation','fantasy','comedy','action','romance','sci-fi']
[[ -0.6630892 0.20754902 0.2949621 0.622197 0.15592825]
[ -1.0809666 0.64607996 0.3626246 0.9261689 0.31883526]
[ -2.3482993 2.410015 0.86162883 3.0468733 -0.3903969 ]
[ -1.7452248 0.25237766 0.6007084 2.2371168 0.9400951 ]
[ -1.9570891 1.3037877 -0.24805197 1.6109428 -0.3572465 ]
[-15.548988 -4.129228 3.608777 -0.10240117 3.2107658 ]]
print(doc2vec_model.docvecs.most_similar('romance'))
[('comedy',0.6839742660522461),('animation',0.6497607827186584),('fantasy',0.5627620220184326),('sci-fi',0.14199887216091156),('action',0.046558648347854614)]
出了点问题。当我可视化结果时,这一点更加明显:
TSNE:
PCA:
这显然不是模型产生的。我确信我缺少一些基本知识。如果您有任何建议,将不胜感激。
解决方法
-
t-SNE 嵌入:认为嵌入空间中的点(或簇)之间的距离与原始空间中的距离成比例是一个常见的错误。这是t-SNE的主要缺点,有关更多信息,请参见here。因此,您不应从可视化中得出任何结论。
-
PCA 嵌入:PCA对应于将坐标系统旋转到新的正交坐标系中,该坐标系最佳地描述了数据的方差。当保留所有主成分时,(欧几里得)距离被保留,但是当减小尺寸时(例如到2D),这些点将以最大的方差投影到轴上,并且该距离可能不再与原始距离相对应。同样,很难得出关于原始空间中的点与嵌入之间的距离的结论。
首先,按照这种可视化的要求,在进行2D投影时,您总是会失去全尺寸模型的某些品质。您只是希望-并尝试选择适当的方法/参数-保留重要方面。因此,当特定的可视化效果令人失望时,不一定有任何“错误”。
尤其是像word2vec / doc2vec这样的高维“密集嵌入”,完整嵌入中的 way 信息比2D投影中显示的要多。您可能会在这样的情节中看到一些明智的微观关系-在一些地方的近邻符合预期-但是,整体的“地图”将无法像真正的2D曲面的真实地图那样被解释。 >
但是:看起来您正在创建一个只有6个文档标签的30维Doc2Vec
模型。由于Doc2Vec
的工作方式,如果只有5个唯一标签,则基本上是在只对5个虚拟文档进行培训的情况下,将它们切成不同的片段。好像您已将所有“喜剧”评论合并到一个大文档中,而所有“浪漫”评论都一样,等等。
对于Doc2Vec
的许多用途,尤其是在介绍了基础“段落矢量”算法的已发表论文中,更典型的是将每个文档的唯一ID用作其“标签”,尤其是由于许多下游用途那么每个文档都需要一个文档载体,而不是每个已知类别。这样可以更好地保存/建模原始数据中的信息,而将所有内容折叠成6个大型文档和6个摘要标记向量,则可以使用更简单的隐式类别形状。
请注意,如果将唯一的ID用作标签,则不会自动从每个类别中获得一个摘要标签矢量,您可以从模型中读取每个类别的摘要标签矢量。但是,您可以合成这样的向量,也许只需将某个类别中所有文档的向量平均即可得到该类别的质心。
有时,将已知标签用作文档标签有时还是很有价值的,它们可以代替唯一ID(如您在此处所做的那样),或者作为唯一ID的补充(使用不止一个{ {1}}(每个培训文档)。
但是您应该知道使用已知标签,并且只能使用已知标签,因为标签可能会受到限制。 (例如,如果您改为为每个文档训练一个单独的矢量,则可以通过可视化来绘制文档,并用已知标签为圆点上色,并查看哪些类别往往具有较大的重叠,并突出显示某些类别的数据点挑战类别,或者在其他类别中拥有最近的邻居。