如何使用 Apache Spark 生成固定长度的二进制表示?

Posted

技术标签:

【中文标题】如何使用 Apache Spark 生成固定长度的二进制表示?【英文标题】:How to generate fixed length binary representations using Apache Spark? 【发布时间】:2017-04-29 18:26:52 【问题描述】:

使用下面的代码我正在尝试将字符串转换为二进制表示:

import org.apache.spark.ml.feature.HashingTF, IDF, Tokenizer

val sentenceData = spark.createDataFrame(Seq(
  (0.0, "Hi I heard about Spark"),
  (0.0, "I wish Java could use case classes"),
  (1.0, "Logistic regression models are neat")
)).toDF("label", "sentence")

val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
val wordsData = tokenizer.transform(sentenceData)

val hashingTF = new HashingTF().setBinary(true).setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(5)

val featurizedData = hashingTF.transform(wordsData)

val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
val idfModel = idf.fit(featurizedData)

val rescaledData = idfModel.transform(featurizedData)

rescaledData.rdd.collect()

这会返回:

以上代码基于来自https://spark.apache.org/docs/2.1.0/ml-features.html#tf-idf的示例

但是二进制表示的长度不同。

rawFeatures 和 features 有什么区别?

如何生成固定长度的二进制表示?

更新:

所以(8,[0,1,5],[1.0,1.0,1.0]) 代表[1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0] 是否有API 方法来提取[1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0] 表示? 阅读 API 文档 https://spark.apache.org/docs/2.1.0/api/scala/index.html#org.apache.spark.mllib.feature.HashingTF 这似乎不可用?

【问题讨论】:

【参考方案1】:

但二进制表示的长度不同。

没有。这些都是大小为 5 的SparseVectors。表示中的第一个数字是Vector 的大小,两个数组表示非零条目的索引和值。

rawFeatures 和 features 有什么区别?

HashingTF 使用hashing trick 并且输出向量或多或少代表每个令牌的计数。

IDF 计算 inverse document frequenc。

如何生成固定长度的二进制表示?

同上

编辑

可以转换为密集表示,例如使用udf

import org.apache.spark.ml.linalg.Vector

val toDense = udf((v: Vector) => v.toDense)

几乎从不想要。在正常情况下HashingTF 使用非常多的特征(默认为 2^20,较高的值并不少见)来避免哈希冲突,但个别 Vectors 非常稀疏。因此,这种表示非常有效。转换为密集型可以将内存消耗增加几个数量级,而没有任何信息增益。

【讨论】:

以上是关于如何使用 Apache Spark 生成固定长度的二进制表示?的主要内容,如果未能解决你的问题,请参考以下文章

如何从给定范围生成固定长度值的随机列表?

使用 scala spark 将固定宽度的文件插入 Hive

如何在 Apache Spark (PySpark 1.4.1) 中可视化/绘制决策树?

在 Go 语言中生成固定长度的随机数

在C语言中如何固定字符的长度

从 org.apache.spark.sql.types.StructType 生成 AvroSchema