以下:
(9000,[2010,2113,2599,3807,5109,5849],[1.0,1.0,1.0,1.0,1.0,1.0])
是SparseVector 的 Spark 字符串表示形式,其中:
- 前导数是向量的大小(此处为特征数)。
- 第一个数组是一个非零索引列表。
- 第二个数组是值列表(此处为权重)。
如果满足以下条件,则索引等于 1:
假设输入数据如下所示:
val df = Seq("orange orange apple", "apple orange kiwi").toDF("text")
.withColumn("filtered", split($"text", "\\s+"))
如果我们使用 11 个特征:
val hashingTF11 = new HashingTF()
.setInputCol("filtered")
.setOutputCol("features")
.setNumFeatures(11)
和变换:
hashingTF11.transform(df).show(2, false)
我们将在第一行看到2.0(橙色代表两次):
+-------------------+-----------------------+---------------------------+
|text |filtered |features |
+-------------------+-----------------------+---------------------------+
|orange orange apple|[orange, orange, apple]|(11,[9,10],[2.0,1.0]) |
|apple orange kiwi |[apple, orange, kiwi] |(11,[6,9,10],[1.0,1.0,1.0])|
+-------------------+-----------------------+---------------------------+
但如果我们将特征数量减少到 10 个:
val hashingTF10 = new HashingTF()
.setInputCol("filtered")
.setOutputCol("features")
.setNumFeatures(10)
和变换:
hashingTF10.transform(df).show(2, false)
两行都将具有权重为 2.0 的特征:
+-------------------+-----------------------+--------------------+
|text |filtered |features |
+-------------------+-----------------------+--------------------+
|orange orange apple|[orange, orange, apple]|(10,[1,3],[1.0,2.0])|
|apple orange kiwi |[apple, orange, kiwi] |(10,[1,3],[2.0,1.0])|
+-------------------+-----------------------+--------------------+
由于哈希冲突。