Spark MLlib中的HashingTF中的numFeatures与文档中的实际项数之间有什么关系?

Rah*_*hul 3 machine-learning tf-idf apache-spark apache-spark-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);
Run Code Online (Sandbox Code Playgroud)

如Spark Mllib文档中所述,HashingTF将每个句子转换为长度为numFeatures的特征向量。如果此处的每个文档(句子中包含成千上万个术语)会发生什么情况?numFeatures的值应该是多少?如何计算该值?

Mar*_*ace 5

HashingTF使用不会在单词/令牌及其向量位置之间保持映射的哈希技巧。转换器获取每个单词/单词,应用哈希函数(MurmurHash3_x86_32)生成长整型值,然后执行简单的模块运算(%'numFeatures')生成介于0和之间的Integer numFeatures。结果值是将在特征向量中增加的索引。

给定算法的性质,如果numFeatures小于DataFrame中的不同单词/令牌的实际数量,则可以确保至少有1个令牌具有“不正确”的频率(即,不同的令牌将散列到同一存储桶)。注意:即使numFeatures> = vocabularySizeSize,也会发生“可能”冲突。

最好的价值是numFeatures什么?我所用的数字将大于您的“词汇表”的大小(不必担心空间,因为功能存储在ml.linalg.SparseVector中)。请注意(请参阅docs):

由于使用简单的模将哈希函数转换为列索引,因此建议使用2的幂作为numFeatures参数。否则,要素将不会均匀地映射到列。

如果您希望获得准确的频率计数,请查看CountVectorizer