java - Implementación de Spark MLLib TFIDF para LogisticRegression
apache-spark apache-spark-mllib (1)
IDFModel.transform()
acepta un JavaRDD
o RDD
de Vector
, como puede ver. No tiene sentido calcular un modelo sobre un solo Vector
, entonces eso no es lo que estás buscando ¿no?
Supongo que está trabajando en Java, quiere decir que quiere aplicar esto a JavaRDD<LabeledPoint>
. LabeledPoint
contiene un Vector
y una etiqueta. IDF no es un clasificador o regresor, por lo que no necesita etiqueta. Puede map
un montón de LabeledPoint
para extraer su Vector
.
Pero ya tienes un JavaRDD<Vector>
arriba. TF-IDF es simplemente una forma de asignar palabras a las características de valores reales en función de las frecuencias de las palabras en el corpus. Tampoco produce una etiqueta. Tal vez te refieres a que quieres desarrollar un clasificador de vectores de características derivadas de TF-IDF, y algunas otras etiquetas que ya tienes?
Tal vez eso aclare las cosas, pero de lo contrario tendrías que aclarar en gran medida lo que estás tratando de lograr con TF-IDF.
Intento utilizar el nuevo algoritmo de TFIDF que ofrece la chispa 1.1.0. Estoy escribiendo mi trabajo para MLLib en Java, pero no entiendo cómo hacer funcionar la implementación de TFIDF. Por alguna razón, IDFModel solo acepta un JavaRDD como entrada para la transformación del método y no simple Vector. ¿Cómo puedo usar las clases dadas para modelar un vector TFIDF para mis LabledPoints?
Nota: las líneas del documento están en el formato [Etiqueta; Texto]
Aquí mi código hasta ahora:
// 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
???
Solución de 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);
});