如何使用 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