apache spark - quantilediscretizer - ¿Cómo obtener detalles de palabras de TF Vector RDD en Spark ML Lib?
quantilediscretizer pyspark (1)
Pues no puedes. Como el hash no es inyectivo, no hay función inversa. En otras palabras, se puede asignar un número infinito de tokens a un solo cubo, por lo que es imposible saber cuál está realmente allí.
Si está utilizando un hash grande y el número de tokens únicos es relativamente bajo, puede intentar crear una tabla de búsqueda desde el depósito hasta los posibles tokens de su conjunto de datos. Es un mapeo de uno a muchos, pero si se cumplen las condiciones anteriores, el número de conflictos debería ser relativamente bajo.
Si necesita una transformación reversible, puede usar la combinación de
Tokenizer
y
StringIndexer
y crear un vector de características disperso manualmente.
Ver también: ¿Qué función de hashing usa Spark para HashingTF y cómo la duplico?
Editar :
En Spark 1.5+ (PySpark 1.6+) puede usar
CountVectorizer
que aplica transformación reversible y almacena vocabulario.
Pitón:
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)
donde el elemento en la posición 0 corresponde al índice 0, elemento en la primera posición al índice 1 y así sucesivamente.
He creado Frecuencia de término usando
HashingTF
en Spark.
Tengo el término frecuencias usando
tf.transform
para cada palabra.
Pero los resultados se muestran en este formato.
[<hashIndexofHashBucketofWord1>,<hashIndexofHashBucketofWord2> ...]
,[termFrequencyofWord1, termFrequencyOfWord2 ....]
p.ej:
(1048576,[105,3116],[1.0,2.0])
Puedo obtener el índice en hash bucket, usando
tf.indexOf("word")
.
Pero, ¿cómo puedo obtener la palabra usando el índice?