2016-04-20 6 views
3

Ich denke, die Funktion TfidfVectorizer berechnet nicht korrekt den IDF-Faktor. Zum Beispiel Kopieren Sie den Code aus tf-idf feature weights using sklearn.feature_extraction.text.TfidfVectorizer:Berechnung von IDF mit TfidfVectorizer von sklearn.feature_extraction.text.TfidfVectorizer

from sklearn.feature_extraction.text import TfidfVectorizer 
corpus = ["This is very strange", 
      "This is very nice"] 
vectorizer = TfidfVectorizer(
         use_idf=True, # utiliza o idf como peso, fazendo tf*idf 
         norm=None, # normaliza os vetores 
         smooth_idf=False, #soma 1 ao N e ao ni => idf = ln(N+1/ni+1) 
         sublinear_tf=False, #tf = 1+ln(tf) 
         binary=False, 
         min_df=1, max_df=1.0, max_features=None, 
         strip_accents='unicode', # retira os acentos 
         ngram_range=(1,1), preprocessor=None,    stop_words=None, tokenizer=None, vocabulary=None 
      ) 
X = vectorizer.fit_transform(corpus) 
idf = vectorizer.idf_ 
print dict(zip(vectorizer.get_feature_names(), idf)) 

Die Ausgabe lautet:

{u'is': 1.0, 
u'nice': 1.6931471805599454, 
u'strange': 1.6931471805599454, 
u'this': 1.0, 
u'very': 1.0}` 

Aber sein sollte:

{u'is': 0.0, 
u'nice': 0.6931471805599454, 
u'strange': 0.6931471805599454, 
u'this': 0.0, 
u'very': 0.0} 

es nicht? Was mache ich falsch?

Während der Berechnung der IDF, nach http://www.tfidf.com/ ist:

IDF(t) = log_e(Total number of documents/Number of documents with term t in it) 

So wie die Begriffe 'this', 'ist' und 'sehr' in zwei Sätzen erscheinen, die IDF = log_e (2/2) = 0.

Die Begriffe 'seltsam' und 'nett' erscheinen nur in einem der beiden Dokumente, also log_e (2/1) = 0,69314.

+0

Hallo Priscilla. Ich bin kein Python-Benutzer, aber können Sie klarstellen, was Sie vorhaben und auf welches Problem Sie gestoßen sind? Sie erhalten eher Antworten von Experten, wenn sie Ihr genaues Ziel verstehen, warum Sie es versuchen Um es zu erreichen, und warum die Ausgabe falsch ist. Viel Glück, eine Antwort zu bekommen, und willkommen zu Stack Overflow! –

+0

Ich muss wirklich verstehen, was ich tun kann, um die richtigen Tf-IDF-Werte mit dieser Sklearn-Funktion zu erhalten, weil sie zurückkehren falsch –

Antwort

5

Zwei Dinge passieren, dass Sie in der sklearn implimentation nicht erwarten:

  1. Die TfidfTransformer hat smooth_idf=True als Standard-param
  2. Es ist immer 1 auf das Gewicht

es so fügt verwendet:

idf = log(1 + samples/documents) + 1 

Hier ist es in der Quelle:

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/feature_extraction/text.py#L987-L992

EDIT: Sie konnten die Standard TfidfVectorizer Klasse wie diese Unterklasse:

import scipy.sparse as sp 
import numpy as np 
from sklearn.feature_extraction.text import (TfidfVectorizer, 
              _document_frequency) 
class PriscillasTfidfVectorizer(TfidfVectorizer): 

    def fit(self, X, y=None): 
     """Learn the idf vector (global term weights) 
     Parameters 
     ---------- 
     X : sparse matrix, [n_samples, n_features] 
      a matrix of term/token counts 
     """ 
     if not sp.issparse(X): 
      X = sp.csc_matrix(X) 
     if self.use_idf: 
      n_samples, n_features = X.shape 
      df = _document_frequency(X) 

      # perform idf smoothing if required 
      df += int(self.smooth_idf) 
      n_samples += int(self.smooth_idf) 

      # log+1 instead of log makes sure terms with zero idf don't get 
      # suppressed entirely. 
      ####### + 1 is commented out ########################## 
      idf = np.log(float(n_samples)/df) #+ 1.0 
      ####################################################### 
      self._idf_diag = sp.spdiags(idf, 
             diags=0, m=n_features, n=n_features) 

     return self 
+0

Ich habe bereits alle Parameter als falsch gesetzt, aber die Antwort bleibt immer noch falsch –

+0

Die '+ 1' am Ende der Formel kann nicht in den Params geändert werden.Wenn Sie Ihre erwartete Antwort erhalten wollen, verwenden Sie' smooth_idf = Falsch und subtrahiere 1. – zemekeneng

+0

Vielen Dank. –

Verwandte Themen