Python中CountVectorizer()、TfidfTransformer() 和 TfidfVectorizer()的关系

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))

你可能感兴趣的:(python)