Spark IDF用于新文档

5
什么是在spark中应用tf.idf转换到新文档的最佳方法?我的设置是离线训练模型,然后加载它并将其应用于新文件。如果没有访问模型IDF分布,计算IDF就没有太多意义。
到目前为止,我想到的唯一解决方案是保存训练集的TF RDD并将新文档附加到其中,然后计算IDF RDD并从IDF RDD中提取新文件。这样做的问题是我必须在内存中保留整个TF向量(我猜IDF RDD也可能可以)。
这看起来像是别人已经遇到的问题,所以寻求建议和见解,了解最佳方法是什么。
谢谢,
Ilija
1个回答

4

你根本不需要使用RDD。TensorFlow只依赖于你拥有的数据(如果你使用固定大小的表示而不是哈希,则还依赖于词汇表),IDF只是一个可以表示为向量的模型,仅依赖于词汇表。

因此,唯一需要保留的是一个。假设你使用的转换大致如下:

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方法对其进行序列化。


我在考虑类似的事情。谢谢。所以IDFModel存储了训练集中所有idf频率,对吗? - ilijaluve
@zero323,您能否提供一个如何使用“IDF”和新输入的示例。我们是否仍需要使用“tf”进行转换?我在思考:val newInput = new HashingTF().transform(newInputRDD) val newTfIdf = if.transform(newInput) 这样做会给我之前训练好的模型使用相同特征空间的新文本映射吗? - Brian
看起来不错,我也会重复使用HashingTF。它不依赖于数据,但仍然可调整。 - zero323
没问题,看起来可以。如果你有HashingTF类,你可以重复使用它。但在大多数情况下,训练将与实际应用程序分开进行。你需要进行tf转换以获取新文档的TF。 - ilijaluve
1
@zero323,我正在使用 java.io.{FileOutputStream, ObjectOutputStream} 存储 IDFModel,但是当使用 FileInputStream 等加载时,它似乎没有被序列化(会出现序列化错误)。你能详细说明如何存储idf模型吗?谢谢。 - Mpizos Dimitris
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接