2015-08-29 32 views
9

Spark'de HashingTF kullanarak Dönem Frekansı oluşturdum. Her kelime için tf.transform kullanarak frekans terimleri var.Spark ML Lib'deki TF Vector RDD'den kelime detayları nasıl elde edilir?

Ancak sonuçlar bu biçimde gösteriliyor.

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

örn:

(1048576,[105,3116],[1.0,2.0]) 

Ben tf.indexOf("word") kullanarak, karma kova endeksi almak mümkün.

Ancak, dizini kullanarak sözcüğü nasıl alabilirim?

cevap

20

Yapamazsınız. Haslanma, non-enjektif olduğundan, ters fonksiyon yoktur. Başka bir deyişle, sonsuz sayıda jeton, tek bir kova ile eşleştirilebilir, böylece hangisinin gerçekte olduğunu söylemek imkansızdır.

Büyük bir karma sayı ve benzersiz sayıda belirteç kullanıyorsanız, göreceli olarak düşük bir sayıysa, veri kümenizden olası bir jetona kadar bir arama tablosu oluşturmayı deneyebilirsiniz. Bire-çok haritalamadır, ancak yukarıdaki şartlar yerine getirildiğinde, çatışma sayısı nispeten düşük olmalıdır.

Geri dönüşümlü bir dönüşüme ihtiyacınız varsa, Tokenizer ve StringIndexer birleştirmelerini kullanabilir ve el ile bir seyrek özellik vektörü oluşturabilirsiniz.

Ayrıca bakınız: What hashing function does Spark use for HashingTF and how do I duplicate it?

Düzenleme: Kıvılcım olarak

1.5+ (PySpark 1.6+) Eğer geri dönüşümlü dönüşümü ve depolar kelime geçerlidir CountVectorizer kullanabilirsiniz.

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. pozisyonda elemanı böylece indeksi 1 ve 1 pozisyonunda indeksi 0, elemana karşılık gelir

.

+1

Bunu 1.2.0'dan beri [docs] (https://spark.apache.org/docs/1.6.0/api/python/pyspark.mllib.html) adresinde görebileceğiniz gibi eklemek isterim , indexOf (term) çağırabilirsiniz – Matt