2017-09-20 8 views
1

ich die pyspark TF-IDF-Funktionen angewendet haben und die folgenden Ergebnisse zurück.Wie SVD auf TF-IDF Datenrahmen in pyspark anwenden

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

Also ein Datenrahmen mit 1 Spalte (Features), die SparseVectors als Zeilen enthält.

Jetzt möchte ich die IndexRowMatrix von diesem Datenrahmen bauen, so dass ich die SVD-Funktion ausführen können, die hier beschrieben wird, über https://spark.apache.org/docs/latest/api/python/pyspark.mllib.html?highlight=svd#pyspark.mllib.linalg.distributed.IndexedRowMatrix.computeSVD

Ich habe versucht, die folgenden aber hat nicht funktioniert:

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

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

Ich habe RowMatrix benutzt, weil ich kein Tupel erstellen muss, um es zu konstruieren, aber ich kann nicht einmal RowMatrix bauen. IndexedRowMatrix wird für mich schwieriger sein.

So wie die IndexedRowMatrix auf dem setzen von tf-idf Datenrahmen in pyspark heraus laufen?

Antwort

2

Ich bin in der Lage, es zu lösen. Um Fehler vorgeschlagen, dass RowMatrix nicht pyspark.ml.linalg.SparseVector Vektor akzeptieren, also ich konvertiert diesen Vektor in pyspark.mllib.linalg Achten Sie auf ml und mllib. Nun ist das folgende Code-Snippet, das die TF-IDF-Ausgabe in RowMatrix konvertiert und Sie die computeSVD-Methode darauf anwenden.

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

Ich habe Dense Matrix umgewandelt, aber Sie können einige zusätzliche Zeilen Code schreiben ml.linalg.SparseVector in mllib.linalg.SparseVector

zu konvertieren