2016-06-02 15 views
10

Voglio calcolare tf-idf dai documenti sottostanti. Sto usando Python e Panda.Qual è il modo più semplice per ottenere tfidf con dataframe panda?

import pandas as pd 
df = pd.DataFrame({'docId': [1,2,3], 
       'sent': ['This is the first sentence','This is the second sentence', 'This is the third sentence']}) 

In primo luogo, ho pensato che avrei bisogno di ottenere word_count per ogni riga. Così ho scritto una semplice funzione:

def word_count(sent): 
    word2cnt = dict() 
    for word in sent.split(): 
     if word in word2cnt: word2cnt[word] += 1 
     else: word2cnt[word] = 1 
return word2cnt 

E poi l'ho applicato a ogni riga.

df['word_count'] = df['sent'].apply(word_count) 

Ma ora mi sono perso. So che c'è un metodo semplice per calcolare tf-idf se uso Graphlab, ma voglio rimanere con un'opzione open source. Sia Sklearn che Gensim sembrano travolgenti. Qual è la soluzione più semplice per ottenere tf-idf?

risposta

13

scikit-learn implementazione è molto semplice:

from sklearn.feature_extraction.text import TfidfVectorizer 
v = TfidfVectorizer() 
x = v.fit_transform(df['sent']) 

Ci sono un sacco di parametri che è possibile specificare. Vedere la documentazione here

L'uscita del fit_transform sarà una matrice sparsa, se si vuole visualizzarlo si può fare x.toarray()

In [44]: x.toarray() 
Out[44]: 
array([[ 0.64612892, 0.38161415, 0.  , 0.38161415, 0.38161415, 
     0.  , 0.38161415], 
     [ 0.  , 0.38161415, 0.64612892, 0.38161415, 0.38161415, 
     0.  , 0.38161415], 
     [ 0.  , 0.38161415, 0.  , 0.38161415, 0.38161415, 
     0.64612892, 0.38161415]]) 
+0

Diciamo che ho passato da 100 a 'parametro max_features' e il vocabolario originale del corpus è 1000. Come ottengo i nomi delle funzionalità selezionate e le associamo alla matrice prodotta? –

+2

'v.get_feature_names()' ti darà l'elenco dei nomi delle funzionalità. 'v.vocabulary_' ti darà un' dict' con i nomi delle feature come chiavi e il loro indice nella matrice prodotta come valori. – arthur

+0

ja, ma attenzione alla stampa di feature_names(). se il numero di funzionalità aumenta, avrai problemi di memoria. –

Problemi correlati