【问题标题】:spark term frequency transformation火花项频率变换
【发布时间】:2017-02-22 14:58:47
【问题描述】:

我在一个句子中有一组单词,我已经标记化并应用了词频变换。

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,因为在应用文本转换后有 8000 个唯一词(停用词删除、词形还原等)

[2010,2113,2599,3807,5109,5849] - 我假设这些是分配给文本中每个单词的数字(特征)

什么是 [1.0,1.0,1.0,1.0,1.0,1.0] ? - 根据定义,词频对单词进行散列,并计算每个单词的权重。这是重量吗?为什么总是显示为 1.0?

【问题讨论】:

    标签: apache-spark machine-learning apache-spark-mllib tf-idf


    【解决方案1】:

    以下:

    (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])|
    +-------------------+-----------------------+--------------------+
    

    由于哈希冲突。

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 2015-01-04
      • 2019-01-02
      • 1970-01-01
      • 2017-03-09
      • 2011-01-22
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多