pyspark-sum覆盖多个稀疏向量(countvectorizer输出)

dluptydi  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(493)

我有一个数据集,其中有大约30k个唯一的文档被标记,因为它们中有特定的关键字。数据集中的一些关键字段包括文档标题、文件大小、关键字和摘录(关键字周围有50个单词)。这些~30k个唯一文档中的每个文档都有多个关键字,并且每个文档在每个关键字的数据集中都有一行(因此,每个文档都有多行)。以下是原始数据集中关键字段的示例:
原始数据示例
我的目标是建立一个模型,为某些事件(孩子抱怨作业等)标记文档,所以我需要矢量化关键字和摘录字段,然后将它们压缩,这样每个唯一的文档就有一行。
仅使用关键字作为我尝试执行的示例-我应用了tokenizer、stopwordsremover和countvectorizer,然后它们将输出带有count矢量化结果的稀疏矩阵。一个稀疏向量可能看起来像:sparsevector(158,{7:1.0,65:1.0,78:2.0,110:1.0,155:3.0})
我想做两件事之一:
将稀疏向量转换为密集向量,然后我可以按docid分组并对每列求和(一列=一个标记)
跨稀疏向量直接求和(按docid分组)
为了让你了解我的意思-在下面图片的左边是countvectorizer输出所需的密集向量表示,左边是我想要的最终数据集。
countvectorizer输出和所需数据集

mm9b1k5b

mm9b1k5b1#

我会尝试:

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

相关问题