火花项频率变换
spark term frequency transformation
我对句子中的一组词进行了标记化并应用了词频变换。
int numFeatures = 9000;
hashingTF = new HashingTF().setInputCol("filtered").setOutputCol("features")
.setNumFeatures(numFeatures);
DataFrame rawFeaturizedData = hashingTF.transform(stopWordsRemoved);
rawFeaturizedData.show();
当我打印数据框时,我看到 "features" 列的值如下所示
(9000,[2010,2113,2599,3807,5109,5849],[1.0,1.0,1.0,1.0,1.0,1.0])
9000 是为术语频率计算配置的特征数。我将其设置为 9000,因为在应用文本转换(停用词删除、词形还原等)后有 8000 个唯一单词
[2010,2113,2599,3807,5109,5849] - 我假设这些是分配给文本中每个单词的数字(特征)
什么是 [1.0,1.0,1.0,1.0,1.0,1.0]? - 根据定义,术语频率对单词进行哈希处理并计算每个单词的权重。这是权重?为什么它总是显示为 1.0?
以下:
(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])|
+-------------------+-----------------------+--------------------+
由于哈希冲突。
我对句子中的一组词进行了标记化并应用了词频变换。
int numFeatures = 9000;
hashingTF = new HashingTF().setInputCol("filtered").setOutputCol("features")
.setNumFeatures(numFeatures);
DataFrame rawFeaturizedData = hashingTF.transform(stopWordsRemoved);
rawFeaturizedData.show();
当我打印数据框时,我看到 "features" 列的值如下所示
(9000,[2010,2113,2599,3807,5109,5849],[1.0,1.0,1.0,1.0,1.0,1.0])
9000 是为术语频率计算配置的特征数。我将其设置为 9000,因为在应用文本转换(停用词删除、词形还原等)后有 8000 个唯一单词
[2010,2113,2599,3807,5109,5849] - 我假设这些是分配给文本中每个单词的数字(特征)
什么是 [1.0,1.0,1.0,1.0,1.0,1.0]? - 根据定义,术语频率对单词进行哈希处理并计算每个单词的权重。这是权重?为什么它总是显示为 1.0?
以下:
(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])|
+-------------------+-----------------------+--------------------+
由于哈希冲突。