为了账号安全,请及时绑定邮箱和手机立即绑定

TF-IDF 的纯 Pandas 实现

TF-IDF 的纯 Pandas 实现

慕勒3428872 2021-07-16 19:15:28
我想知道为什么我的 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 * idfnorm = np.sqrt((tf_idf ** 2).sum(axis=1))norm_tf_idf = tf_idf.div(norm, axis=0)>>> norm_tf_idf         aa        bb        cc        dd        ee0  0.572929  0.338381  0.338381  0.338381  0.5729291  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        ee0  0.572929  0.338381  0.338381  0.338381  0.5729291  0.000000  0.453295  0.453295  0.767495  0.000000或者,如果我们减去它们:>>> norm_tf_idf - sk    aa        bb        cc        dd   ee0  0.0  0.000000  0.000000  0.000000  0.01  0.0 -0.045046 -0.045046  0.049002  0.0
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我真笨。在 sklearn 源代码中潜水后,我注意到了该sublinear_tf参数。将此参数设置为 True 时,术语频率被替换为log(TF) + 1,恰好是我将此参数设置为True:)

要在熊猫中实现次线性 TF,这应该有效:

tf[tf > 0]  = np.log(tf[tf > 0] ) + 1


查看完整回答
反对 回复 2021-07-28
  • 1 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信