如何在 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
注意 ml
和 mllib
。下面是将 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)))
我应用了 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
注意 ml
和 mllib
。下面是将 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)))