猿问

TF-IDF 的纯 Pandas 实现

我想知道为什么我的 TF-IDF 的 Pandas 实现显示的结果与 sklearn 实现略有不同。


这是我的实现:


text = ["aa bb cc dd ee", "bb cc dd dd"]


terms = [Counter(t.split(' ')) for t in text]

tf = pd.DataFrame(terms)

tf = tf.fillna(0)


num_docs = len(text)

idf = np.log(num_docs / tf[tf >= 1].count()) + 1 


tf_idf = tf * idf


norm = np.sqrt((tf_idf ** 2).sum(axis=1))

norm_tf_idf = tf_idf.div(norm, axis=0)


>>> norm_tf_idf

         aa        bb        cc        dd        ee

0  0.572929  0.338381  0.338381  0.338381  0.572929

1  0.000000  0.408248  0.408248  0.816497  0.000000

但是,如果我使用 sklearn:


tf = TfidfVectorizer(smooth_idf=False, stop_words=None, sublinear_tf=True)

x = tf.fit_transform(text)


sk = pd.DataFrame(x.toarray())

sk.columns = tf.get_feature_names()

sk


>>> sk

         aa        bb        cc        dd        ee

0  0.572929  0.338381  0.338381  0.338381  0.572929

1  0.000000  0.453295  0.453295  0.767495  0.000000

或者,如果我们减去它们:


>>> norm_tf_idf - sk

    aa        bb        cc        dd   ee

0  0.0  0.000000  0.000000  0.000000  0.0

1  0.0 -0.045046 -0.045046  0.049002  0.0


慕勒3428872
浏览 220回答 1
1回答

慕婉清6462132

我真笨。在 sklearn 源代码中潜水后,我注意到了该sublinear_tf参数。将此参数设置为 True 时,术语频率被替换为log(TF) + 1,恰好是我将此参数设置为True:)要在熊猫中实现次线性 TF,这应该有效:tf[tf > 0]  = np.log(tf[tf > 0] ) + 1
随时随地看视频慕课网APP

相关分类

Python
我要回答