2016-05-01 9 views
8

Uruchom następujący kod, aby przekonwertować matrycę tekstową na macierz TF-IDF.W jaki sposób areTF-IDF obliczane przez 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_ 

uzyskać następujący wynik

X_vovab =

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

i 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]]) 

Teraz ja nie rozumiem, jak te wyniki są obliczane. Mój pomysł jest taki, że w tekście [0] oblicza się tylko wynik "struny", a punktacja jest w piątym koleżu. Ale jako TF_IDF jest iloczynem częstotliwości termicznej, która wynosi 2, a IDF, która jest log (4/2) wynosi 1,39, a nie 1,51, jak pokazano w macierzy. W jaki sposób oblicza się wynik TF-IDF w nauce scikit.

Odpowiedz

9

tfidf odbywa się w kilku etapach przez Scikit Dowiedz na TfidfVectorizer, która w rzeczywistości korzysta TfidfTransformer i dziedziczy CountVectorizer.

Pozwól mi podsumować kroki robi aby uczynić go bardziej proste:

  1. TFS są obliczane przez fit_transform CountVectorizer za()
  2. idfs są obliczane przez dopasowanie TfidfTransformer za()
  3. tfidfs są obliczane przez TfidfTransformer użytkownika transform()

Możesz sprawdzić kod źródłowy here.

Powrót do przykładu.Oto wyliczenie, które odbywa się na wadze tfidf dla 5. kadencji słownictwa, 1 dokument (X_mat [0,4]):

pierwsze, tf dla „string”, w 1. dokumentu:

tf = 1 

drugie, IDF dla 'string', z wygładzania włączony (domyślne zachowanie):

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

I wreszcie, waga tfidf dla dokumentu (0, funkcja 4):

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

Zauważyłem, że nie chcesz normalizować macierzy tfidf. Należy pamiętać, że normalizacja matrycy tfidf jest powszechną i zazwyczaj zalecaną metodą, ponieważ większość modeli wymaga znormalizowania macierzy cech (lub macierzy projektu).

TfidfVectorizer spowoduje, że L-2 normalizuje domyślnie macierz wyjściową, co jest ostatnim krokiem obliczeń. Po jego znormalizowaniu oznacza to, że będzie miał tylko masy od 0 do 1.

+0

To naprawdę dobra odpowiedź !! Spędziłem cały dzień na zrozumieniu tego. @Rabbit możesz pokazać w tym przykładzie, w jaki sposób stosuje się normalizację? – Himadri

3

Dokładna formuła obliczeń podano w docs:

Rzeczywisty wzór użyty do tfidf jest tf * (IDF + 1) = tf + tf * IDF zamiast tf * IDF

i

Gładkie IDF ciężary dodając jedną udokumentowanie częstotliwości, jakby dodatkowy dokument zawierający co zaobserwowano termin w kolekcji dokładnie raz.

Oznacza to 1.51082562 otrzymuje się 1.51082562=1+ln((4+1)/(2+1))

+0

, więc 1,51 reprezentuje tylko wynik IDF, a nie wynik TF-IDF. Wynik TF-IDF, jak sądzę, wynosiłby 2 * 1,51 = 3,02. – prashanth

+1

Termin częstotliwość to tylko 1, czyż nie? Właśnie dlatego mamy 1 * 1.51 –

+0

Teraz idę. Dzięki. – prashanth

Powiązane problemy