【问题标题】:how do I preserve the key or index of input to Spark HashingTF() function?如何保留 Spark HashingTF() 函数的输入键或索引?
【发布时间】:2015-09-18 00:15:39
【问题描述】:

基于 1.4 (https://spark.apache.org/docs/1.4.0/mllib-feature-extraction.html) 的 Spark 文档,我正在编写一个 TF-IDF 示例,用于将文本文档转换为值向量。给出的示例显示了如何做到这一点,但输入是令牌的 RDD 没有键。这意味着我的输出 RDD 不再包含引用原始文档的索引或键。例子是这样的:

documents = sc.textFile("...").map(lambda line: line.split(" "))

hashingTF = HashingTF()
tf = hashingTF.transform(documents)

我想做这样的事情:

documents = sc.textFile("...").map(lambda line: (UNIQUE_LINE_KEY, line.split(" ")))

hashingTF = HashingTF()
tf = hashingTF.transform(documents)

并让生成的tf 变量在某处包含UNIQUE_LINE_KEY 值。我只是错过了一些明显的东西吗?从示例看来,没有很好的方法将document RDD 与tf RDD 联系起来。

【问题讨论】:

    标签: apache-spark apache-spark-mllib tf-idf


    【解决方案1】:

    我也遇到了同样的问题。在来自文档的示例中,他们鼓励您直接在 RDD 上应用转换。

    但是,您可以对向量本身应用转换,这样您就可以以任何方式保留键。

    val input = sc.textFile("...")
    val documents = input.map(doc => doc -> doc.split(" ").toSeq)
    
    val hashingTF = new HashingTF()
    val tf = documents.mapValues(hashingTF.transform(_))
    tf.cache()
    val idf = new IDF().fit(tf.values)
    val tfidf = tf.mapValues(idf.transform(_))
    

    请注意,此代码将产生 RDD[(String, Vector)] 而不是 RDD[Vector]

    【讨论】:

      【解决方案2】:

      如果您使用来自提交 85b96372cf0fd055f89fc639f45c1f2cb02a378f 之后的 Spark 版本(这包括 1.4),并使用 ml API HashingTF(需要 DataFrame 输入而不是普通 RDD),则其输出中的原始列。希望对您有所帮助!

      【讨论】:

      • 我不确定您所说的“输出中的原始列”是什么意思。
      • 我的意思是输出数据框包含您的原始输入。
      • 不幸的是,IDF() 似乎不支持数据框输入:(
      • 如果有帮助的话,有从 DataFrames 到标记点等的转换。
      猜你喜欢
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多