Sklearn tfidf_vectorizer 的输出是什么

What is this output of Sklearn tfidf_vectorizer

首先,我将 tfidf_vectorizer 应用于我的训练数据。

X_train_counts = tfidf_vectorizer.fit_transform(X_train)

然后我尝试输出'programming'这句话的tf-idf值。

test = tfidf_vectorizer.transform(['programming']).reshape(1, -1)
print(test)

结果是

(0, 45295)  1.0

这个1.0代表什么?我认为它可能是单词 'programming' 的 tf-idf 或 idf 值,因为本例中的 tf 值是 1.

然后我试了

test = tfidf_vectorizer.transform(['programming upgrade']).reshape(1, -1)
print(test)

结果如下

(0, 60314)  0.7968362696657073
(0, 45295)  0.6041952990095505

如果tf-idf值是1,那么,在这种情况下,tf值是1/2,应该是0.5,但事实并非如此。

那么这个数字代表什么?好像不是 tf 值,不是 idf 值,也不是 tf-idf 值。

困惑

我认为您的问题是 tfidf_vectorizer 的默认设置是标准“l2”而不是“l1”。

tfidf_vectorizer 的输出是 tf-idf 矩阵,因此数字是 tf-idf 值。

默认情况下,tfidf_vectorizer 使用 'l2' 范数 (https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html)。

这里是对结果 tf-idf 值的一些并排比较:

from sklearn.feature_extraction.text import TfidfVectorizer

doc1 = ['programming upgrade']

tfidf_l1 = TfidfVectorizer(norm='l1')
tfidf_2 = TfidfVectorizer(norm='l2')

tfidf_l1.fit(docs)
tfidf_2.fit(docs)

print("Output tfidf_transformer with l1 norm:")
test = tfidf_l1.transform(['programming upgrade']).reshape(1, -1)
print(test)

print("Output tfidf_transformer with l2 norm:")
test = tfidf_2.transform(['programming upgrade']).reshape(1, -1)
print(test)

还有这个returns:

Output tfidf_transformer with l1 norm:
  (0, 1)    0.5
  (0, 0)    0.5
Output tfidf_transformer with l2 norm:
  (0, 1)    0.7071067811865475
  (0, 0)    0.7071067811865475

因此只需指定您的 tfidfVectorizer 即可使用规范“l1”。