CountVectorizer()
输入:文档 corpus
输出:文档中各个单词的词频TF(即每个单词在文档中出现的次数)
TfidfTransformer()
输入:词频TF
输出:词频逆反文档频率TF-IDF(即词频TF与逆反文档频率IDF的乘积,IDF的标准计算公式为 :idf=log[n/(1+df)],其中n为文档总数,df为含有所计算单词的文档数量,df越小,idf值越大,也就是说出现频率越小的单词意义越大)
因此,利用以上两个函数,要计算某个文档的TF-IDF,需要两步完成:
1.计算词频TF,通过函数CountVectorizer()来完成,以该文档为输入,并得到词频 tf 输出;
2.计算词频逆反文档频率TF-IDF,通过函数TfidfTransformer()来实现,以第一步的词频 tf 输出为输入,并得到 tf-idf 格式的输出。
具体如下所示:
首先设置文档 corpus:
import numpy as np
corpus = np.array(['The sun is shining',
'The weather is sweet',
'The sun is shining and the weather is sweet'])
接着调用函数CountVectorizer()计算词频 tf :
from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer()
tf=count.fit_transform(corpus)
# 查看词频输出
tf.toarray()
# array([[0, 1, 1, 1, 0, 1, 0],
# [0, 1, 0, 0, 1, 1, 1],
# [1, 2, 1, 1, 1, 2, 1]], dtype=int64)
# 查看词汇表
count.vocabulary_
# {'the': 5, 'sun': 3, 'is': 1, 'shining': 2, 'weather': 6, 'sweet': 4, 'and': 0}
# 'the':5 表示'the'这个单词的词频显示在词频向量中的第6位
# 第一个向量中为1,第二个向量中为 1,第三个向量中为 2,分别表示'the'这个单词在第一个文档中出现 1 次,在第二个文档中出现 1 次,在第三个文档中出现 2 次
接着调用函数TfidfTransformer()计算词频逆反文档频率 tf-idf :
from sklearn.feature_extraction.text import TfidfTransformer
tfidf = TfidfTransformer()
tf_idf=tfidf.fit_transform(tf)
# 查看词频逆反文档频率输出
tf_idf.toarray()
# array([[0. , 0.43, 0.56, 0.56, 0. , 0.43, 0. ],
# [0. , 0.43, 0. , 0. , 0.56, 0.43, 0.56],
# [0.4 , 0.48, 0.31, 0.31, 0.31, 0.48, 0.31]])
现在将以上两步简化为一步,就是函数 TfidfVectorizer() 所实现的功能了
TfidfVectorizer()
输入:文档
输出:该文档的词频逆反文档频率TF-IDF
具体如下所示:
from sklearn.feature_extraction.text import TfidfVectorizer
countfidf = TfidfVectorizer()
count_tfidf = countfidf.fit_transform(corpus)
# 查看输出
count_tfidf.toarray()
# array([[0. , 0.43, 0.56, 0.56, 0. , 0.43, 0. ],
# [0. , 0.43, 0. , 0. , 0.56, 0.43, 0.56],
# [0.4 , 0.48, 0.31, 0.31, 0.31, 0.48, 0.31]])
得到与前两步相同的结果
总结三个函数的关系:
TfidfVectorizer().fit_transform(corpus) = TfidfTransformer().fit_transform(CountVectorizer().fit_transform(corpus))