हैशिंग वेक्टाइज़र और एक tfidf वेक्टराइज़र के बीच अंतर क्या है


11

मैं प्रत्येक दस्तावेज़ के लिए पाठ दस्तावेज़ों के शब्द वैक्टर में परिवर्तित कर रहा हूँ। मैं एक TfidfVectorizer और एक HashingVectorizer का उपयोग करके यह कोशिश की है

मैं समझता हूं कि अंकों HashingVectorizerको IDFअंकों की तरह ध्यान में नहीं रखा जाता TfidfVectorizerहै। जिस कारण से मैं अभी भी काम कर रहा हूं HashingVectorizerवह एक बड़ा लचीलापन है जो विशाल डेटासेट के साथ काम करता है, जैसा कि यहां और यहां बताया गया है । (मेरे मूल डेटासेट में 30 मिलियन दस्तावेज हैं)

वर्तमान में, मैं 45339 दस्तावेजों के नमूने के साथ काम कर रहा हूं, इसलिए, मेरे पास एक के साथ TfidfVectorizerभी काम करने की क्षमता है । जब मैं समान 45339 दस्तावेजों पर इन दो वेक्टर का उपयोग करता हूं, तो मुझे जो मैट्रीस मिलते हैं, वे अलग-अलग होते हैं।

hashing = HashingVectorizer()
with LSM('corpus.db')) as corpus:
    hashing_matrix = hashing.fit_transform(corpus)
print(hashing_matrix.shape) 

हैशिंग मैट्रिक्स आकार (45339, 1048576)

tfidf = TfidfVectorizer()
with LSM('corpus.db')) as corpus:
    tfidf_matrix = tfidf.fit_transform(corpus)
print(tfidf_matrix.shape) 

tfidf मैट्रिक्स आकार (45339, 663307)

मैं ए HashingVectorizerऔर ए के बीच के अंतर को बेहतर ढंग से समझना चाहता हूं TfidfVectorizer, और यही कारण है कि ये मैट्रिस अलग-अलग आकारों में हैं - विशेष रूप से शब्दों और शब्दों की संख्या में।


क्या आप कृपया मेरे साथ डेटासेट साझा कर सकते हैं? (प्रतिक्रिया को हटाने के लिए)
n narza

जवाबों:


7

मुख्य अंतर यह है कि HashingVectorizerप्रत्येक दस्तावेज़ में आवृत्ति की गणना के लिए एक हैशिंग फ़ंक्शन लागू होता है, जहां प्रत्येक दस्तावेज़ में TfidfVectorizerउन शब्दों की आवृत्ति आवृत्ति की गणना होती है जो उन शब्दों को दंडित करते हैं जो कोरपस में अधिक व्यापक रूप से दिखाई देते हैं। यहाँ एक बहुत अच्छा सारांश है: https://spark.apache.org/docs/latest/mllib-feature-ext.net.html

  • हैश फ़ंक्शन सुविधाओं के लिए मानचित्रण शर्तों का एक कुशल तरीका है; जरूरी नहीं कि इसे केवल टर्म फ्रीक्वेंसी के लिए ही लागू किया जाए, लेकिन HashingVectorizerयहां काम किया जाता है। 45339 दस्तावेजों के साथ, मुझे संदेह है कि सुविधा वेक्टर की लंबाई 1048576 है क्योंकि यह डिफ़ॉल्ट 2 ^ 20 है n_features; आप इसे कम कर सकते हैं और इसे संसाधित करने के लिए कम खर्चीला बना सकते हैं, लेकिन टकराव के बढ़ते जोखिम के साथ, जहां फ़ंक्शन एक ही सुविधा के लिए विभिन्न शर्तों को मैप करता है: http://preshing.com/20110504/hash-collision-probabilities/

  • वैक्टर शब्द के लिए उपयोग के मामले के आधार पर, हैश फीचर वेक्टर की लंबाई को कम करना संभव हो सकता है (और इस प्रकार जटिलता) सटीकता / प्रभावशीलता के लिए स्वीकार्य नुकसान के साथ काफी (टक्कर बढ़ने के कारण)। Scikit-learn में कुछ हैशिंग पैरामीटर हैं जो उदाहरण के लिए सहायता कर सकते हैं alternate_sign

  • यदि हैशिंग मैट्रिक्स शब्दकोष से अधिक व्यापक है, तो इसका मतलब यह होगा कि हैशिंग मैट्रिक्स में कई स्तंभ प्रविष्टियां खाली होंगी, और सिर्फ इसलिए नहीं कि किसी दिए गए दस्तावेज़ में एक विशिष्ट शब्द नहीं है, बल्कि इसलिए कि वे पूरे खाली हैं। आव्यूह। यदि ऐसा नहीं है, तो यह एक ही फीचर हैश पर कई शर्तें भेज सकता है - यह वह 'टक्कर' है जिसके बारे में हम बात कर रहे हैं। HashingVectorizerएक सेटिंग है जो alternate_signइसे डिफ़ॉल्ट रूप से कहे जाने वाले को कम करने के लिए काम करती है , यहाँ वर्णित है: en.wikipedia.org/wiki/Feature_hashing#Properties

  • 'टर्म फ़्रीक्वेंसी - इनवर्स डॉक्युमेंट फ़्रीक्वेंसी' प्रत्येक डॉक्यूमेंट में टर्म फ़्रीक्वेंसी लेती है और उन शब्दों को पेनल्टी करके वेट करती है जो पूरे कॉर्पस में अधिक बार दिखाई देते हैं। अंतर्ज्ञान यह है कि स्थितिजन्य रूप से पाए जाने वाले शब्द एक विशिष्ट दस्तावेज़ के विषय के प्रतिनिधि होने की अधिक संभावना है। यह एक हैशिंग फ़ंक्शन के लिए अलग है, इसके विपरीत शब्दाडंबर में शब्द का एक पूरा शब्दकोश होना आवश्यक है ताकि उलटा दस्तावेज़ आवृत्ति की गणना की जा सके। मुझे उम्मीद है कि कॉर्पस में आपके tf.idf मैट्रिक्स आयाम 663307 शब्दों द्वारा 45339 दस्तावेज़ हैं; मैनिंग एट अल गणना के अधिक विवरण और उदाहरण प्रदान करते हैं: https://nlp.stanford.edu/IR-book/html/htmledition/term-frequency-and-weighting-1.html

Leskovec et al द्वारा as बड़े पैमाने पर डेटासेट का खनन ’फीचर हैशिंग और tf.idf दोनों पर विस्तार से एक टन है, लेखकों ने यहां पीडीएफ उपलब्ध कराया है: http://www.mmds.org/


1
यदि tfidf vectorizerआईडीएफ गणना के लिए शब्दों की एक पूरी शब्दकोश की जरूरत है, तो क्या टिफ़िड मैट्रिक्स में शब्द हैशिंग मैट्रिक्स में शर्तों से अधिक नहीं होना चाहिए?
मीनू

2
यदि हैशिंग मैट्रिक्स शब्दकोष से अधिक व्यापक है, तो इसका मतलब यह होगा कि हैशिंग मैट्रिक्स में कई स्तंभ प्रविष्टियां खाली होंगी, और सिर्फ इसलिए नहीं कि किसी दिए गए दस्तावेज़ में एक विशिष्ट शब्द नहीं है, बल्कि इसलिए कि वे पूरे खाली हैं। आव्यूह। थोड़ा ऑफ-टॉपिक, लेकिन क्या आप वेक्टर करने से पहले अपने दस्तावेजों में शब्दों के लिए कोई प्रसंस्करण कर रहे हैं? स्टॉपवॉच, स्टेमिंग, आदि?
redhqs

हां, मैं प्रोसेस कर रहा हूं। मैं स्पास का उपयोग कर रहा हूं।
मीनू

1
पुष्टिकरण: यदि n_features का उल्लेख नहीं किया गया है, तो 1048576 किसी भी हैशिंग मैट्रिक्स की डिफ़ॉल्ट लंबाई है? यदि वास्तव में कॉर्पस में केवल 663307 शब्द हैं, तो शेष 385269 सुविधाएँ खाली हैं। सभी खाली सुविधाओं के बिना यह हैशिंग मैट्रिक्स स्नग कैसे बना सकता है?
मीनू

1
यह सही है - आप पैरामीटर को बदलकर सुविधाओं की संख्या का आकार बदल सकते हैं n_features=1048576, यदि आपके पास समय है 640k, 320k और देखें कि क्या यह आपकी सटीकता पर बहुत अधिक प्रभाव डालता है। इसे कम से कम अपने प्रशिक्षण समय को तेज करना चाहिए। @ नाथन का जवाब देखें n_features=5!
redhqs

5

HashingVectorizerएक पैरामीटर है n_featuresजो 1048576डिफ़ॉल्ट रूप से। हैशिंग के बाद, वे वास्तव में हर एक के लिए उपयोग करने के लिए एक अनूठे सूचकांक में एक शब्द मानचित्रण शब्द की गणना नहीं करते हैं। इसके बजाय, आप बस प्रत्येक शब्द को हैश करते हैं और एक बड़े आकार का उपयोग करते हैं, जिसकी आपको बहुत अधिक टक्कर होने की उम्मीद नहीं है hash(term) mod table_size:। आप सेट किए गए मैट्रिक्स को किसी भी आकार में सेट कर सकते हैं n_features। यदि आपको नहीं लगता कि डिफ़ॉल्ट उचित है (बड़ा होने पर कम टकराव होगा, जबकि यह अधिक मेमोरी लेता है), तो आपको इसे अपने कॉर्पस के लिए सही बॉलपार्क में समायोजित करना चाहिए।

from sklearn.feature_extraction.text import HashingVectorizer
vectorizer = HashingVectorizer()
print(vectorizer.transform(['a very small document']).shape)
(1, 1048576)

small_vectorizer = HashingVectorizer(n_features=5)
print(small_vectorizer.transform(['a very small document']).shape)    
(1, 5)

0

HashingVectorizer और CountVectorizer (नोट नहीं Tfidfvectorizer) एक ही काम करने के लिए हैं। जो कि टोकन डॉक्यूमेंट के मैट्रिक्स में टेक्स्ट डॉक्यूमेंट के संग्रह को परिवर्तित करना है।

यदि आप अपने रिश्तेदार महत्व (IDF) द्वारा भारित आवृत्तियों को प्राप्त करना चाहते हैं तो Tfidfvectorizer का उपयोग करना चाहिए। यदि आपको कच्ची गणना या सामान्यीकृत गणना (टर्म फ़्रीक्वेंसी) की आवश्यकता है, तो आपको काउंटवेक्टराइज़र या हैशिंगविक्टर का उपयोग करना चाहिए।

HashingVectorizer के बारे में जानने के लिए, HashingVectorizer बनाम CountVectorizer के इस लेख को देखें ।

Tfidfvectorizer के बारे में अधिक जानकारी के लिए, Tfidftransformer और Tfidfvectorctor का उपयोग करने के तरीके पर यह लेख देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.