【机器学习】特征工程 - 文本特征提取TfidfVectorizer

「作者主页」:士别三日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')]

猜你喜欢

转载自blog.csdn.net/wangyuxiang946/article/details/131360400