2015-08-29 11 views
9

मैंने स्पार्क में HashingTF का उपयोग कर टर्म फ्रीक्वेंसी बनाई है। मुझे प्रत्येक शब्द के लिए tf.transform का उपयोग आवृत्ति शब्द मिला है।स्पार्क एमएल लिब में टीएफ वेक्टर आरडीडी से शब्द विवरण कैसे प्राप्त करें?

लेकिन परिणाम इस प्रारूप में दिखाए जा रहे हैं।

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

जैसे:

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

मैं हैश बाल्टी में सूचकांक प्राप्त करने के लिए, tf.indexOf("word") का उपयोग कर में सक्षम हूँ।

लेकिन, मैं इंडेक्स का उपयोग करके शब्द कैसे प्राप्त कर सकता हूं?

उत्तर

20

ठीक है, आप नहीं कर सकते। चूंकि हैशिंग गैर-इंजेक्शन है, इसमें कोई व्यस्त कार्य नहीं है। दूसरे शब्दों में टोकन की अनंत संख्या एक बाल्टी को मैप कर सकती है, इसलिए यह कहना असंभव है कि वास्तव में कौन सा है।

यदि आप एक बड़े हैश का उपयोग कर रहे हैं और अद्वितीय टोकन की संख्या अपेक्षाकृत कम है तो आप अपने डेटासेट से बाल्टी से संभावित टोकन तक लुकअप टेबल बनाने का प्रयास कर सकते हैं। यह एक से कई मैपिंग है लेकिन यदि उपरोक्त स्थितियों को पूरा किया जाता है तो विवादों की संख्या अपेक्षाकृत कम होनी चाहिए।

यदि आपको एक परिवर्तनीय परिवर्तन की आवश्यकता है तो आप Tokenizer और StringIndexer गठबंधन का उपयोग कर सकते हैं और मैन्युअल रूप से एक स्पैस फीचर वेक्टर बना सकते हैं।

यह भी देखें: What hashing function does Spark use for HashingTF and how do I duplicate it?

संपादित:

स्पार्क में 1.5+ (PySpark 1.6+) आप प्रतिवर्ती परिवर्तन और दुकानों शब्दावली लागू होता है CountVectorizer उपयोग कर सकते हैं।

पायथन:

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 स्थान पर तत्व सूचकांक 1 और इतने पर करने के लिए 1 की स्थिति में सूचकांक 0, तत्व से मेल खाती है।

+1

मैं इसे जोड़ना चाहूंगा जैसा कि आप [docs] (https://spark.apache.org/docs/1.6.0/api/python/pyspark.mllib.html) में 1.2.0 के बाद देख सकते हैं , आप indexOf (टर्म) को कॉल कर सकते हैं – Matt

संबंधित मुद्दे