Scala 如何使用ApacheSpark生成固定长度的二进制表示?
使用下面的代码,我试图将字符串转换为二进制表示:Scala 如何使用ApacheSpark生成固定长度的二进制表示?,scala,apache-spark,Scala,Apache Spark,使用下面的代码,我试图将字符串转换为二进制表示: 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 mode
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()
这将返回:
以上代码基于
但是二进制表示的长度不同
特征和特征之间有什么区别
如何生成固定长度的二进制表示
更新:
所以(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]
是否存在提取[1.0,1.0,0.0,0.0,0.0]表示的API方法?
正在读取API文档,该文档似乎不可用
但是二进制表示的长度不同
没有。这些都是尺寸为5的sparsevector
。表示中的第一个数字是向量的大小,两个数组表示非零项的标记和值
特征和特征之间有什么区别
HashingTF
使用和输出向量或多或少地表示每个令牌的计数
IDF
计算
如何生成固定长度的二进制表示
同上
编辑:
可以转换为密集表示,例如使用udf
:
import org.apache.spark.ml.linalg.Vector
val toDense = udf((v: Vector) => v.toDense)
但是几乎从来都不想要。在正常情况下,HashingTF
使用非常多的特征(默认情况下,2^20,较高的值并不少见)来避免散列冲突,但单个向量
非常稀疏。因此,这种表示非常有效。转换为稠密可以在没有任何信息增益的情况下,将内存消耗增加几个数量级