【问题标题】:Spark IDF for new documents用于新文档的 Spark IDF
【发布时间】:2016-05-06 06:44:12
【问题描述】:

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

到目前为止,我想到的唯一解决方案是保存训练集的 TF RDD 并将新文档附加到其中,然后计算 IDF RDD 并从 IDF RDD 中提取新文件。这样做的问题是我必须将整个 TF 向量保存在内存中(我想它也可能与 IDF RDD 一起关闭)。

这似乎是某人已经遇到的问题,因此请寻求建议以了解最佳解决方法。

干杯,

伊利亚

【问题讨论】:

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


    【解决方案1】:

    您根本不需要 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 方法对其进行序列化。

    【讨论】:

    • 我在想一些类似的事情。谢谢。所以 IDFModel 存储了训练集的所有 idf 频率,对吧。
    • 确实如此。 IDF 只是词汇表中每个标记的单个数字。您甚至可以使用idf.idf 提取它
    • @zero323 您能否提供一个示例,说明如何将IDF 与新输入一起使用。我们还需要用tf 转换吗?我在想:val newInput = new HashingTF().transform(newInputRDD) val newTfIdf = if.transform(newInput) 这会给我的文本新映射到我之前训练的模型使用的相同特征空间吗?
    • 看起来不错,我也会重用 HashingTF。它不依赖于数据,但仍然是可调的。
    • @zero323 我正在使用java.io.{FileOutputStream, ObjectOutputStream} 来存储IDFModel,但是当使用FileInputStream 等加载它时,它似乎没有被序列化。 (给出序列化错误)。你能详细说明如何存储 idf 模型吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2017-11-30
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多