如何在 pyspark 的 TF-IDF 数据帧上应用 SVD

How to apply SVD on TF-IDF Dataframe in pyspark

我应用了 pyspark tf-idf 函数并得到了以下结果。

| features |
|----------|
| (35,[7,9,11,12,19,26,33],[1.2039728043259361,1.2039728043259361,1.2039728043259361,1.6094379124341003,1.6094379124341003,1.6094379124341003,1.6094379124341003])  |
| (35,[0,2,4,5,6,11,22],[0.9162907318741551,0.9162907318741551,1.2039728043259361,1.2039728043259361,1.2039728043259361,1.2039728043259361,1.6094379124341003]) |

所以一个数据框有 1 列(特征),其中包含 SparseVectors 作为行。

现在我想从这个数据框构建 IndexRowMatrix,这样我就可以 运行 这里描述的 svd 函数 https://spark.apache.org/docs/latest/api/python/pyspark.mllib.html?highlight=svd#pyspark.mllib.linalg.distributed.IndexedRowMatrix.computeSVD

我尝试了以下但没有成功:

mat = RowMatrix(tfidfData.rdd.map(lambda x: x.features))

TypeError: Cannot convert type <class 'pyspark.ml.linalg.SparseVector'> into Vector

我使用 RowMatrix 是因为构建它时我不必提供元组,但我什至无法构建 RowMatrix。 IndexedRowMatrix 对我来说会更难。

那么如何运行 pyspark 中 tf-idf 数据帧输出的 IndexedRowMatrix?

我能解决。 因此,由于错误提示 RowMatrix 不会接受 pyspark.ml.linalg.SparseVector 向量,因此我将此向量转换为 pyspark.mllib.linalg 注意 mlmllib。下面是将 TF-IDF 输出转换为 RowMatrix 的代码片段,您可以在其上应用 computeSVD 方法。

from pyspark.mllib.linalg import Vectors
mat = RowMatrix(df.rdd.map(lambda v: Vectors.dense(v.rawFeatures.toArray()) ))

我已转换为密集矩阵,但您可以编写一些额外的代码行将 ml.linalg.SparseVector 转换为 mllib.linalg.SparseVector

请原谅我没有在原始答案中发表评论,我还没有必要的声望点。为了加快速度,创建一个 mllib.linalg.SparseVector 是有益的。如果做如下修改就真的很简单了:

from pyspark.mllib.linalg import Vectors
mat = RowMatrix(df.rdd.map(lambda v: Vectors.fromML(v.rawFeatures)))