CountVectorizer+TfidfTransformer 和 TfidfVectorizer 有什么区别

What is the difference between CountVectorizer+TfidfTransformer and TfidfVectorizer

要在文本上应用 ML 算法,它必须用数字表示。使用 sklearn 执行此操作的一些方法是:

  1. CountVectorizer

  2. CountVectorizer + TfidfTransformer

  3. TfidfVectorizer

CountVectorizer+TfidfTransformer和TfidfVectorizer有什么区别?

None,见顶documentation page:

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

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

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

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

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

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

下面的代码演示了文档,根据 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