「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》
对「文本」进行特征提取时,一般会用「单词」作为特征,即特征词。
TfidfVectorizer会计算特征词的「权重」,帮我们发现哪个词是最重要的。
比如,某个词在这篇文章中出现的频率很高,但在其他文章中出现的频率很低,那么这个词对于这篇文章的权重就高。
而 CountVectorizer 则只是单纯的计算特征词出现的「次数」,对于多篇文章的特征提取,就相对逊色。
一、特征提取API
sklearn.feature_extraction 是用来提取特征的API。
sklearn.feature_extraction.text.TfidfVectorizer( stop_words=[…] )
- fit_transform( data ):接收数据(文本或包含文本字符串的可迭代对象),返回提取的特征(权重矩阵)
- vector.inverse_transform(new_data):将提取的特征,转换成之前的数据
- get_feature_names_out():获取(特征)单词列表
参数:
- stop_words:停用词,数组类型,指定的停用词不再作为特征词。
二、提取特征
我们准备一组原始数据,「提取」特征:
from sklearn import feature_extraction
# 原始数据
old_data = [
"I am your mather !"
"I am your father !"
]
# 初始化
tf = feature_extraction.text.TfidfVectorizer()
# 提取特征
new_data = tf.fit_transform(old_data)
print(new_data)
输出:
(0, 1) 0.31622776601683794
(0, 2) 0.31622776601683794
(0, 3) 0.6324555320336759
(0, 0) 0.6324555320336759
提取的结果是sparse类型的特征矩阵,我们用type查看一下返回值类型:
new_data = tf.fit_transform(old_data)
print(type(new_data))
输出:
<class 'scipy.sparse._csr.csr_matrix'>
这种存储形式目的是「节省内存」,但不利于我们分析,接下来,我们把结果转化成数组形式。
三、转成数组
使用sparse矩阵的内置方法 toarray() 转成「数组」
from sklearn import feature_extraction
# 原始数据
old_data = [
"I am your mather !"
"I am your father !"
]
# 初始化
tf = feature_extraction.text.TfidfVectorizer()
# 提取特征
new_data = tf.fit_transform(old_data)
print(new_data.toarray())
输出:
[[0.63245553 0.31622777 0.31622777 0.63245553]]
这种格式看起来友好一些,接下来,我们来分析一下这个输出结果是什么意思。
四、特征名字
get_feature_names_out() 获取提取特征的「名字」
from sklearn import feature_extraction
# 原始数据
old_data = [
"I am your mather !"
"I am your father !"
]
# 初始化
tf = feature_extraction.text.TfidfVectorizer()
# 提取特征
new_data = tf.fit_transform(old_data)
print(new_data.toarray())
print(tf.get_feature_names_out())
输出:
[[0.63245553 0.31622777 0.31622777 0.63245553]]
['am' 'father' 'mather' 'your']
原始数据中的每一个单词,都被当做一个特征;
当然,字母和标点符号默认不统计,因为没有意义。
特征名字 [‘am’ ‘father’ ‘mather’ ‘your’] 和 提取的特征 [0.63245553 0.31622777 0.31622777 0.63245553] 是一 一 对应的。
意思是:特征词 am 的权重是 0.63245553,特征词 father 的权重是 0.31622777,…
五、转回原始数据
inverse_transform( ) 方法可以将提取的特征转换成原始数据:
from sklearn import feature_extraction
# 原始数据
old_data = [
"I am your mather !"
"I am your father !"
]
# 初始化
tf = feature_extraction.text.TfidfVectorizer()
# 提取特征
new_data = tf.fit_transform(old_data)
print(new_data.toarray())
# 转回原始数据
print(tf.inverse_transform(new_data))
输出:
[[0.63245553 0.31622777 0.31622777 0.63245553]]
[array(['father', 'mather', 'your', 'am'], dtype='<U6')]