首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么CountVectorizer * TfidfVectorizer.idf_的结果与TfidfVectorizer.fit_transform()不同?

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

Data Science用户
提问于 2019-09-18 06:43:33
回答 1查看 524关注 0票数 2

我有个数据:

代码语言:javascript
复制
df = pd.DataFrame({'docs': ['gamma alfa beta beta epsilon', 'beta gamma eta',], 'labels': ['alfa alfa beta', 'gamma fi']})

我使用计数向量器:

代码语言:javascript
复制
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'])

我做的是过渡联邦国防军:

代码语言:javascript
复制
tfidf_docs = TfidfVectorizer(vocabulary=vocab_docs)
tfidf_docs_s = tfidf_docs.fit_transform(df['docs'])
# tfidf docs
tfidf_docs_s = tfidf_docs_s.todense()

但我发现结果是不同的:

代码语言:javascript
复制
test = np.multiply(cv_docs_s.todense(), tfidf_docs.idf_)

test != tfidf_docs_s 

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

EN

回答 1

Data Science用户

发布于 2019-09-18 08:42:41

默认情况下,TfidfVectorizer将对每一行进行规范化。从文档中我们可以看到:

范数:‘L1’,‘l2’或‘None’,可选的(默认值=‘L2’) 每一行都有单位范数,即:*‘L2’:向量元素的平方和为1。当应用l2范数时,两个向量之间的余弦相似性是它们的点乘积。*‘L1’:向量元素绝对值之和为1。参见preprocessing.normalize。

norm设置为None将给出您期望的结果:

代码语言:javascript
复制
tfidf_docs = TfidfVectorizer(vocabulary=vocab_docs, norm=None)
票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/60366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档