为什么 CountVectorizer * TfidfVectorizer.idf_ 的结果与 TfidfVectorizer.fit_transform() 的结果不同?

数据挖掘 Python scikit-学习 nlp tfidf
2022-03-09 20:08:03

我有一个数据框:

df = pd.DataFrame({'docs': ['gamma alfa beta beta epsilon', 'beta gamma eta',], 'labels': ['alfa alfa beta', 'gamma fi']})

我使用计数矢量化器:

import numpy as np
import pandas as pd
from itertools import chain
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

vocab_docs = set(chain(*[i.split() for i in df['docs'].unique()]))
cv_docs = CountVectorizer(vocabulary=vocab_docs)
cv_docs_s = cv_docs.fit_transform(df['docs'])

我做 TFIDF:

tfidf_docs = TfidfVectorizer(vocabulary=vocab_docs)
tfidf_docs_s = tfidf_docs.fit_transform(df['docs'])
# tfidf docs
tfidf_docs_s = tfidf_docs_s.todense()

但我看到结果不同:

test = np.multiply(cv_docs_s.todense(), tfidf_docs.idf_)

test != tfidf_docs_s 

为什么 CountVectorizer * TfidfVectorizer.idf_ 的结果与 TfidfVectorizer.fit_transform() 的结果不同?

1个回答

TfidfVectorizer默认情况下会标准化每一行。文档中我们可以看到:

norm : 'l1', 'l2' or None, optional (default='l2')
每个输出行都有单位范数,或者: * 'l2':向量元素的平方和为 1。两个向量之间的余弦相似度是应用 l2 范数时的点积。* 'l1':向量元素的绝对值之和为 1。见 preprocessing.normalize

设置normNone将给出您期望的结果:

tfidf_docs = TfidfVectorizer(vocabulary=vocab_docs, norm=None)