2017-07-07 20 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

相关问题