我有一个包含DocID,WordID和频率(计数)的数据集,如下所示。 请注意,前三个数字代表1.文件数量,2 词汇表中的单词数量和3.集合中单词的总数。
189
1430
12300
1 2 1
1 39 1
1 42 3
1 77 1
1 95 1
1 96 1
2 105 1
2 108 1
3 133 3
我想要做的是读取数据(忽略前三行),合并每个文档的单词,最后将每个文档表示为包含wordID频率的向量。
基于上述数据集,文档1,2和3的表示将是(注意vocab_size
可以通过数据的第二行提取):
val data = Array(
Vectors.sparse(vocab_size, Seq((2, 1.0), (39, 1.0), (42, 3.0), (77, 1.0), (95, 1.0), (96, 1.0))),
Vectors.sparse(vocab_size, Seq((105, 1.0), (108, 1.0))),
Vectors.sparse(vocab_size, Seq((133, 3.0))))
问题是我不太确定如何将.txt.gz
文件作为RDD读取并创建如上所述的稀疏向量数组。请注意,我实际上想要在PCA变换器中传递data
数组。
答案 0 :(得分:1)
这样的事情可以解决问题:
sc.textFile("path/to/file").flatMap(r => r.split(' ') match {
case Array(doc, word, freq) => Some((doc.toInt, (word.toInt, freq.toDouble)))
case _ => None
}).groupByKey().mapValues(a => Vectors.sparse(vocab_size, a.toSeq))
请注意,groupByKey
方法会将每个文档的所有键加载到内存中,因此您可能希望使用其变体之一reduceByKey
或aggregateByKey
(我希望,但是我不知道你在稀疏向量上的方法,尽管你可能有一些东西要将它们合并在一起。)