【问题标题】:Is a countvectorizer the same as tfidfvectorizer with use_idf=false?countvectorizer 是否与 use_idf=false 的 tfidfvectorizer 相同?
【发布时间】:2014-03-18 19:33:52
【问题描述】:

如标题所述: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)

【问题讨论】:

标签: python scikit-learn


【解决方案1】:

不,它们不一样。 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

【讨论】:

  • 我不确定自上次发帖后 API 是否有变化,但它是 norm 参数而不是 normalize
  • @Fred Foo,很好的解释。我只有一个问题,当 use_idf=True 时,TfidfVectorizer 不会对术语频率向量进行归一化,对吗?换句话说,它不执行两种归一化过程:一种用于 tf,一种用于 tfidf,但仅用于 tfidf。
【解决方案2】:

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

在当前版本 (0.14.1) 中,存在一个错误,即 TfidfVectorizer(binary=True, ...) 会默默地离开 binary=False,这可能会让您在网格搜索中寻找最佳参数时感到厌烦。 (相比之下,CountVectorizer 正确设置了二进制标志。)这似乎是未来(0.14.1 后)版本中的fixed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2018-09-19
    • 2021-02-09
    • 2019-10-14
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多