Я пытаюсь использовать новый TFIDF algorithem, который предлагает искры 1.1.0. Я пишу свою работу для MLLib на Java, но я не могу понять, как получить работу TFIDF. По какой-то причине IDFModel принимает только JavaRDD в качестве входных данных для метода transform и не просто Vector. Как я могу использовать заданные классы для моделирования вектора TFIDF для моих LabledPoints?Spark MLLib реализация TFIDF для LogisticRegression
Примечание: Линии документа имеют формат [Этикетка; Текст]
Вот мой код до сих пор:
// 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);
});
Предположим, у меня есть набор данных с (метка, идентификатор, вектор). Я не вижу возможности вычислить его в TF-IDF-модели и каким-то образом перенастроить каждый вектор обратно на свой id и/или ярлык после того, как я получил JavaRDD обратно из IDFModel.transform(). Надеюсь, это немного разъяснит проблему, с которой я столкнулся. –
Johnny000
А я здесь немного ошибся. Это 'IDF', который вычисляет частоты. Да, было бы разумнее, если бы 'IDFModel' работал и на одном« Вектор ». Вы можете сделать запрос на растяжение. Тем временем это может работать: 1. Персистентный ввод RDD. 2. Преобразуйте его в просто векторы и примените 'IDFModel' 3.' zip' с оригинальным RDD 4. преобразуйте ярлык и новый вектор в 'LabeledPoint' –
Да, это тоже было мое, сделайте запрос на растяжение .. спасибо в любом случае – Johnny000