java apache-spark apache-spark-mllib tf-idf

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); });