java - Spark MLlib - 将字符串转换为 TF-IDF LabeledPoint RDD
java - Spark MLlib - Transforming Strings to TF-IDF LabeledPoint RDDs
我正在尝试使用 Spark MLlib 实现一个简单的 SVM 分类算法。
我有一堆字符串及其标签,现在我想对它们执行 TF-IDF,并将结果提供给 SVM 算法。
所以我正在寻找的是从 String -> LabeledPoint 的转换
中间有 TF-IDF 步骤。
我按照这个例子:
http://spark.apache.org/docs/latest/mllib-feature-extraction.html#tf-idf
它不起作用,因为 transform() 不适用于 RDD,而是适用于 Dataframes。
所以我遵循了这个教程:
https://spark.apache.org/docs/latest/ml-features.html#tf-idf-hashingtf-and-idf
效果很好。但是现在我被 Dataframe 困住了,不知道如何将它转换为 JavaRDD。
我试过这个scala解决方案
但它不起作用,因为我正在使用 java。
我试过这个
Spark MLLib TFIDF implementation for LogisticRegression
但 suprise transform() 不适用于 JavaRDD。
所以这是我从教程中得到的代码。我就像只是在寻找把问号放在哪里的功能....
JavaRDD<Row> jrdd = documents.map(f -> RowFactory.create(0, f.getText()));
StructType schema = new StructType(new StructField[]{
new StructField("label", DataTypes.DoubleType, false, Metadata.empty()),
new StructField("sentence", DataTypes.StringType, false, Metadata.empty())
});
SQLContext sqlContext = new SQLContext(sc);
DataFrame sentenceData = sqlContext.createDataFrame(jrdd, schema);
Tokenizer tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words");
DataFrame wordsData = tokenizer.transform(sentenceData);
int numFeatures = 20;
HashingTF hashingTF = new HashingTF()
.setInputCol("words")
.setOutputCol("rawFeatures")
.setNumFeatures(numFeatures);
DataFrame featurizedData = hashingTF.transform(wordsData);
IDF idf = new IDF().setInputCol("rawFeatures").setOutputCol("features");
IDFModel idfModel = idf.fit(featurizedData);
DataFrame rescaledData = idfModel.transform(featurizedData);
JavaRDD<LabeledPoint> labeled = rescaledData.map(????????????????????????);
那我做错了什么?我怎样才能做到这一点?我快疯了。
提前致谢。
我通过以下方式解决了这个问题。很简单,只是需要一些。
JavaRDD<Row> jrdd = preprocessedDocuments.map(f-> RowFactory.create(f.getLabel(), f.getText()));
StructType schema = new StructType(new StructField[]{
new StructField("label", DataTypes.DoubleType, false, Metadata.empty()),
new StructField("sentence", DataTypes.StringType, false, Metadata.empty())
});
SQLContext sqlContext = new SQLContext(sc);
DataFrame sentenceData = sqlContext.createDataFrame(jrdd, schema);
Tokenizer tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words");
DataFrame wordsData = tokenizer.transform(sentenceData);
int numFeatures = 20;
HashingTF hashingTF = new HashingTF()
.setInputCol("words")
.setOutputCol("rawFeatures")
.setNumFeatures(numFeatures);
DataFrame featurizedData = hashingTF.transform(wordsData);
DataFrame rescaledData = idfModel.transform(featurizedData);
JavaRDD<Row> rows = rescaledData.rdd().toJavaRDD();
JavaRDD<LabeledPoint> data = rows.map(f -> new LabeledPoint(f.getDouble(0), f.getAs(4)));
我正在尝试使用 Spark MLlib 实现一个简单的 SVM 分类算法。
我有一堆字符串及其标签,现在我想对它们执行 TF-IDF,并将结果提供给 SVM 算法。
所以我正在寻找的是从 String -> LabeledPoint 的转换 中间有 TF-IDF 步骤。
我按照这个例子: http://spark.apache.org/docs/latest/mllib-feature-extraction.html#tf-idf
它不起作用,因为 transform() 不适用于 RDD,而是适用于 Dataframes。
所以我遵循了这个教程: https://spark.apache.org/docs/latest/ml-features.html#tf-idf-hashingtf-and-idf
效果很好。但是现在我被 Dataframe 困住了,不知道如何将它转换为 JavaRDD。
我试过这个scala解决方案
但它不起作用,因为我正在使用 java。
我试过这个 Spark MLLib TFIDF implementation for LogisticRegression
但 suprise transform() 不适用于 JavaRDD。
所以这是我从教程中得到的代码。我就像只是在寻找把问号放在哪里的功能....
JavaRDD<Row> jrdd = documents.map(f -> RowFactory.create(0, f.getText()));
StructType schema = new StructType(new StructField[]{
new StructField("label", DataTypes.DoubleType, false, Metadata.empty()),
new StructField("sentence", DataTypes.StringType, false, Metadata.empty())
});
SQLContext sqlContext = new SQLContext(sc);
DataFrame sentenceData = sqlContext.createDataFrame(jrdd, schema);
Tokenizer tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words");
DataFrame wordsData = tokenizer.transform(sentenceData);
int numFeatures = 20;
HashingTF hashingTF = new HashingTF()
.setInputCol("words")
.setOutputCol("rawFeatures")
.setNumFeatures(numFeatures);
DataFrame featurizedData = hashingTF.transform(wordsData);
IDF idf = new IDF().setInputCol("rawFeatures").setOutputCol("features");
IDFModel idfModel = idf.fit(featurizedData);
DataFrame rescaledData = idfModel.transform(featurizedData);
JavaRDD<LabeledPoint> labeled = rescaledData.map(????????????????????????);
那我做错了什么?我怎样才能做到这一点?我快疯了。
提前致谢。
我通过以下方式解决了这个问题。很简单,只是需要一些。
JavaRDD<Row> jrdd = preprocessedDocuments.map(f-> RowFactory.create(f.getLabel(), f.getText()));
StructType schema = new StructType(new StructField[]{
new StructField("label", DataTypes.DoubleType, false, Metadata.empty()),
new StructField("sentence", DataTypes.StringType, false, Metadata.empty())
});
SQLContext sqlContext = new SQLContext(sc);
DataFrame sentenceData = sqlContext.createDataFrame(jrdd, schema);
Tokenizer tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words");
DataFrame wordsData = tokenizer.transform(sentenceData);
int numFeatures = 20;
HashingTF hashingTF = new HashingTF()
.setInputCol("words")
.setOutputCol("rawFeatures")
.setNumFeatures(numFeatures);
DataFrame featurizedData = hashingTF.transform(wordsData);
DataFrame rescaledData = idfModel.transform(featurizedData);
JavaRDD<Row> rows = rescaledData.rdd().toJavaRDD();
JavaRDD<LabeledPoint> data = rows.map(f -> new LabeledPoint(f.getDouble(0), f.getAs(4)));