2016-05-01 4 views
8

मैं टेक्स्ट मैट्रिक्स को TF-IDF मैट्रिक्स में कनवर्ट करने के लिए निम्न कोड चलाता हूं।कैसे टीटीएफ-आईडीएफ द्वारा गणना की जाती है scikit-learn TfidfVectorizer

text = ['This is a string','This is another string','TFIDF computation calculation','TfIDF is the product of TF and IDF'] 

from sklearn.feature_extraction.text import TfidfVectorizer 
vectorizer = TfidfVectorizer(max_df=1.0, min_df=1, stop_words='english',norm = None) 

X = vectorizer.fit_transform(text) 
X_vovab = vectorizer.get_feature_names() 
X_mat = X.todense() 
X_idf = vectorizer.idf_ 

मैं निम्नलिखित उत्पादन

X_vovab =

[u'calculation', 
u'computation', 
u'idf', 
u'product', 
u'string', 
u'tf', 
u'tfidf'] 

हो और X_mat =

([[ 0.  , 0.  , 0.  , 0.  , 1.51082562, 
     0.  , 0.  ], 
    [ 0.  , 0.  , 0.  , 0.  , 1.51082562, 
     0.  , 0.  ], 
    [ 1.91629073, 1.91629073, 0.  , 0.  , 0.  , 
     0.  , 1.51082562], 
    [ 0.  , 0.  , 1.91629073, 1.91629073, 0.  , 
     1.91629073, 1.51082562]]) 

अब मैं समझता हूँ कि कैसे इन अंकों की गणना नहीं है। मेरा विचार यह है कि पाठ [0] के लिए, केवल 'स्ट्रिंग' के लिए स्कोर की गणना की जाती है और 5 वें coloumn में स्कोर होता है। लेकिन चूंकि टीएफ_आईडीएफ शब्द आवृत्ति का उत्पाद है जो 2 और आईडीएफ है जो लॉग (4/2) है 1.3 9 और मैट्रिक्स में दिखाए गए 1.51 नहीं। टीके-आईडीएफ स्कोर विज्ञान-सीखने में गणना कैसे किया जाता है।

उत्तर

9

TF-आईडीएफ प्राप्त किया जाता है Scikit द्वारा कई चरणों में किया जाता है की जानें TfidfVectorizer है, जो वास्तव में TfidfTransformer उपयोग करता है और CountVectorizer इनहेरिट करती है।

मुझे चरणों इसे और अधिक सरल बनाने के लिए करता है संक्षेप में प्रस्तुत करते हैं:

  1. TFS CountVectorizer के fit_transform द्वारा गणना कर रहे हैं()
  2. आईडीएफ TfidfTransformer के फिट द्वारा गणना कर रहे हैं()
  3. tfidfs TfidfTransformer के द्वारा गणना कर रहे हैं ट्रांसफॉर्म()

आप स्रोत कोड here देख सकते हैं।

आपके उदाहरण पर वापस जाएं।यहाँ गणना कि शब्दावली के 5 वें कार्यकाल के लिए tfidf वजन के लिए किया जाता है, 1 दस्तावेज़ (X_mat [0,4]):

पहले, 'स्ट्रिंग' के लिए tf, 1 दस्तावेज़ में:

tf = 1 

दूसरा, 'स्ट्रिंग' के लिए आईडीएफ, चौरसाई सक्षम (डिफ़ॉल्ट व्यवहार) के साथ:

df = 2 
N = 4 
idf = ln(N + 1/df + 1) + 1 = log (5/3) + 1 = 1.5108256238 

और अंत में, (दस्तावेज़ 0, सुविधा 4) के लिए tfidf वजन:

tfidf(0,4) = tf * idf = 1 * 1.5108256238 = 1.5108256238 

मैंने देखा कि आप tfidf मैट्रिक्स को सामान्यीकृत नहीं करना चुनते हैं। ध्यान रखें कि tfidf मैट्रिक्स सामान्यीकृत करना आम है और आमतौर पर अनुशंसित दृष्टिकोण है, क्योंकि अधिकांश मॉडलों को सामान्यीकृत होने के लिए फीचर मैट्रिक्स (या डिज़ाइन मैट्रिक्स) की आवश्यकता होगी।

TfidfVectorizer एल-2 गणना के अंतिम चरण के रूप में डिफ़ॉल्ट रूप से आउटपुट मैट्रिक्स को सामान्यीकृत करेगा। इसे सामान्यीकृत करने का मतलब है कि इसमें केवल 0 और 1.

+0

यह वास्तव में अच्छा जवाब है !! मैंने पूरे दिन इसे समझ लिया। @ खरगोश क्या आप इस उदाहरण में दिखा सकते हैं कि सामान्यीकरण कैसे लागू किया जाता है? – Himadri

3

सटीक गणना सूत्र docs में दी गई है:

वास्तविक tf-आईडीएफ के लिए इस्तेमाल किया सूत्र है tf * (आईडीएफ + 1) = tf + tf * आईडीएफ, tf * आईडीएफ के बजाय

और

जोड़ने, आवृत्तियों दस्तावेज़ के लिए के रूप में अगर एक अतिरिक्त दस्तावेज ठीक एक बार संग्रह में हर शब्द के शामिल होने में देखा गया था द्वारा चिकना आईडीएफ वजन।

इसका मतलब है कि 1.51082562 रूप 1.51082562=1+ln((4+1)/(2+1))

+0

के बीच वजन होगा, इसलिए 1.51 केवल आईडीएफ स्कोर का प्रतिनिधित्व करता है, न कि टीएफ-आईडीएफ स्कोर। मुझे लगता है कि टीएफ-आईडीएफ स्कोर 2 * 1.51 = 3.02 होगा। – prashanth

+1

शब्द आवृत्ति केवल 1 है, है ना? यही कारण है कि हमारे पास 1 * 1.51 –

+0

है अब मैं इसे जाता हूं। धन्यवाद। – prashanth

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