python - TF-IDF的纯pandas实现

标签 python pandas scikit-learn tf-idf tfidfvectorizer

我想知道为什么我的 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

编辑:

我发现 sklearn idf 与我的 idf 不完全相同,但我认为我们可以将其归因于浮点精度:

sklearn idf: [1.69314718 1.         1.         1.         1.69314718]
my idf:      [1.693147   1.000000   1.000000   1.000000   1.693147]

即使我使用 sklearn idf,我仍然会得到不同的结果。

此外,如果我不规范化并使用 sklearn idf 值,则只有第二个文档的 dd 的 TF-IDF 不同:

sk_tfv = TfidfVectorizer(smooth_idf=False, stop_words=None, token_pattern=r"(?u)\b\w+\b", sublinear_tf=True, norm=None)
x = sk_tf.fit_transform(text)
sk_tf_idf = pd.DataFrame(x.toarray())
...
idf = sk_tfv.idf_
tf_idf = tf * idf


>>> tf_idf - sk_tf_idf
     aa  bb  cc       dd     ee
0   0.0 0.0 0.0 0.000000    0.0
1   0.0 0.0 0.0 0.306853    0.0

这意味着两件事:
1.问题是我的TF。然而,这很容易检查,但似乎并非如此。或者,
2. sklearn 不仅可以执行 TF * IDF,还可以执行更多我必须研究的事情。

最佳答案

我傻了。在深入了解 sklearn 源代码后,我注意到了 sublinear_tf 参数。将此参数设置为 True 后,术语频率将替换为 log(TF) + 1 并且恰好是我将此参数设置为 True :)

要在 pandas 中实现次线性 TF,这应该可行:

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

关于python - TF-IDF的纯pandas实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52963703/

相关文章:

python - 为什么 Python 的函数调用语义传入关键字参数没有顺序?

javascript - 无法输入 django Chartit 格式化程序字段

python - 如何在 Django 1.7 模型中创建键值数据类型

scikit-learn - 将 scikit-learn SVM 模型转换为 LibSVM

python - 没有估计器的 plot_confusion_matrix

python - 带有 dict.fromkeys() 和类字典对象的 KeyError

python - 如何重置 Pandas 数据框中的索引?

python - 从每行数据框中的列中删除不在列表中的字符串

python - 在迭代到 .append() 元素期间创建新的列表名称

python - 用于 Python 的 Pandas : Exception: Data must be 1-dimensional