2016-10-27 51 views
2

我有一个数据集,其中包含约30k个独特文档,因为它们中包含特定关键字,所以被标记。数据集中的一些关键字段是文档标题,文件大小,关键字和摘录(围绕关键字50个字)。这些〜30k独特文档中的每一个文档都有多个关键字,每个文档在每个关键字的数据集中都有一行(因此,每个文档都有多行)。这是在把原始数据的重点领域可能是什么样子的样本:Pyspark - 总和多个稀疏向量(CountVectorizer输出)

Raw Data Example

我的目标是建立一个模型,对于某些出现次数(儿童抱怨功课,等等),所以我的标志文件需要对关键字和摘录字段进行矢量化处理,然后将其压缩,以便每个独特文档都有一行。

仅使用关键字作为我正在尝试做的一个例子 - 我应用了Tokenizer,StopWordsRemover和CountVectorizer,然后它会输出一个带有计数向量化结果的稀疏矩阵。一个稀疏向量可能看起来像:斯帕塞夫克托(158,{7:1.0,65:1.0,78:2.0,110:1.0,155:3.0})

我想做的两两件事之一:

  1. 转换的稀疏矢量致密矢量,那么我可以GROUPBY的docID和总结每个柱(一个柱=一个令牌)
  2. 横跨稀疏矢量直接求和(被docID分组)

为了给出你了解我的意思 - 在下面的图像左边是所需的密集矢量表示CountVectorizer的输出和左边是我想要的最终数据集。

CountVectorizer Output & Desired Dataset

回答

1

我会尝试:

>>> from pyspark.ml.linalg import SparseVector, DenseVector 
>>> 
>>> df = sc.parallelize([ 
...  (1, SparseVector(158, {7: 1.0, 65: 1.0, 78: 2.0, 110: 1.0, 155: 3.0})), 
...  (1, SparseVector(158, {99: 100.0})), 
...  (2, SparseVector(158, {1: 1.0})), 
... ]).toDF(["docId", "features"]) 
>>> df.rdd.mapValues(lambda v: v.toArray()) \ 
...  .reduceByKey(lambda x, y: x + y) \ 
...  .mapValues(lambda x: DenseVector(x)) \ 
...  .toDF(["docId", "features"]) 
+0

谢谢!据我所知,大多数机器学习函数(支持向量机,逻辑回归等)接受密集向量作为输入 - 正确吗?换句话说,我不必解析密集向量来为每个令牌创建一列。 –

+0

矢量,(稀疏或密集)。 –