LogisticRegression的Spark MLLib TFIDF实现
我尝试使用火花1.1.0提供的新TFIDF算法。 我正在用Java编写MLLib的工作,但我无法弄清楚如何使TFIDF实现工作。 由于某种原因, IDFModel仅接受JavaRDD作为方法转换的输入而不是简单的Vector。 如何使用给定的类为我的LabledPoints建模TFIDF向量?
注意:文档行的格式为[标签; 文本]
到目前为止我的代码:
// 1.) Load the documents JavaRDD data = sc.textFile("/home/johnny/data.data.new"); // 2.) Hash all documents HashingTF tf = new HashingTF(); JavaRDD<Tuple2> tupleData = data.map(new Function<String, Tuple2>() { @Override public Tuple2 call(String v1) throws Exception { String[] data = v1.split(";"); List myList = Arrays.asList(data[1].split(" ")); return new Tuple2(Double.parseDouble(data[0]), tf.transform(myList)); } }); tupleData.cache(); // 3.) Create a flat RDD with all vectors JavaRDD hashedData = tupleData.map(new Function<Tuple2, Vector>() { @Override public Vector call(Tuple2 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 ???
肖恩欧文的 解决方案 :
// 1.) Load the documents JavaRDD data = sc.textFile("/home/johnny/data.data.new"); // 2.) Hash all documents HashingTF tf = new HashingTF(); JavaRDD tupleData = data.map(v1 -> { String[] datas = v1.split(";"); List 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 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 idf = idfModel.transform(hashedData); // 6.) Create Labledpoint RDD JavaRDD idfTransformed = idf.zip(tupleData).map(t -> { return new LabeledPoint(t._2.label(), t._1); });
正如您所见, IDFModel.transform()
接受Vector
的JavaRDD
或RDD
。 在单个Vector
上计算模型没有意义,所以这不是你正在寻找的那个吗?
我假设您使用的是Java,因此您的意思是要将其应用于JavaRDD
。 LabeledPoint
包含Vector
和标签。 IDF不是分类器或回归器,因此它不需要标签。 你可以map
一堆LabeledPoint
来提取它们的Vector
。
但是你已经有了上面的JavaRDD
。 TF-IDF仅仅是基于语料库中的词频将单词映射到实值特征的一种方式。 它也不输出标签。 也许你的意思是你想要从TF-IDF衍生的特征向量和你已经拥有的其他一些标签开发分类器?
也许这会让事情变得清晰,但除此之外,你必须大大澄清你想用TF-IDF实现的目标。