2017-07-07 28 views
0

有numFeatures之間HashingTF在星火MLlib和術語在文檔(句子)的實際數量的任何關係?Spark MLlib中的HashingTF中的numFeatures和文檔中的實際條目數之間的關係是什麼?

List<Row> data = Arrays.asList(
    RowFactory.create(0.0, "Hi I heard about Spark"), 
    RowFactory.create(0.0, "I wish Java could use case classes"), 
    RowFactory.create(1.0, "Logistic regression models are neat") 
); 
StructType schema = new StructType(new StructField[]{ 
    new StructField("label", DataTypes.DoubleType, false, Metadata.empty()), 
    new StructField("sentence", DataTypes.StringType, false, Metadata.empty()) 
}); 
Dataset<Row> sentenceData = spark.createDataFrame(data, schema); 

Tokenizer tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words"); 
Dataset<Row> wordsData = tokenizer.transform(sentenceData); 

int numFeatures = 20; 
HashingTF hashingTF = new HashingTF() 
    .setInputCol("words") 
    .setOutputCol("rawFeatures") 
    .setNumFeatures(numFeatures); 

Dataset<Row> featurizedData = hashingTF.transform(wordsData); 

正如Spark Mllib文檔中提到的那樣,HashingTF將每個句子轉換爲具有numFeatures長度的特徵向量。 如果這裏的每個文檔,在這種情況下,句子包含數千個術語,會發生什麼? numFeatures的價值應該是什麼?如何計算該值?

回答

0

HashingTF使用hashing trick,它不保留單詞/標記與其矢量位置之間的映射。變壓器採用每個字/截取,應用散列函數(MurmurHash3_x86_32)以生成一個長的值,然後執行一個簡單的模塊操作(%「numFeatures」),以產生0和numFeatures之間的整數。結果值是將在特徵向量中增加的索引。

考慮到算法的性質,如果numFeatures小於DataFrame中不同單詞/標記的實際數量,則至少有1個標記保證有一個「不正確」的頻率(即,不同的標記將散列到相同的水桶)。注意:即使使用numFeatures> = vocabularySize碰撞'可能'仍然會發生。

什麼爲numFeatures最好的價值?我會採取一些比你的詞彙量「的規模更大(不要太擔心空間特徵被存儲在一個ml.linalg.SparseVector)。需要注意的是(參見docs):

由於簡單的模被用來將散列函數變換爲列索引,可取的是使用兩種作爲numFeatures參數的功率;否則這些功能將不會均勻映射到列。

如果你希望有一個確切的頻率計數再看看CountVectorizer

相關問題