Ich versuche, LDA auf Wikipedia XML-Dump durchzuführen. Nachdem ich eine RDD von unformatiertem Text bekommen habe, erstelle ich einen Datenrahmen und transformiere ihn durch Tokenizer, StopWords und CountVectorizer Pipelines. Ich beabsichtige, die RDD von Vectors output von CountVectorizer zu OnlineLDA in MLLib zu übergeben. Hier ist mein Code:Konvertieren JavaRDD <Row> zu JavaRDD <Vector>
// Configure an ML pipeline
RegexTokenizer tokenizer = new RegexTokenizer()
.setInputCol("text")
.setOutputCol("words");
StopWordsRemover remover = new StopWordsRemover()
.setInputCol("words")
.setOutputCol("filtered");
CountVectorizer cv = new CountVectorizer()
.setVocabSize(vocabSize)
.setInputCol("filtered")
.setOutputCol("features");
Pipeline pipeline = new Pipeline()
.setStages(new PipelineStage[] {tokenizer, remover, cv});
// Fit the pipeline to train documents.
PipelineModel model = pipeline.fit(fileDF);
JavaRDD<Vector> countVectors = model.transform(fileDF)
.select("features").toJavaRDD()
.map(new Function<Row, Vector>() {
public Vector call(Row row) throws Exception {
Object[] arr = row.getList(0).toArray();
double[] features = new double[arr.length];
int i = 0;
for(Object obj : arr){
features[i++] = (double)obj;
}
return Vectors.dense(features);
}
});
ich die Klasse Guss Ausnahme bekommen, weil der Linie
Object[] arr = row.getList(0).toArray();
Caused by: java.lang.ClassCastException: org.apache.spark.mllib.linalg.SparseVector cannot be cast to scala.collection.Seq
at org.apache.spark.sql.Row$class.getSeq(Row.scala:278)
at org.apache.spark.sql.catalyst.expressions.GenericRow.getSeq(rows.scala:192)
at org.apache.spark.sql.Row$class.getList(Row.scala:286)
at org.apache.spark.sql.catalyst.expressions.GenericRow.getList(rows.scala:192)
at xmlProcess.ParseXML$2.call(ParseXML.java:142)
at xmlProcess.ParseXML$2.call(ParseXML.java:1)
ich die Scala Syntax gefunden here, dies zu tun, konnte aber kein Beispiel finden, es zu tun in Java. Ich habe versucht row.getAs[Vector](0)
, aber das ist nur Scala-Syntax. Irgendwelche Möglichkeiten, es in Java zu tun?