当前位置: 首页 > 知识库问答 >
问题:

java - Spark MLlib -将字符串转换为TF-IDF标签点rdd

郭璞
2023-03-14

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

我有一堆字符串和它们的标签,现在我想对它们执行TF-IDF,并将结果反馈给SVM算法。

所以我要找的是从字符串的转换-

我按照这个例子:http://spark . Apache . org/docs/latest/ml lib-feature-extraction . html # TF-IDF

还有这个https://github . com/Apache/spark/blob/master/ml lib/src/test/Java/org/Apache/spark/ml lib/feature/javatfidfsuite . Java

它不起作用,因为transform()不在rdd上工作,而是在数据帧上工作。

于是我按照这个教程:https://spark . Apache . org/docs/latest/ml-features . html # TF-IDF-hashing TF-and-IDF

它工作得很好。但是现在我被困在数据帧中,不知道如何将其转换为JavaRDD。

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

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

我尝试了这个火花MLLib TFIDF实现的物流递归

但惊喜变换() 不适用于爪哇RDD。

这是我从教程中得到的代码。我就像只寻找放置问号的函数……

    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(????????????????????????);

那么我做错了什么?我该怎么做?我快疯了。

先谢谢你。

共有1个答案

闽经纬
2023-03-14

我用以下方法解决了这个问题。很容易,只是需要一些。

    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)));
 类似资料:
  • 问题内容: 正如标题所说。我不认为有可能这样做,但如果可以告诉我。 这是我正在编写的bukkit(minecraft服务器)插件所必需的。我要执行一个命令:tnt [power]。电源是我想转换为浮点数的返回字符串。 谢谢 问题答案: 用于进行转换。 和之间的区别只是回报。如果需要(对象),请使用前者;如果要数字,请使用后者。

  • 问题内容: 我需要将由某些特定于某些语言的字母(例如HÄSTDJUR-注意Ä)组成的s 转换为不带那些特殊字母(在这种情况下为HASTDJUR)的。如何用Java做到这一点?感谢帮助! 它不是真的如何听起来。该场景如下-您要使用该应用程序,但没有瑞典语键盘。因此,您无需查看字符映射表,而是通过将特殊字母替换为拉丁字母中的典型字母来键入它。 问题答案: 我认为您的问题与此问题相同: Java-消除重

  • 问题内容: 得到了以下格式的字符串:YYYY-MM-DD- HH.MM.SS.NNNNNN时间戳记来自DB2数据库。我需要将其解析为java.sql.Timestamp,并且不要丢失任何精度。到目前为止,我一直找不到现有的代码来解析这么多毫秒。SimpleDateFormat返回一个Date,并且仅解析为毫秒。简短地看了一下JodaTime,也没有发现任何效果。 问题答案: 您是否尝试过使用?看起

  • 问题内容: 将带逗号的字符串数字(例如:835,111.2)转换为Double实例的最简单,正确的方法是什么。 谢谢。 问题答案: 看一看。例如: 根据您使用的数量类型,您可能想解析为一个。最简单的方法可能是: 或与一起使用:

  • 问题内容: 我不确定是我还是什么,但是将双精度转换为字符串时遇到问题。 这是我的代码: 我是在做错事还是在这里错过了一步。 尝试将其转换时出现错误。 我正在尝试在onTouchListener中执行此操作。病态发布更多代码,基本上是当用户触摸编辑文本框时,我希望信息计算填充编辑文本框。 问题答案: 这会将double转换为String

  • 问题内容: 我想将String转换为KeyEvent以执行以下操作: 问题答案: 我基本上是在用荣耀的声明。简单快捷: 如果要进行一些自定义键键入,则可以扩展该类并重写该type(char)方法。例如: 当然,还有改进的余地,但是你知道了。