我正在尝试为字符串文档计算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的向量,但是我无法从这个向量中获得有关原始字符串的任何信息。任何人都可以帮助我将索引映射到原始字符串吗?
答案 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(参见documentation和wikipedia article),我的理解是无法从Vector中检索术语:这是因为散列函数是定义的一种方式,并且这个"技巧"可能会导致冲突(多个术语可能产生相同的哈希)。