特征抽取--文本特征抽取和字典特征抽取

在做训练前,对于给定的数据,可能会出现字符串、bool值等类型数据,这一步的工作就是就是将此类特征转化成机器学习时所需要的数据特征。
特征抽取可分为以下三个方面:
1、字典特征抽取
2、文本特征抽取

3、图像特征抽取(深度学习)
个人目前主要学习了1和2的一些用法。下面依次阐述。

1、字典特征抽取

字典特征提取
sklearn.feature_extraction.DictVectorizer(sparse=True),其父类是一个转换器类
上述语句将字典转换成一个数值(向量)对象
DictVectorizer.fit_transform(x):x为字典或者包含字典的迭代器返回值,返回一个sparse(稀疏)矩阵,稀疏矩阵作用是:将非零值按位置表示出来,若在实例化DictVectorizer对象时将sparse设置为False,则返回一个数组,其中分类按照One-hot(独热编码)编码。例如城市中,010表示北京,100表示上海,001表示广州
DictVectorizer.inverse_transform(x):x为arrays数组或sparse矩阵,返回值:转换之前数据格式
DictVectorizer.get_feature_names_out():返回类别名称
应用场景
数据集中当中类别特征比较多、本身拿到的数据就是字典数据类型就用字典特征抽取

from sklearn.feature_extraction import DictVectorizer
# 实例化该转化器类
transfer = DictVectorizer()
data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
data_new = transfer.fit_transform(data)
print(data_new)

此时运行结果如下:
非零元素对应的位置和结果
再来设置一下该转化器类的转换形式,即将稀疏矩阵sparse设为False,可得到对应的矩阵,结果如下:
在这里插入图片描述
这里主要是在执行的时候,city结果是个字符串,会自动转化成one-hot编码,三种城市所以需要三位二进制,010表示是北京,100表示上海,001表示深圳,而稀疏矩阵结果存储的就是非零元素对应的位置和结果(第0行第0列开始)

2、文本特征抽取方法一—counterVectorizer()

文本特征提取基本单位:单词
方法一:sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
stop_words=[],停用词表,
功能:返回词频矩阵
CountVectorizer.fit_transform(x):文本或者包含文本的可迭代的对象,返回一个sparse对象
CountVectorizer.inverse_transform(x):x为array数组或者sparse矩阵,返回值:转换之前的数据格式
CountVectorizer.get_feature_names_out(): 返回值:单词列表
此处实例化是不能设置sparse=False,因为API没有提供这个功能,可以使用sparse的toarray()方法转化成一个矩阵
文本矩阵内统计的是单词出现次数,而不是有没有这个单词,且单个字母。例如I不进入统计
中文没有空格时默认按照一个句子进行划分,效果不好,可借助“结巴分词”或者其他第三方软件分词

from sklearn.feature_extraction import text
test1 = [
    'life is short,i like like python',
    'life is too long,I dislike python'
]
transfer = text.CountVectorizer(stop_words=['is'])  
# is词语无实际意义,所以可以在停用词表里面加上,则特征就没有这个词,且不参加计数
data1 = transfer.fit_transform(test1).toarray()
print(transfer.get_feature_names_out())
print(data1)

运行结果如下所示:
在这里插入图片描述

3、文本特征抽取方法二—TfidfVectorizer()衡量词语重要性程度,这个使用的更广泛

关键词:某些词在一个类别的文章里出现次数很多,但是在其他类别文章当中出现很少
可以使用Tf-idf文本特征提取—衡量一个词的重要程度,
tf:词频,对应在文章中出现的频率
idf(inverse document frequency):逆向文档频率,是一个词语普遍重要性的度量。
某一特定词语的idf,可以由总文件数目除以包含该词语文件的数目。再将得到的商取以10为底的对数得到
tfidf=tf×idf
API:sklearn.feature_extraction.text.TfidfVectorizer(stop_words=[])
TfidfVectorizer.fit_transform(x):x为文本或者包含文本字符串的可迭代对象
TfidfVectorizer.inverse_transform(x):x为array数组和sparse矩阵
TfidfVectorizer.get_feature_names_out():返回为单词列表

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
# 实例化TfidfVectorizer类对象
transfer = TfidfVectorizer()
data = ['一种还是一种今天很残酷,明天更残酷,后天很没好,但绝大部分是死在明天晚上,所以每个人不要放弃今天。',
        '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
        '如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。'
]
def cut_word(text):
    return ' '.join(list(jieba.cut(text)))
data_new = []
for text in data:
    new_text = cut_word(text)
    data_new.append(new_text)
print(f"矩阵为\n{transfer.fit_transform(data_new).toarray()}")
print(f"特征名称为:{transfer.get_feature_names_out()}")
  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值