2016-01-17 6 views
5

मैं sckit-learn पर बिल्कुल नया हूं और उलझन में हूं क्योंकि TfidVectorizer कभी-कभी एक ही दस्तावेज़ के लिए एक अलग वेक्टर लौटा रहा है।scikit TfidfVectorizer.transform() उसी दस्तावेज़ के लिए अलग-अलग परिणाम देता है

मेरे कॉर्पस में> 100 दस्तावेज़ हैं।

मैं चल रहा हूँ:

vectorizer = TfidfVectorizer(ngram_range=(1, 2), token_pattern=r'\b\w+\b', min_df=1) 

X = vectorizer.fit_transform(corpus) 

TfidVectorizer प्रारंभ करने और कोष में दस्तावेजों को फिट करने के लिए। corpus टेक्स्ट स्ट्रिंग्स की एक सूची है।

बाद में, अगर मैं कार्य करें:

test = list(vectorizer.transform([corpus[0]]).toarray()[0]) 

test == list(X.toarray()[0]) 

परिणाम False है।

यदि मैं क्रमशः list(X.toarray()[0]) और test के पहले 20 आइटम प्रिंट करता हूं, तो आप देख सकते हैं कि वे एक अंश से दूर हैं, जब मैं उन्हें समान होने की अपेक्षा करता हूं।

[0.16971458376720741, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] 

बनाम

[0.16971458376720716, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] 

लेकिन अगर मैं कार्य करें:

test_1 = list(vectorizer.transform([corpus[0]).toarray()[0]) 
test_2 = list(vectorizer.transform([corpus[0]).toarray()[0]) 
test_1 == test_2 

परिणाम True है। ऊपर, मैं अनिवार्य रूप से वेक्टर की गणना दो बार कर रहा हूं, जो मैंने सोचा था कि मैं पहले उदाहरण में कर रहा था (चूंकि एक्स fit_transform के दौरान वापस आने वाले वैक्टर रखता है)।

क्यों, मेरे पहले उदाहरण में वेक्टर अलग हैं? क्या मुझसे यहां कुछ गलत हो रहा है?

+2

बिल्कुल सही नहीं है कि क्या हो रहा है, कुछ प्रकार की राउंडिंग त्रुटि शायद, मुझे लगता है कि यह शायद चिंताजनक नहीं है। – maxymoo

+0

हम्म ठीक है। हाँ बस मुझे परेशान कर रहा था। प्रतिक्रिया के लिए धन्यवाद। – deef

उत्तर

0

जैसा कि एक टिप्पणी में बताया गया है, यह एक गोल करने की त्रुटि की संभावना है और शायद चिंताजनक के बारे में चिंताजनक नहीं है।

हालांकि मुझे लगता है कि यह घटना को समझने की कोशिश करने लायक है।

शायद क्या हो रहा है एक गोल त्रुटि है। ये त्रुटियां कभी-कभी होती हैं क्योंकि आपके कंप्यूटर पर संख्याएं अनंत परिशुद्धता नहीं हैं: एक सामान्य संख्यात्मक फ्लोट 64 बिट पर संग्रहीत की जाएगी।

तथ्य यह है कि वे सीमित परिशुद्धता के हैं, इसका मतलब है कि अतिरिक्त अब सहयोगी: ए + (बी + सी) हमेशा बिल्कुल नहीं है (ए + बी) + सी।

इसे व्यावहारिक रूप में व्यवहार दिखाने के लिए कोशिश करते हैं:

import numpy as np 

a = np.random.random(size=1000000) 
print(a.dtype) 
print("%.15f" % a.sum()) 
b = np.random.permutation(a) 
print("%.15f" % b.sum()) 

आउटपुट:

float64 
500399.674621732032392 
500399.674621731741354 

अब अगर हम 32 बिट पर तैरता के साथ प्रयास करने के लिए ऊपर स्क्रिप्ट का विस्तार:

a = a.astype(np.float32) 
print(a.dtype) 
print("%.15f" % a.sum()) 
b = np.random.permutation(a) 
print("%.15f" % b.sum()) 

हमें मिलता है:

float64 
500214.871674167399760 
500214.871674167283345 
float32 
500214.937500000000000 
500215.000000000000000 

आप देख सकते हैं कि त्रुटि बहुत अधिक है: ऐसा इसलिए है क्योंकि 64 बिट्स पर फ्लोट 64 बिट्स पर फ्लोट से कम सटीक हैं।

अब अगर आपको लगता है इस भयानक है और आप अधिक जानना चाहते हैं, numpy आप np.finfo समारोह के माध्यम से तैरता के भंडारण के बारे में विवरण देता है:

In [10]: np.finfo(np.float32) 
Out[10]: finfo(resolution=1e-06, min=-3.4028235e+38, max=3.4028235e+38, dtype=float32) 

माफ करना, मैं आपके सवाल का जवाब नहीं दिया;)। हो सकता है कि आपके मामले में त्रुटि का कारण बिल्कुल वैसा ही नहीं है जो मैंने समझाया है, मैं इसे लिख रहा हूं क्योंकि मुझे लगता है कि अगर आप इस समस्या से परिचित थे तो आप उस प्रश्न को पहले स्थान पर नहीं पूछ पाएंगे।

उम्मीद है कि यह वैसे भी मदद करता है!

+0

इसके लिए धन्यवाद। चूंकि यह संभवतः इस प्रश्न में चल रहे अन्य लोगों के लिए सहायक है इसलिए मैं इसे उत्तर के रूप में स्वीकार कर रहा हूं। – deef

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