这里简单介绍下scikit-learn自然语言文本处理的一个开源方法——TfidfVectorizer,该方法分别是由两种方法 CountVectorizer 与 TfidfTransformer 的结合,下面进行说明,说明之前给出三个文档链接(本文基本翻译自官方文档):
(文档在手天下我有,有问题看文档)
方法一:TfidfVectorizer
好了进入正文
TfidfVectorizer 处理文本语言的主要中心思想也就是 TF-IDF (词频-逆文档频率),由于本篇文章的重点是介绍该模块,所以不过多对 TF-IDF 说明,有需要的这里给出之前写的比较详细的文章可以参考——TF-IDF及相关知识
TfidfVectorizer 的使用相当于先调用了 CountVectorizer 方法,然后再调用 TfidfTransformer 方法,所以想了解 TfidfVectorizer 还得从后面两个方法说起。
CountVectorizer:
功能:
将文本文档集合转换为计数的稀疏矩阵。内部的实现方法为调用scipy.sparse.csr_matrix模块。并且,如果在调用CountVectorizer() 时不提供先验词典并且不使用执行某种特征选择的分析器,则特征词的数量将等于通过该方法直接分析数据找到的词汇量。
代码说明:
from sklearn.feature_extraction.text import CountVectorizer
corpus = ['This is the first document.',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?']
vectorizer = CountVectorizer() # ()这里不提供先验词典
# vectorizer.fit(corpus) # 先fit训练传入的文本数据
# X = vectorizer.transform(corpus) # 然后对文本数据进行标记并转换为稀疏计数矩阵
X = vectorizer.fit_transform(corpus) # 可以fit、transform一起使用替代上面的两行
print(vectorizer.get_feature_names()) # 获得模型直接分析数据找到的词汇量(上面单词的集合)
print(X.toarray()) # 直接打印X输出的是每个词的位置
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
[[0 1 1 1 0 0 1 0 1] # 4行 数据样本
[0 2 0 1 0 1 1 0 1] # 9列 特征单词
[1 0 0 1 1 0 1 1 1]
[0 1 1 1 0 0 1 0 1]]
参数简单说明:
以上为最简单的 CountVectorizer 模块的使用,我们几乎没有使用任何的参数和方法,但依然能达到一个较好的【文本—>词向量稀疏矩阵 】的效果,部分参数如下。
input : string {‘filename’, ‘file’, ‘content’}
encoding : string, ‘utf-8’ by default.
stop_words : string {‘english’}, list, or None (default)
max_df : float in range [0.0, 1.0] or int, default=1.0
min_df : float in range [0.0, 1.0] or int, default=1
max_features : int or None, default=None
TfidfTransformer:
功能:
将计数矩阵(如上图所示)转换为标准化的 tf 或 tf-idf 表示。Tf 表示术语频率,而tf-idf表示术语频率乘以逆文档频率。这是信息检索中常用的术语加权方案,在文档分类中也有很好的用途。用于计算项的 tf-idf 的公式是 tf-idf(d,t)= tf(t)* idf(d,t)。
代码说明:
from sklearn.feature_extraction.text import TfidfTransformer
transform = TfidfTransformer() # 使用TF-IDF(词频、逆文档频率)应用于稀疏矩阵
Y = transform.fit_transform(X) # 使用上面CountVectorizer处理后的 X 数据
print(Y.toarray()) # 输出转换为tf-idf后的 Y 矩阵,同样直接打印 Y 输出每个数据的位置
print(vectorizer.get_feature_names()) # 打印特征名
[[0. 0.46979139 0.58028582 0.38408524 0. 0.
0.38408524 0. 0.38408524]
[0. 0.6876236 0. 0.28108867 0. 0.53864762
0.28108867 0. 0.28108867]
[0.51184851 0. 0. 0.26710379 0.51184851 0.
0.26710379 0.51184851 0.26710379]
[0. 0.46979139 0.58028582 0.38408524 0. 0.
0.38408524 0. 0.38408524]]
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
参数简单说明:
以上为直接使用 TfidfTransformer 转换 CountVectorizer 处理后的计数矩阵为标准化的 tf-idf 矩阵【词向量稀疏矩阵—>标准化tf-idf】的效果,下面给出其部分参数。
norm : ‘l1’, ‘l2’ or None, optional
Norm used to normalize term vectors. None for no normalization.
use_idf : boolean, default=True
Enable inverse-document-frequency reweighting.
smooth_idf : boolean, default=True
Smooth idf weights by adding one to document frequencies, as if an extra document was seen containing every term in the collection exactly once. Prevents zero divisions.
sublinear_tf : boolean, default=False
Apply sublinear tf scaling, i.e. replace tf with 1 + log(tf).
最后可以简单的描述下TfidfVectorizer了
TfidfVectorizer
功能:
前文说过 TfidfVectorizer 相当于两者的结合使用,先后调用 CountVectorizer 和 TfidfTransformer 两种方法(简化了代码,但运算思想还是不变),并且参数的使用基本一致。
代码说明:
from sklearn.feature_extraction.text import TfidfVectorizer
VT = TfidfVectorizer() # 先后调用CountVectorizer和TfidfTransformer两种方法(简化了代码,但运算思想还是不变)
result = VT.fit_transform(corpus)
print(result.toarray())
print(VT.get_feature_names())
[[0. 0.46979139 0.58028582 0.38408524 0. 0.
0.38408524 0. 0.38408524]
[0. 0.6876236 0. 0.28108867 0. 0.53864762
0.28108867 0. 0.28108867]
[0.51184851 0. 0. 0.26710379 0.51184851 0.
0.26710379 0.51184851 0.26710379]
[0. 0.46979139 0.58028582 0.38408524 0. 0.
0.38408524 0. 0.38408524]]
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
可以看到与上面 CountVectorizer 和 TfidfTransformer 处理后的结果一致,确实为两者的结合使用。
参数及使用方法与 CountVectorizer和TfidfTransformer 一致,这里不再描述。