web-dev-qa-db-ja.com

pandas dataframeでtfidfを取得する最も簡単な方法は何ですか?

以下のドキュメントからtf-idfを計算したい。私はpythonとパンダを使用しています。

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)

しかし、今私は迷っています。 Graphlabを使用する場合、tf-idfを計算する簡単な方法があることは知っていますが、オープンソースオプションに固執したいと思います。 Sklearnとgensimはどちらも圧倒的に見えます。 tf-idfを取得する最も簡単なソリューションは何ですか?

18
user1610952

Scikit-learnの実装は本当に簡単です:

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

指定できるパラメーターはたくさんあります。ドキュメントを参照してください here

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]])
_
27
arthur