如何从 Spark MLLib 中的 TF Vector RDD 获取单词详细信息?
How to get word details from TF Vector RDD in Spark ML Lib?
我在 Spark 中使用 HashingTF
创建了词频。我得到了每个单词使用 tf.transform
的术语频率。
但结果是以这种格式显示的。
[<hashIndexofHashBucketofWord1>,<hashIndexofHashBucketofWord2> ...]
,[termFrequencyofWord1, termFrequencyOfWord2 ....]
例如:
(1048576,[105,3116],[1.0,2.0])
我可以使用 tf.indexOf("word")
.
获取哈希桶中的索引
但是,如何使用索引获取单词?
嗯,你不能。由于散列是非单射的,因此没有反函数。换句话说,无限数量的令牌可以映射到一个桶中,因此无法判断哪个是实际存在的。
如果您使用的是大哈希并且唯一标记的数量相对较少,那么您可以尝试创建一个从存储桶到数据集中可能标记的查找 table。它是一对多的映射,但如果满足上述条件,冲突的数量应该相对较少。
如果您需要可逆变换,您可以使用组合 Tokenizer
and StringIndexer
并手动构建稀疏特征向量。
另请参阅:
编辑:
在 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')
Scala:
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,依此类推。
我在 Spark 中使用 HashingTF
创建了词频。我得到了每个单词使用 tf.transform
的术语频率。
但结果是以这种格式显示的。
[<hashIndexofHashBucketofWord1>,<hashIndexofHashBucketofWord2> ...]
,[termFrequencyofWord1, termFrequencyOfWord2 ....]
例如:
(1048576,[105,3116],[1.0,2.0])
我可以使用 tf.indexOf("word")
.
但是,如何使用索引获取单词?
嗯,你不能。由于散列是非单射的,因此没有反函数。换句话说,无限数量的令牌可以映射到一个桶中,因此无法判断哪个是实际存在的。
如果您使用的是大哈希并且唯一标记的数量相对较少,那么您可以尝试创建一个从存储桶到数据集中可能标记的查找 table。它是一对多的映射,但如果满足上述条件,冲突的数量应该相对较少。
如果您需要可逆变换,您可以使用组合 Tokenizer
and StringIndexer
并手动构建稀疏特征向量。
另请参阅:
编辑:
在 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')
Scala:
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,依此类推。