web-dev-qa-db-ja.com

countvectorizerはuse_idf = falseのtfidfvectorizerと同じですか?

タイトルにあるように: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)
12
Olivier_s_j

いいえ、同じではありません。 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は対数的に割引された頻度を使用できます。

TfidfVectorizerCountVectorizerとして動作させるには、コンストラクターオプションuse_idf=False, normalize=Noneを指定します。

30
Fred Foo

Larsmansが言ったように、TfidfVectorizer(use_idf = False、normalize = None、...)はCountVectorizerと同じように動作するはずです。

現在のバージョン(0.14.1)には、TfidfVectorizer(binary = True、...)がbinary = Falseをサイレントに残すバグがあり、最適なパラメーターのグリッド検索中にユーザーをスローする可能性があります。 (対照的に、CountVectorizerはバイナリフラグを正しく設定します。)これは、将来の(0.14.1以降の)バージョンでは 修正済み のようです。

1
Rolf H Nelson