java - Spark MLlib - 将字符串转换为 TF-IDF LabeledPoint RDD

标签 java apache-spark apache-spark-mllib tf-idf

我正在尝试使用 Spark MLlib 实现一个简单的 SVM 分类算法。

我有一堆字符串及其标签,现在我想对它们执行 TF-IDF,并将结果提供给 SVM 算法。

所以我正在寻找的是从 String -> LabeledPoint 的转换 中间是 TF-IDF 步骤。

我按照这个例子: http://spark.apache.org/docs/latest/mllib-feature-extraction.html#tf-idf

还有这个 https://github.com/apache/spark/blob/master/mllib/src/test/java/org/apache/spark/mllib/feature/JavaTfIdfSuite.java

它不起作用,因为transform()不适用于RDD,而是适用于Dataframe。

所以我遵循了这个教程: https://spark.apache.org/docs/latest/ml-features.html#tf-idf-hashingtf-and-idf

效果非常好。但现在我被 Dataframe 困住了,不知道如何将其转换为 JavaRDD。

我尝试了这个scala解决方案 From DataFrame to RDD[LabeledPoint]

但是它不起作用,因为我使用的是java。

我试过这个 Spark MLLib TFIDF implementation for LogisticRegression

但是令人惊讶的是,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)));

关于java - Spark MLlib - 将字符串转换为 TF-IDF LabeledPoint RDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37572576/

相关文章:

Javae异常处理输出错误

Java 8 Sort HashMap,其中映射键是 <String, Integer> 的对象

java.io.Exception com.android.okhttp 上的流意外结束

scala - 什么是 Spark 中的 DecisionTree.trainClassifier 参数

apache-spark - 优化器 LBFGS OWLQN 实现

java - 在 Mac 上测试 BB 应用程序?

scala - Spark Scala 之外的更好替代方案

scala - 在 Spark/Scala 中将 Array[Row] 转换为 DataFrame

hadoop - yarn 模式下的 Spark RDD map 不允许访问变量?

apache-spark - 为什么朴素贝叶斯不能像逻辑回归那样在 Spark MLlib Pipeline 中工作?