TF - IDF使用spark转换为可读格式

时间:2015-10-08 07:43:19

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

我正在尝试为字符串文档计算TF-IDF,我指的是http://spark.apache.org/docs/latest/mllib-feature-extraction.html#tf-idf链接。

import org.apache.spark.rdd.RDD
import org.apache.spark.SparkContext
import org.apache.spark.mllib.feature.HashingTF
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.feature.IDF

val sc: SparkContext = ...

// Load documents (one per line).
val documents: RDD[Seq[String]] = sc.textFile("...").map(_.split("       ").toSeq)

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

输出:

  

数组((1048576,[1088,35436,98482,1024805],[2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776]),(1048576,[49,34227,39165,114066,125344,240472,312955,388260,436506] ,469864,493361,496101,566174,747007,802226],[2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776,2.3513752571634776]),...

有了这个,我得到了一个RDD的向量,但是我无法从这个向量中获得有关原始字符串的任何信息。任何人都可以帮助我将索引映射到原始字符串吗?

1 个答案:

答案 0 :(得分:2)

如果没有更多信息,很难回答你的问题。我最好的猜测是你可能想要为某些文档的某个术语提取TFIDF值。

你得到的最后一行是Vector的RDD:对于你的语料库中的每个文件(这是一个RDD [Seq [String]]),你得到一个代表文档的Vector。文档中的每个术语在此向量中都有一个特定的TFIDF值。

要知道矢量中术语的位置,并检索TFIDF:

val position = hashingTF.indexOf("term")

然后使用它来检索给定文档的tfidf值,调用Vector上的apply方法(本例中的文档中的第一个文档):

tfidf.first.apply(position)

原始频率可以使用tf而不是上面的行中的tfidf以相同的方式提取。

使用散列技巧实现Spark(参见documentationwikipedia article),我的理解是无法从Vector中检索术语:这是因为散列函数是定义的一种方式,并且这个"技巧"可能会导致冲突(多个术语可能产生相同的哈希)。