我加载了google的新闻向量-300数据集。每个单词都用一个300点的向量表示。我想在我的神经网络中使用它来进行分类。但是一个词300个似乎太大了。我如何才能在不影响质量的情况下将向量从300减少到100。
发布于 2018-07-29 22:14:05
tl;dr使用像PCA或t-SNE这样的降维技术。
这不是您正在尝试的微不足道的操作。为了理解其中的原因,您必须了解这些词向量是什么。
单词嵌入是尝试对有关单词含义、如何使用等信息进行编码的向量。有趣的是,它们设法将所有这些信息存储为浮点数的集合,这对于与处理单词的模型交互很好。我们可以向模型传递一个单词向量,目的是提供有关自然语言如何工作的额外信息,而不是将单词本身传递给模型,而不是在没有任何指示的情况下传递它的含义、如何使用它等。
我希望我已经说清楚了,单词嵌入是相当整洁的。构建它们是一个活跃的研究领域,尽管有几种方法可以产生有趣的结果。对于这个问题,理解所有不同的方法并不是特别重要,尽管我建议您查看它们。相反,您真正需要知道的是,与单词关联的300维向量中的每个值在某种意义上都是“优化的”,以捕获该单词的含义和用法的不同方面。换句话说,300个值中的每个值都对应于单词的某个抽象特征。随机删除这些值的任何组合将产生一个矢量,该矢量可能缺乏关于该单词的重要信息,并且可能不再用作该单词的良好表示。
所以,选择向量的前100个值是不好的。我们需要一种更有原则的方法来降低维数。您真正想要的是对这些值的子集进行采样,以便在结果向量中保留有关单词的尽可能多的信息。这就是像主成分分析(PCA)或t分布随机邻居嵌入(t-SNE)这样的降维技术发挥作用的地方。我不会详细描述这些方法是如何工作的,但本质上它们的目标是捕获信息集合的本质,同时减少描述所述信息的向量的大小。例如,PCA通过从旧向量构造一个新向量来实现这一点,其中新向量中的条目对应于旧向量的主要“分量”的组合,即占旧数据中变化最多的那些分量。
总而言之,你应该在你的词向量上运行像PCA或t-SNE这样的降维算法。有许多python库可以同时实现这两个库(例如,scipy有一个PCA算法)。然而,需要注意的是,这些词向量的维数已经相对较低。要了解这是如何实现的,请考虑一个简单的任务,即通过one-hot编码来表示一个单词(1在一个点,其他地方都是零)。如果您的词汇量与谷歌word2vec模型一样大,那么每个单词就会突然与一个包含数十万个条目的向量相关联!正如您所看到的,维度已经显著降低到300,任何使向量显著变小的降维都可能会丢失大量信息。
发布于 2017-12-18 21:39:17
@narasimman我建议您简单地将前100个数字保留在word2vec模型的输出向量中。输出的类型为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)我不认为这会把结果搞砸,如果你对所有的单词都这样做的话(虽然不确定!)
https://stackoverflow.com/questions/47838719
复制相似问题