python – Pyspark – 多个稀疏向量的和(CountVectorizer输出)

我有一个包含大约30,000个独特文档的数据集,因为它们中有一个特定的关键字.数据集中的一些关键字段是文档标题,文件大小,关键字和摘录(关键字周围50个字).这些~30k个独特文档中的每一个都有多个关键字,每个文档在每个关键字的数据集中都有一行(因此,每个文档都有多行).以下是原始数据集中关键字段的示例:

Raw Data Example

我的目标是建立一个模型来标记某些出现的文件(孩子抱怨家庭作业等),所以我需要对关键字和摘录字段进行矢量化,然后将它们压缩,这样我们每个唯一文档都有一行.

仅使用关键字作为我正在尝试的示例 – 我应用了Tokenizer,StopWordsRemover和CountVectorizer,然后将输出带有计数向量化结果的稀疏矩阵.一个稀疏向量可能类似于:sparseVector(158,{7:1.0,65:1.0,78:2.0,110:1.0,155:3.0})

我想做两件事之一:

>将稀疏向量转换为密集向量,然后我可以通过docID组合并总结每列(一列=一个标记)
>直接对稀疏向量求和(按docID分组)

为了让您了解我的意思 – 在下图的左侧是CountVectorizer输出的所需密集矢量表示,左侧是我想要的最终数据集.

CountVectorizer Output & Desired Dataset

最佳答案 我会尝试:

>>> 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"])
点赞