sklearn的特征工程在 feature_extraction模块中,提供了一系列将文本内容转换成词向量的方法。有字典特征提取DictVectorizer、散列特征提取FeatureHasher、文本特征提取、图片特征提取多种方式。
字典特征提取 DictVectorizer
DictVectorizer的使用三个步骤,先从sklearn导入,在创建DictVectorizer对象,第三步就是fit_transform训练,返回结果。创建DictVectorizer实例对象时,参数sparse为true时,返回是稀疏矩阵,是一个sicpy中的的系数矩阵对象:’scipy.sparse.csr.csr_matrix’,false时返回普通矩阵,是一个numpy的ndarray对象。
scipy的系数矩阵对象.csr_matrix 可以通过自带的to_array()方法,转换成一个普通矩阵ndarray对象。
.fit_transform(parm=)的方法的参数是一个包含字典的列表或者返回值类型为字典的可迭代对象。
sklearn的官网文档给的示例:
>>> from sklearn.feature_extraction import DictVectorizer >>> v = DictVectorizer(sparse=False) >>> D = [{'foo': 1, 'bar': 2}, {'foo': 3, 'baz': 1}] >>> X = v.fit_transform(D) >>> X array([[2., 0., 1.], [0., 1., 3.]])DictVectorizer在字典特征提取时的数字类型细节:
DictVectorizer在进行提取时,将字典中相同的key的值,当值为字符串对象时,进行one-hot编码,当值为数值时,就直接展示。
from sklearn.feature_extraction import DictVectorizer v = DictVectorizer(sparse=False) D = [{'类型': '聚餐', '费用': 800}, {'类型': '郊游', '费用': 50}] X = v.fit_transform(D) print(X) print(v.feature_names_)
[[ 1. 0. 800.]
[ 0. 1. 50.]]
[‘类型=聚餐’, ‘类型=郊游’, ‘费用’]
v = DictVectorizer(sparse=False) D = [{'类型': '聚餐', '费用': '800'}, {'类型': '郊游', '费用': '50'}] X = v.fit_transform(D) print(X) print(v.feature_names_)
[[1. 0. 0. 1.]
[0. 1. 1. 0.]]
[‘类型=聚餐’, ‘类型=郊游’, ‘费用=50’, ‘费用=800’]
注意区别,字典对象中,’费用’:800 和 ‘费用’:’800′ 的区别, 当数字为字符串类型时 和 数值时,一个当做类别变量,一个当做值来处理。
文本特征抽取CountVectorizer类使用
文本特征抽取,是从文本中,抽取出关键词组成的词向量,统计样本中特征值出现的次数。sklearn中对文本的处理在sklearn.feature_extraction.text模块中。该模块有CountVectorizer,
from sklearn.feature_extraction import DictVectorizer from sklearn.feature_extraction.text import CountVectorizer if __name__ == '__main__': text = ['i love china','you love china too','we are all love china, china is fine'] transfer = CountVectorizer() #实例化一个countvectorizer类 vector = transfer.fit_transform(text) #调用训练方法,返回一个稀疏矩阵 print(vector) print(type(vector))
返回的结果是:
….
(2, 2) 2
(2, 7) 1
(2, 1) 1
(2, 0) 1
(2, 4) 1
(2, 3) 1
class ‘scipy.sparse.csr.csr_matrix’
通过查看返回的结果,可以看到有(2, 2) 2这一项, 显示的是返回一个对关键词进行计数统计的稀疏矩阵,对象类型为scipy的csr_matrix。稀疏矩阵看着不直观,如果想看普通的矩阵,需要使用csr_matrix对象中自带的to_array()方法,转换成普通的ndarray矩阵。
print(vector.toarray()) print(type(vector.toarray()))
[[0 0 1 0 0 1 0 0 0]
[0 0 1 0 0 1 1 0 1]
[1 1 2 1 1 1 0 1 0]]
通过调用toarray方法,可以直观看到矩阵的词向量情况。可以通过转换器的get_feature_names方法,查看词向量的特征值名称。
print(transfer.get_feature_names())
[‘all’, ‘are’, ‘china’, ‘fine’, ‘is’, ‘love’, ‘too’, ‘we’, ‘you’]
CountVectorizer实例化对象时的常用参数:
在countvectorizer类实例化对象时的默认参数:
def __init__(self, input='content', encoding='utf-8',
decode_error='strict', strip_accents=None,
lowercase=True, preprocessor=None, tokenizer=None,
stop_words=None, token_pattern=r"(?u)\b\w\w+\b",
ngram_range=(1, 1), analyzer='word',
max_df=1.0, min_df=1, max_features=None,
vocabulary=None, binary=False, dtype=np.int64):
stop_words是停用词,可以传入一个列表,当传入一个列表时,列表内的词都被当做停用词过滤掉。
如果要对中文进行特征值提取,需要先将中文的文本进行切词划分,然后在特征提取。
中文分词更多查看 jieba结巴分词使用 python3中文分词
文本特征抽取TfidfVectorizer类使用
tfidf提供了关键词对文本的重要程度。
tf为词频,计算一个词在一篇文章中出现的频率,计算方式为词在文本中出现的次数,除以文本的总词数;
idf是逆向文档频率,计算方式为总文本数量,除以包含该关键字的文本数量,再将结果的值以log10为底取对数。
tfidf的计算方法:假设一篇文章有100个词,出现词A的次数是10词, 那么词A出现的频率 tf 的值为 10/100 = 0.1, 在假设整体的文本有1000篇文章,其中有100篇文章出现了词A, 那么词A 的逆向文档频率 idf 值为 log(1000/100) = 1 , 那么词A 的tifidf值为 0.1 * 1 = 0.1
当一个词在整体的文本中出现的次数越少,这个词的idf值会越高。
sklearn中tiifd的使用是在sklearn.feature_extraction.text模块中,包含了TfidfVectorizer类,TfidfVectorizer的使用方法和CountVectorizer一致,默认返回的是一个由词向量的tfidf值组成的稀疏矩阵,依然通过toarray的方式转换成普通矩阵,和通过调用实例对象的get_feature_names()方法查看特征值。