从Google新闻矢量数据集中减少word2vec维度

时间:2017-12-15 19:25:12

标签: python-3.x gensim

我加载了谷歌的新闻向量-300数据集。每个单词用300点向量表示。我想在我的神经网络中使用它进行分类。但300个单词似乎太大了。如何在不影响质量的情况下将矢量从300减少到100。

2 个答案:

答案 0 :(得分:1)

tl; dr使用降维技术,例如PCA或t-SNE。

这不是您尝试的琐碎操作。为了理解原因,您必须了解这些单词向量是什么。

单词嵌入是试图对有关单词含义,如何使用以及更多信息的信息进行编码的向量。使他们感到有趣的是,他们设法将所有这些信息存储为浮点数的集合,这非常适合与处理单词的模型进行交互。与其将单词本身传递给模型,而没有任何含义,使用方法等的指示,我们可以向模型传递单词向量,以提供有关自然语言如何工作的更多信息。

正如我希望我已经明确指出的那样,单词嵌入非常整洁。构建它们是一个活跃的研究领域,尽管有两种方法可以产生有趣的结果。尽管我建议您检查一下所有不同的方法,但对这个问题的理解并不是非常重要。相反,您真正需要知道的是,在某种意义上,与某个单词相关联的300维向量中的每个值都经过“优化”,以捕获该单词的含义和用法的不同方面。换句话说,这300个值中的每一个都对应于该单词的某些抽象 feature 。随机删除这些值的任何组合将产生一个矢量,该矢量可能缺少有关该单词的重要信息,并且可能不再充当该单词的良好表示形式。

因此,选择向量的前100个值是不好的。我们需要一种更原则的方式来减少尺寸。您真正想要的是对这些值的一个子集进行采样,以使有关单词的尽可能多的信息保留在结果向量中。这就是降维技术(例如主成分分析(PCA)或t分布随机邻居嵌入(t-SNE))发挥作用的地方。我不会详细描述这些方法的工作原理,但是从本质上讲,它们旨在捕获信息集合的本质,同时减小描述所述信息的向量的大小。例如,PCA通过从旧的向量构造一个新的向量来做到这一点,其中新向量中的条目对应于旧向量的主要“组成部分”的组合,即占这些组成部分中大多数品种的那些组成部分旧数据。

总而言之,您应该在词向量上运行降维算法,例如PCA或t-SNE。有许多实现这两种功能的python库(例如scipy具有PCA算法)。但是请注意,这些词向量的维数已经相对较低。要了解这是怎么回事,请考虑通过单点编码天真地表示一个单词的任务(一个点一个,另一个点零)。如果您的词汇量与Google word2vec模型一样大,那么每个单词都会突然与包含数十万个条目的向量相关联!如您所见,维数已经大大降低到300,而使向量显着减小的任何降低都可能会丢失大量信息。

答案 1 :(得分:-1)

@narasimman我建议您只在word2vec模型的输出向量中保留前100个数字。输出的类型为numpy.ndarray,因此您可以执行以下操作:

>>> word_vectors = KeyedVectors.load_word2vec_format('modelConfig/GoogleNews-vectors-negative300.bin', binary=True)
>>> type(word_vectors["hello"])
<type 'numpy.ndarray'>
>>> word_vectors["hello"][:10]
array([-0.05419922,  0.01708984, -0.00527954,  0.33203125, -0.25      ,
       -0.01397705, -0.15039062, -0.265625  ,  0.01647949,  0.3828125 ], dtype=float32)
>>> word_vectors["hello"][:2]
array([-0.05419922,  0.01708984], dtype=float32)

如果你对所有的话都这样做,我不认为这会搞砸结果(虽然不确定!)