2016-10-13 10 views
1

私はターム化しターム周波数変換を適用した文章のセットを持っています。スパークターム頻度変換

int numFeatures = 9000; 
    hashingTF = new HashingTF().setInputCol("filtered").setOutputCol("features") 
      .setNumFeatures(numFeatures); 
    DataFrame rawFeaturizedData = hashingTF.transform(stopWordsRemoved); 
    rawFeaturizedData.show(); 

Iは、データフレームを印刷するとき、私は「機能」欄

(9000,[2010,2113,2599,3807,5109,5849],[1.0,1.0,1.0,1.0,1.0,1.0]) 

9000については、以下のような値を参照しては、用語頻度計算に設定された機能の数です。テキスト変換を適用した後に8000のユニークワードがあるため、これを9000に設定しました(除外単語の除外、除名など)

[2010,2113,2599,3807,5109,5849] - これは、テキストの各単語(機能)

[1.0,1.0,1.0,1.0,1.0,1.0]とは何ですか? - 定義により、単語頻度は単語のハッシングを行い、各単語の重みを計算します。これは重みですか?なぜそれは常に1.0として表示されますか?

答えて

1

次のとおりです。

  • 大手数(ここでは機能の数)のベクトルの大きさである:

    (9000,[2010,2113,2599,3807,5109,5849],[1.0,1.0,1.0,1.0,1.0,1.0]) 
    

    SparseVectorのスパーク文字列表現です。

  • 最初の配列は、非ゼロのインデックスのリストです。
  • 2番目の配列は値のリスト(ここでは重み)です。重複するトークンがありません

    • :場合

    インデックスは1に等しいです。

  • ハッシュの競合はありません。我々は2.0が表示されます

    hashingTF11.transform(df).show(2, false) 
    

    val hashingTF11 = new HashingTF() 
        .setInputCol("filtered") 
        .setOutputCol("features") 
        .setNumFeatures(11) 
    

    と変換:

    val df = Seq("orange orange apple", "apple orange kiwi").toDF("text") 
        .withColumn("filtered", split($"text", "\\s+")) 
    

    は、我々は11個の機能を使用する場合:

のは、入力されたデータは次のようになりましょう最初の行(オレンジは2回表示):

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

をトランスフォーム:

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

hashingTF10.transform(df).show(2, false) 

両方の行は、重量2.0での機能を持っていますハッシュ衝突によるものです。