为啥 mllib word2vec 词向量只有 100 个元素?

Posted

技术标签:

【中文标题】为啥 mllib word2vec 词向量只有 100 个元素?【英文标题】:Why do mllib word2vec word vectors only have 100 elements?为什么 mllib word2vec 词向量只有 100 个元素? 【发布时间】:2016-08-23 20:02:32 【问题描述】:

我有一个在 PySpark 中创建的 word2vec 模型。模型保存为 .parquet 文件。我希望能够使用 vanilla Python 访问和查询模型(或单词和词向量),因为我正在构建一个烧瓶应用程序,它允许用户输入感兴趣的词以查找同义词。

我已经提取了单词和单词向量,但我注意到虽然我有大约 7000 个唯一单词,但我的单词向量的长度为 100。例如,这里有两个单词“serious”和“breaks” .它们的向量只有 100 的长度。这是为什么呢?然后它如何能够重建整个向量空间,每个单词只有 100 个值?它只是只给我前 100 个或前 100 个值吗?

    vectors.take(2)
    Out[48]: 
    [Row(word=u'serious', vector=DenseVector([0.0784, -0.0882, -0.0342, -0.0153, 0.0223, 0.1034, 0.1218, -0.0814, -0.0198, -0.0325, -0.1024, -0.2412, -0.0704, -0.1575, 0.0342, -0.1447, -0.1687, 0.0673, 0.1248, 0.0623, -0.0078, -0.0813, 0.0953, -0.0213, 0.0031, 0.0773, -0.0246, -0.0822, -0.0252, -0.0274, -0.0288, 0.0403, -0.0419, -0.1122, -0.0397, 0.0186, -0.0038, 0.1279, -0.0123, 0.0091, 0.0065, 0.0884, 0.0899, -0.0479, 0.0328, 0.0171, -0.0962, 0.0753, -0.187, 0.034, -0.1393, -0.0575, -0.019, 0.0151, -0.0205, 0.0667, 0.0762, -0.0365, -0.025, -0.184, -0.0118, -0.0964, 0.1744, 0.0563, -0.0413, -0.054, -0.1764, -0.087, 0.0747, -0.022, 0.0778, -0.0014, -0.1313, -0.1133, -0.0669, 0.0007, -0.0378, -0.1093, -0.0732, 0.1494, -0.0815, -0.0137, 0.1009, -0.0057, 0.0195, 0.0085, 0.025, 0.0064, 0.0076, 0.0676, 0.1663, -0.0078, 0.0278, 0.0519, -0.0615, -0.0833, 0.0643, 0.0032, -0.0882, 0.1033])),
     Row(word=u'breaks', vector=DenseVector([0.0065, 0.0027, -0.0121, 0.0296, -0.0467, 0.0297, 0.0499, 0.0843, 0.1027, 0.0179, -0.014, 0.0586, 0.06, 0.0534, 0.0391, -0.0098, -0.0266, -0.0422, 0.0188, 0.0065, -0.0309, 0.0038, -0.0458, -0.0252, 0.0428, 0.0046, -0.065, -0.0822, -0.0555, -0.0248, -0.0288, -0.0016, 0.0334, -0.0028, -0.0718, -0.0571, -0.0668, -0.0073, 0.0658, -0.0732, 0.0976, -0.0255, -0.0712, 0.0899, 0.0065, -0.04, 0.0964, 0.0356, 0.0142, 0.0857, 0.0669, -0.038, -0.0728, -0.0446, 0.1194, -0.056, 0.1022, 0.0459, -0.0343, -0.0861, -0.0943, -0.0435, -0.0573, 0.0229, 0.0368, 0.085, -0.0218, -0.0623, 0.0502, -0.0645, 0.0247, -0.0371, -0.0785, 0.0371, -0.0047, 0.0012, 0.0214, 0.0669, 0.049, -0.0294, -0.0272, 0.0642, -0.006, -0.0804, -0.06, 0.0719, -0.0109, -0.0272, -0.0366, 0.0041, 0.0556, 0.0108, 0.0624, 0.0134, -0.0094, 0.0219, 0.0164, -0.0545, -0.0055, -0.0193]))]

对于在 vanilla python 中重建此模型的最佳方法有什么想法吗?

【问题讨论】:

向量的长度为 100,因为这是默认模型参数,您最喜欢的参数没有更改。 哦...当然。谢谢。 【参考方案1】:

只是为了改进 zero323 的评论,对于其他到达这里的人。 Word2Vec 有一个默认设置来创建 100dims 的词向量。要改变这一点:

model = Word2Vec(sentences, size=300)

初始化模型时将创建 300 维的向量。

【讨论】:

【参考方案2】:

我认为问题在于 Word2Vec 模型的 minCount 参数值。 如果这个值太高,模型训练中使用的词就会减少,导致词向量只有 100 个。 7000 个独特的单词并不是很多。 尝试将 minCount 设置为低于默认值 5。

model.setMinCount(value)

https://spark.apache.org/docs/latest/api/python/pyspark.ml.html?highlight=word2vec#pyspark.ml.feature.Word2Vec

【讨论】:

这是错误的——正确答案是上面 zero323 的评论

以上是关于为啥 mllib word2vec 词向量只有 100 个元素?的主要内容,如果未能解决你的问题,请参考以下文章

word2vec:主要概念和流程

word2vec是如何得到词向量的

使用word2vec计算词向量之间的相似度

怎样用word2vec来得到某几个词的向量表示

word2vec词向量加权的方法都有哪些?

python gensim使用word2vec词向量处理英文语料