【发布时间】:2017-04-30 09:42:56
【问题描述】:
我在 DataBricks 上尝试了标准 spark HashingTF 示例。
import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}
val sentenceData = spark.createDataFrame(Seq(
(0, "Hi I heard about Spark"),
(0, "I wish Java could use case classes"),
(1, "Logistic regression models are neat")
)).toDF("label", "sentence")
val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
val wordsData = tokenizer.transform(sentenceData)
val hashingTF = new HashingTF()
.setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(20)
val featurizedData = hashingTF.transform(wordsData)
display(featurizedData)
我很难理解下面的结果。 Please see the image 当 numFeatures 为 20 时
[0,20,[0,5,9,17],[1,1,1,2]]
[0,20,[2,7,9,13,15],[1,1,3,1,1]]
[0,20,[4,6,13,15,18],[1,1,1,1,1]]
如果 [0,5,9,17] 是哈希值
和 [1,1,1,2] 是频率。
17 有频率 2
9 有 3(它有 2)
13,15 有 1 而他们必须有 2。
可能我错过了什么。找不到详细解释的文档。
【问题讨论】:
-
Spark 类 HashingTF 利用了散列技巧。通过应用哈希函数将原始特征映射到索引(术语)。然后根据映射的索引计算词频。这种方法避免了计算全局术语到索引映射的需要,这对于大型语料库来说可能很昂贵,但它会遭受潜在的哈希冲突,其中不同的原始特征在哈希后可能会变成同一个术语。
标签: scala apache-spark apache-spark-mllib apache-spark-ml