CountVectorizer+TfidfTransformer和TfidfVectorizer之间的区别是什么



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

  1. 计数矢量器

  2. 计数矢量器+TfidfTransformer

  3. Tfidf矢量器

CountVectorizer+TfidfTransformer和TfidfVectorizer之间有什么区别?

无,请参阅文档页面顶部:

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

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

相反,使用Tfidfvectorize,您将同时执行所有三个步骤。在引擎盖下,它使用相同的数据集计算单词计数、IDF值和Tf-IDF分数。

所以现在你可能想知道,如果你可以用两个步骤完成所有事情,为什么你应该使用比必要的更多的步骤。好吧,在某些情况下,你想使用Tfidfttransformer而不是Tfidfvectorizer,这有时并不明显。以下是一个通用指南:

  • 如果您需要不同任务的术语频率(术语计数(向量,请使用Tfidfttransformer
  • 如果您需要计算"训练"数据集中文档的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

相关内容

最新更新