2014-11-12 4 views
9

Я пытаюсь использовать новый 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); 
     }); 

ответ

11

IDFModel.transform() принимает JavaRDD или RDD из Vector, как вы видеть. Не имеет смысла вычислять модель за один Vector, так что это не то, что вы ищете правильно?

Предполагаю, что вы работаете на Java, поэтому вы хотите применить это к JavaRDD<LabeledPoint>. LabeledPoint содержит Vector и этикетку. IDF не является классификатором или регрессором, поэтому ему не нужен ярлык. Вы можете map связка LabeledPoint, чтобы просто извлечь их Vector.

Но у вас уже есть JavaRDD<Vector>. TF-IDF - это просто способ сопоставления слов с реальными функциями, основанными на частотах слов в корпусе. Он также не выводит ярлык. Может быть, вы имеете в виду, что хотите разработать классификатор из векторов функций, полученных из TF-IDF, и некоторые другие метки, которые у вас уже есть?

Возможно, это проясняет ситуацию, но в противном случае вам придется значительно разъяснить, чего вы пытаетесь достичь с помощью TF-IDF.

+1

Предположим, у меня есть набор данных с (метка, идентификатор, вектор). Я не вижу возможности вычислить его в TF-IDF-модели и каким-то образом перенастроить каждый вектор обратно на свой id и/или ярлык после того, как я получил JavaRDD обратно из IDFModel.transform(). Надеюсь, это немного разъяснит проблему, с которой я столкнулся. – Johnny000

+3

А я здесь немного ошибся. Это 'IDF', который вычисляет частоты. Да, было бы разумнее, если бы 'IDFModel' работал и на одном« Вектор ». Вы можете сделать запрос на растяжение. Тем временем это может работать: 1. Персистентный ввод RDD. 2. Преобразуйте его в просто векторы и примените 'IDFModel' 3.' zip' с оригинальным RDD 4. преобразуйте ярлык и новый вектор в 'LabeledPoint' –

+0

Да, это тоже было мое, сделайте запрос на растяжение .. спасибо в любом случае – Johnny000

 Смежные вопросы

  • Нет связанных вопросов^_^