Spark IDF用于新文档

时间:2016-01-28 18:24:23

标签: apache-spark machine-learning apache-spark-mllib

将tf.idf转换应用于spark中的新文档的最佳方法是什么?我有一个设置,我将模型离线训练,然后加载它并将其应用于新文件。基本上,如果无法访问模型IDF分布,计算IDF没有多大意义。

到目前为止,我想到的唯一解决方案是保存训练集的TF RDD并将新文档附加到它,然后计算IDF RDD并从IDF RDD中提取新文件。这个问题是我必须将整个TF矢量保留在内存中(我猜它可能也会因IDF RDD而下降)。

这看起来像是某个人已经拥有的问题,所以寻找建议可以获得最佳方法的见解。

干杯,

伊利亚·

1 个答案:

答案 0 :(得分:3)

根本不需要RDD。除了你拥有的数据之外,TF并不依赖于任何其他东西(如果使用没有散列的固定大小表示,则不依赖于词汇),而IDF只是一个可以表示为向量并且仅依赖于词汇的模型。

所以你唯一需要保留的是IDFModel。假设你使用的转换看起来或多或少是这样的:

val hashingTF = new HashingTF()
val tf: RDD[Vector] = hashingTF.transform(rdd) 

val idf = new IDF().fit(tf)
val tfidf: RDD[Vector] = idf.transform(tf)

唯一对新数据进行进一步操作有用的是idf变量。虽然它没有save方法,但它是一个本地可序列化对象,因此您可以使用标准Java方法对其进行序列化。