java - 用于 LogisticRegression 的 Spark MLLib TFIDF 实现

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

我尝试使用 spark 1.1.0 提供的新 TFIDF 算法。我正在用 Java 编写 MLLib 的工作,但我不知道如何让 TFIDF 实现工作。由于某种原因IDFModel只接受 JavaRDD作为方法的输入 transform而不是简单的 vector 。 我如何使用给定的类为我的 LabeldPoints 建模 TFIDF vector ?

注意:文档行的格式为 [Label;文]


到目前为止,这是我的代码:

        // 1.) Load the documents
        JavaRDD<String> data = sc.textFile("/home/johnny/data.data.new"); 

        // 2.) Hash all documents
        HashingTF tf = new HashingTF();
        JavaRDD<Tuple2<Double, Vector>> tupleData = data.map(new Function<String, Tuple2<Double, Vector>>() {
            @Override
            public Tuple2<Double, Vector> call(String v1) throws Exception {
                String[] data = v1.split(";");
                List<String> myList = Arrays.asList(data[1].split(" "));
                return new Tuple2<Double, Vector>(Double.parseDouble(data[0]), tf.transform(myList));
            }
        });

        tupleData.cache();

        // 3.) Create a flat RDD with all vectors
        JavaRDD<Vector> hashedData = tupleData.map(new Function<Tuple2<Double,Vector>, Vector>() {
            @Override
            public Vector call(Tuple2<Double, Vector> v1) throws Exception {
                return v1._2;
            }
        });

        // 4.) Create a IDFModel out of our flat vector RDD
        IDFModel idfModel = new IDF().fit(hashedData);

        // 5.) Create Labledpoint RDD with TFIDF
        ???

解决方案 来自 Sean Owen:

        // 1.) Load the documents
        JavaRDD<String> data = sc.textFile("/home/johnny/data.data.new"); 

        // 2.) Hash all documents
        HashingTF tf = new HashingTF();
        JavaRDD<LabeledPoint> tupleData = data.map(v1 -> {
                String[] datas = v1.split(";");
                List<String> myList = Arrays.asList(datas[1].split(" "));
                return new LabeledPoint(Double.parseDouble(datas[0]), tf.transform(myList));
        }); 
        // 3.) Create a flat RDD with all vectors
        JavaRDD<Vector> hashedData = tupleData.map(label -> label.features());
        // 4.) Create a IDFModel out of our flat vector RDD
        IDFModel idfModel = new IDF().fit(hashedData);
        // 5.) Create tfidf RDD
        JavaRDD<Vector> idf = idfModel.transform(hashedData);
        // 6.) Create Labledpoint RDD
        JavaRDD<LabeledPoint> idfTransformed = idf.zip(tupleData).map(t -> {
            return new LabeledPoint(t._2.label(), t._1);
        });

最佳答案

IDFModel.transform()接受 JavaRDDRDDVector , 如你所见。在单个 Vector 上计算模型没有意义,所以这不是您要查找的内容,对吗?

我假设您正在使用 Java,所以您的意思是您想将其应用于 JavaRDD<LabeledPoint> . LabeledPoint包含 Vector和一个标签。 IDF 不是分类器或回归器,因此不需要标签。你可以map一堆 LabeledPoint只提取他们的 Vector .

但是你已经有了一个JavaRDD<Vector>多于。 TF-IDF 只是一种根据语料库中的词频将词映射到实值特征的方法。它也不输出标签。也许你的意思是你想从 TF-IDF 派生的特征向量和你已有的一些其他标签开发一个分类器?

也许这会把事情弄清楚,但否则你必须非常清楚你试图用 TF-IDF 实现什么。

关于java - 用于 LogisticRegression 的 Spark MLLib TFIDF 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26897908/

相关文章:

maven - 本地模式下的 Apache SparkUI

scala - Spark-sql/Scala 中的 Unpivot 列名称是数字

scala - 在 Spark 中将 BigInt 转换为 Int

python - 如何获取Spark决策树模型的节点信息

Java (LWJGL) - 在绘图之前/期间是否需要绑定(bind)特定的 VBO?

java - 为什么这种使用反射的方法会抛出npe?

java - 部署 Java 应用程序。如何?

java - PrintReader 返回不可读的字符

apache-spark - Spark : Most efficient way to sort and partition data to be written as parquet

apache-spark - Apache Spark 文本相似度