Каков самый простой способ получить tfidf с помощью pandas dataframe?

Я хочу рассчитать tf-idf из приведенных ниже документов. Я использую python и pandas.

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']})

Сначала я подумал, что мне нужно будет получить word_count для каждой строки. Поэтому я написал простую функцию:

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

И затем я применил его к каждой строке.

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

Но теперь я потерян. Я знаю, что есть простой способ вычисления tf-idf, если я использую Graphlab, но я хочу придерживаться опции с открытым исходным кодом. И Sklearn, и gensim выглядят подавляющими. Какое самое простое решение для получения tf-idf?

Ответ 1

Внедрение Scikit-learn очень просто:

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

Имеется множество параметров, которые вы можете указать. См. Документацию здесь

Выход fit_transform будет разреженной матрицей, если вы хотите визуализировать его, вы можете сделать 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]])