CountVectorizer+TfidfTransformer 和 TfidfVectorizer 有啥区别

Posted

技术标签:

【中文标题】CountVectorizer+TfidfTransformer 和 TfidfVectorizer 有啥区别【英文标题】:What is the difference between CountVectorizer+TfidfTransformer and TfidfVectorizerCountVectorizer+TfidfTransformer 和 TfidfVectorizer 有什么区别 【发布时间】:2021-02-09 12:24:58 【问题描述】:

要对文本应用 ML 算法,它必须用数字表示。使用 sklearn 的一些方法是:

    CountVectorizer

    CountVectorizer + TfidfTransformer

    TfidfVectorizer

CountVectorizer+TfidfTransformer和TfidfVectorizer有什么区别?

【问题讨论】:

【参考方案1】:

无,见上方documentation page:

sklearn.feature_extraction.text.TfidfVectorizer
...
Equivalent to CountVectorizer followed by TfidfTransformer. 

【讨论】:

【参考方案2】:

使用 Tfidftransformer,您将使用 CountVectorizer 系统地计算字数,然后计算逆文档频率 (IDF) 值,然后再计算 Tf-idf 分数。

使用 Tfidfvectorizer 相反,您将同时完成所有三个步骤。在后台,它使用相同的数据集计算字数、IDF 值和 Tf-idf 分数。

所以现在您可能想知道,如果您可以分两步完成所有操作,为什么还要使用不必要的步骤。好吧,在某些情况下,您想在 Tfidfvectorizer 上使用 Tfidftransformer,但有时并不那么明显。以下是一般准则:

如果您需要不同任务的词频(词条计数)向量,请使用 Tfidftransformer。 如果您需要计算“训练”数据集中文档的 tf-idf 分数,请使用 Tfidfvectorizer 如果您需要在“训练”数据集之外的文档上计算 tf-idf 分数,请使用其中一个,两者都可以。

参考:https://kavita-ganesan.com/tfidftransformer-tfidfvectorizer-usage-differences/#.YHybLOhKhPY

【讨论】:

【参考方案3】:

以下代码演示了文档(根据 mbatchkarov 所说的“跟进”的含义:将两个函数的输出相乘,然后进行归一化。

import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import (
    CountVectorizer, TfidfTransformer, TfidfVectorizer
)

corpus = ['apple banana orange onion corn',
          'banana banana orange pineapple coffee',
          'orange lemon lime orange',
          'lime vodka gin orange apple apple',
          'potato potato tomato pineapple',
          'coffee']

tf = CountVectorizer()
idf = TfidfTransformer()

tf_ft = tf.fit_transform(corpus)
idf.fit(tf_ft)

vocab = [ti[0] for ti in sorted(list(tf.vocabulary_.items()),
                                key=lambda x: x[1])]

tf = pd.DataFrame(tf_ft.toarray(), columns=vocab)
idf = pd.Series(idf.idf_, index=vocab)
tfidf_manual = tf * idf
tfidf_manual /= np.sqrt(np.sum(np.square(tfidf_manual.values),
                               axis=1,
                               keepdims=True))

tfidf_function = pd.DataFrame(TfidfVectorizer()
                              .fit_transform(corpus)
                              .toarray(),
                              columns=vocab)

assert np.allclose(tfidf_manual, tfidf_function)

tfidf_manual

【讨论】:

以上是关于CountVectorizer+TfidfTransformer 和 TfidfVectorizer 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Spark CountVectorizer

sklearn CountVectorizer

Spark 机器学习 ---CountVectorizer

sklearn中CountVectorizer与TfidfVectorizer区别

CountVectorizer 删除只出现一次的特征

来自 CountVectorizer 的术语相对频率矩阵