我想知道为什么我的 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
添加回答
举报
0/150
提交
取消