countvectorizer和use_idf=false的tfidfvectorizer是一样的吗?

13 投票
2 回答
16692 浏览
提问于 2025-04-17 22:52

标题问的是:countvectorizertfidfvectorizer 在设置了 use_idf=false 的情况下是不是一样的?如果不是,那为什么不一样呢?

这是不是也意味着在这里加上 tfidftransformer 是多余的呢?

vect = CountVectorizer(min_df=1)
tweets_vector = vect.fit_transform(corpus)
tf_transformer = TfidfTransformer(use_idf=False).fit(tweets_vector)
tweets_vector_tf = tf_transformer.transform(tweets_vector)

2 个回答

1

正如larsmans所说,TfidfVectorizer(use_idf=False,normalize=None,...)应该和CountVectorizer的表现是一样的。

在当前版本(0.14.1)中,有一个bug,导致TfidfVectorizer(binary=True,...)默默地把binary设置为False,这在你寻找最佳参数时可能会让你困惑。(而CountVectorizer则能正确设置这个binary标志。)这个问题在未来的版本中(0.14.1之后)似乎已经被修复了。

33

不,它们并不相同。TfidfVectorizer 会对结果进行归一化处理,也就是说,它输出的每个向量的长度都是1:

>>> CountVectorizer().fit_transform(["foo bar baz", "foo bar quux"]).A
array([[1, 1, 1, 0],
       [1, 0, 1, 1]])
>>> TfidfVectorizer(use_idf=False).fit_transform(["foo bar baz", "foo bar quux"]).A
array([[ 0.57735027,  0.57735027,  0.57735027,  0.        ],
       [ 0.57735027,  0.        ,  0.57735027,  0.57735027]])

这样做的目的是为了让行之间的点积计算出来的是余弦相似度。此外,当你选择 sublinear_tf=True 这个选项时,TfidfVectorizer 还可以使用对数折扣频率。

如果你想让 TfidfVectorizer 的行为像 CountVectorizer 一样,只需在构造时设置 use_idf=False, normalize=None

撰写回答