我在一个句子中有一组单词,我已将其标记并应用了术语频率转换。
int numFeatures = 9000;
hashingTF = new HashingTF().setInputCol("filtered").setOutputCol("features")
.setNumFeatures(numFeatures);
DataFrame rawFeaturizedData = hashingTF.transform(stopWordsRemoved);
rawFeaturizedData.show();
当我打印数据框时,我会在"功能"中看到如下所示的值。柱
(9000,[2010,2113,2599,3807,5109,5849],[1.0,1.0,1.0,1.0,1.0,1.0])
9000是为术语频率计算配置的功能数。我已将此设置为9000,因为在应用文本转换(停用词删除,lemmetization等)后有8000个独特的单词
[2010,2113,2599,3807,5109,5849] - 我假设这些是分配给文本中每个单词的数字(特征)
什么是[1.0,1.0,1.0,1.0,1.0,1.0]? - 根据定义,术语频率会对单词进行散列并计算每个单词的权重。这是重量吗?为什么它总是显示为1.0?
答案 0 :(得分:2)
下列的程序:
(9000,[2010,2113,2599,3807,5109,5849],[1.0,1.0,1.0,1.0,1.0,1.0])
是SparseVector
的Spark字符串表示形式,其中:
如果符合以下条件,则指数等于:
让我们说输入数据如下所示:
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])|
+-------------------+-----------------------+--------------------+
由于哈希冲突。