python - Pyspark - 对多个稀疏向量求和(CountVectorizer 输出)

标签 python apache-spark pyspark tf-idf countvectorizer

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

Raw Data Example

我的目标是建立一个模型来标记某些事件( child 提示家庭作业等)的文档,因此我需要对关键字和摘录字段进行矢量化,然后将它们压缩,这样我们每个独特的文档都有一行。

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

我想做以下两件事之一:

  1. 将稀疏向量转换为密集向量,然后我可以按 docID 分组并对每一列求和(一列 = 一个标记)
  2. 直接对稀疏向量求和(按 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"])

关于python - Pyspark - 对多个稀疏向量求和(CountVectorizer 输出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40286966/

相关文章:

apache-spark - 聚合一列,但显示选择中的所有列

apache-spark - 如何使用 Pyspark 中的 withColumn 从一个条件创建多个列?

apache-spark - pyspark.sql.utils.IllegalArgumentException : u'Field "features" does not exist. '

Python:如何在特定索引位置获取数组的值?

python - 在 POST 响应中发送 OpenCV 图像

python - Django 错误 : render_to_response() got an unexpected keyword argument 'context_instance'

python - 扩展 Python 列表 "inline"

apache-spark - 为什么我无法加载 PySpark RandomForestClassifier 模型?

scala - Spark 异常与 java.lang.ClassNotFoundException : de. unkrig.jdisasm.Disassembler

python - 我如何遍历 "pyspark"中的列表列表以获得特定结果