apache-spark - 如何从 Spark MLLib 中的 TF Vector RDD 获取单词详细信息?

标签 apache-spark apache-spark-mllib tf-idf apache-spark-ml

我使用 HashingTF 创建了词频在 Spark 。我使用 tf.transform 得到了词频对于每个单词。

但结果以这种格式显示。

[<hashIndexofHashBucketofWord1>,<hashIndexofHashBucketofWord2> ...]
,[termFrequencyofWord1, termFrequencyOfWord2 ....]

例如:
(1048576,[105,3116],[1.0,2.0])

我可以使用 tf.indexOf("word") 获取哈希桶中的索引.

但是,如何使用索引获取单词?

最佳答案

嗯,你不能。由于散列是非单射的,因此没有反函数。换句话说,无限数量的 token 可以映射到单个存储桶,因此无法分辨实际存在哪个 token 。

如果您使用大哈希并且唯一标记的数量相对较少,那么您可以尝试从存储桶到数据集中可能的标记创建查找表。它是一对多映射,但如果满足上述条件,冲突数量应该相对较低。

如果您需要可逆转换,您可以使用 combine Tokenizer StringIndexer 并手动构建稀疏特征向量。

另见:What hashing function does Spark use for HashingTF and how do I duplicate it?

编辑 :

在 Spark 1.5+ (PySpark 1.6+) 中,您可以使用 CountVectorizer 它应用可逆变换并存储词汇。

python :

from pyspark.ml.feature import CountVectorizer

df = sc.parallelize([
    (1, ["foo", "bar"]), (2, ["foo", "foobar", "baz"])
]).toDF(["id", "tokens"])

vectorizer = CountVectorizer(inputCol="tokens", outputCol="features").fit(df)
vectorizer.vocabulary
## ('foo', 'baz', 'bar', 'foobar')

斯卡拉:

import org.apache.spark.ml.feature.{CountVectorizer, CountVectorizerModel}

val df = sc.parallelize(Seq(
    (1, Seq("foo", "bar")), (2, Seq("foo", "foobar", "baz"))
)).toDF("id", "tokens")

val model: CountVectorizerModel = new CountVectorizer()
  .setInputCol("tokens")
  .setOutputCol("features")
  .fit(df)

model.vocabulary
// Array[String] = Array(foo, baz, bar, foobar)

其中第 0 个位置的元素对应于索引 0,第 1 个位置的元素对应于索引 1,依此类推。

关于apache-spark - 如何从 Spark MLLib 中的 TF Vector RDD 获取单词详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32285699/

相关文章:

python - TFIDF 矩阵上的 SVD 返回奇数形状

python - tf-idf : should I do normalization of documents length

python - 如何在数据框中查找相似的术语并将其分组以求和它们的值?

apache-spark - Spark Streaming to Hive,每个分区的小文件太多

java - 转换 Spark 数据集中的数据时数据类型不匹配

apache-spark - 如何让 Apache Zeppelin 笔记本在第一份工作中运行得更快

hadoop - 如何在 java 中使用 eclipse 在 Windows 上本地运行 Spark

java - 如何在不产生单独的 JVM 的情况下并行提交多个 Spark 应用程序?

java - 如何使用 Apache spark 计算平均值?

scala - Spark MLib Word2Vec 错误 : The vocabulary size should be > 0