countvectorizer与tfidfvectorizer相同,use_idf = false吗?

时间:2014-03-18 19:33:53

标签: python scikit-learn

正如标题所述:countvectorizer是否与tfidfvectorizer相同且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 个答案:

答案 0 :(得分:29)

不,他们不一样。 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]])

这样做是为了使行上的点积与余弦相似。在给出选项TfidfVectorizer时,sublinear_tf=True也可以使用对数折扣的频率。

要使TfidfVectorizer表现为CountVectorizer,请为其指定构造函数选项use_idf=False, normalize=None

答案 1 :(得分:1)

正如larsmans所说,TfidfVectorizer(use_idf = False,normalize = None,...)应该与CountVectorizer的行为相同。

在当前版本(0.14.1)中,有一个错误,其中TfidfVectorizer(二进制= True,...)默默地留下二进制= False,这可能会在网格搜索期间抛弃最佳参数。 (相反,CountVectorizer正确设置二进制标志。)在将来(0.14.1之后)版本中,这似乎是fixed