机器学习一(2)特征提取(字典、中英文等)
- 目标
- 应用DictVectorizer实现对类别特征进行数值化、离散化
应用CountVectorizer实现对文本特征进行数值化
应用TfidfVectorizer实现对文本特征进行数值化
2.1特征提取
- 将任意数据(如文本或图像)转换为可用于机器学习的数字特征,特征值化是为了计算机更好的去理解数据
- 特征提取API
sklearn.feature_extraction
sklearn特征提取详细 - API含义
API 是用于构建应用程序软件的一组子程序定义,协议和工具。一般来说,这是一套明确定义的各种软件组件之间的通信方法。
2.2 字典特征提取
- 作用:对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() 返回类别名称
- 流程分析
实例化类DictVectorizer
调用fit_transform方法输入数据并转换(注意返回格式)
fit_transform,fit,transform区别和作用详解
from sklearn.feature_extraction import DictVectorizerdef dict_demo():"""对字典类型的数据进行特征抽取:return: None"""data=[{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}]transfer=DictVectorizer(sparse=False)print('data:\n', data, type(data))#data类型: data_new=transfer.fit_transform(data)#transform后 FASLE时出现的情况:非稀疏矩阵——one hot编码///不写时默认为稀疏矩阵# [[0. 1. 0. 100.]# [1. 0. 0. 60.]# [0. 0. 1.30.]] < class 'numpy.ndarray'>#numpy不能用.toarray()方法: print("data_new:\n", data_new.toarray(), type(data_new))# true时出现的情况:稀疏矩阵# data_new1:# (0, 1)1.0# (0, 3) 100.0# (1, 0) 1.0# (1, 3) 60.0# (2, 2) 1.0# (2, 3) 30.0 < class 'scipy.sparse.csr.csr_matrix'># 能用.toarray()方法: print("data_new:\n", data_new.toarray(), type(data_new))print('data_new:\n',data_new.toarray(),type(data_new))print('特征名字:\n',transfer.get_feature_names())return None
-
稀疏矩阵sparse
将非零值 按位置表示出来
节省内存 - 提高加载效率 -
应用场景:
1)pclass, sex 数据集当中类别特征比较多
1、将数据集的特征-》字典类型
2、DictVectorizer转换
2)本身拿到的数据就是字典类型 -
特征当中存在类别信息的我们都会做one-hot编码处理
2.3文本特征提取
- 对文本数据进行特征值化,
- 方法1:CountVectorizer
统计每个样本特征词出现的个数
stop_words停用的词表
关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少 - 方法2:TfidfVectorizer
TF-IDF - 重要程度
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])返回词频矩阵
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
CountVectorizer.get_feature_names() 返回值:单词列表
sklearn.feature_extraction.text.TfidfVectorizer
- 应用流程:实例化类CountVectorizer
调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组 )
from sklearn.feature_extraction.text import CountVectorizerdef text_count_demo():"""对文本进行特征抽取,countvetorizer:return: None"""data = ["life is short,i like like python", "life is too long,i dislike python"]# 1、实例化一个转换器类# transfer = CountVectorizer(sparse=False)transfer = CountVectorizer(stop_words=["is", "too"])# 2、调用fit_transformdata = transfer.fit_transform(data)print("文本特征抽取的结果:\n", data.toarray())print("返回特征名字:\n", transfer.get_feature_names())return None
**************************************************************
文本特征抽取的结果:[[0 1 2 0 1 1][1 1 0 1 1 0]]
返回特征名字:['dislike', 'life', 'like', 'long', 'python', 'short']
- 上面结果注意:*英文默认以空格分词进行提取,一个字母不认为是单词
2.4中文分词提取(jieba)
- jieba.cut()
返回词语组成的生成器
安装办法
jieba分词详细使用方法 - 分析流程
准备句子,利用jieba.cut进行分词
实例化CountVectorizer
将分词结果变成字符串当作fit_transform的输入值
from sklearn.feature_extraction.text import CountVectorizer
import jiebadef cut_word(text):return "_".join(list(jieba.cut(text))) #通过_分隔符把list列表里面元素进行分隔,赋值给到函数返回def count_chinese_demo2():data=["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]data_new=[]#字典要一句句导入jieba分词for sent in data:data_new.append(cut_word(sent))# print(data_new)# 1、实例化一个转换器类transfer = CountVectorizer(stop_words=["一种", "所以"])# 2、调用fit_transformdata_final = transfer.fit_transform(data_new)print("data_new:\n", data_final.toarray())print("特征名字:\n", transfer.get_feature_names())return None
***********************************************
data_new:[[0 1 0 1 0 1 1 0 1 0 0][0 0 0 0 1 0 0 1 0 0 1][1 0 1 0 0 0 0 0 0 1 0]]
特征名字:['_了解_事物_真正_含义_的_秘密_取决于_如何_将_其_与_我们_所_了解_的_事物_相_联系_', '_但_绝对_大部分_是_死_在_明天_晚上_', '_你_就_不会_真正_了解_它_', '_后天_很_美好_', '_我们_是_在_看_它_的_过去_', '_所以_每个_人_不要_放弃_今天_', '_明天_更_残酷_', '_这样_当_我们_看到_宇宙_时_', '一种_还是_一种_今天_很_残酷_', '如果_只用_一种_方式_了解_某样_事物_', '我们_看到_的_从_很_远_星系_来_的_光是在_几百万年_之前_发出_的_']
- 上述代码之’ '.join()函数的用法
2.5Tf-idf文本特征提取
- 如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。 - 公式
词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:
最终得出结果可以理解为重要程度。 - 例如·注:假如一篇文件的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。所以,如果"非常"一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000 / 1,0000)=3。最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15
- 实际案例TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
import jiebadef cut_word(text):"""对中文进行分词"我爱北京天安门"————>"我 爱 北京 天安门":param text::return: text"""# 用结巴对中文字符串进行分词text = " ".join(list(jieba.cut(text)))return textdef text_chinese_tfidf_demo():"""对中文进行特征抽取:return: None"""data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]# 将原始数据转换成分好词的形式text_list = []for sent in data:text_list.append(cut_word(sent))print(text_list)# 1、实例化一个转换器类# transfer = CountVectorizer(sparse=False)transfer = TfidfVectorizer(stop_words=['一种', '不会', '不要'])# 2、调用fit_transformdata = transfer.fit_transform(text_list)print("文本特征抽取的结果:\n", data.toarray())print("返回特征名字:\n", transfer.get_feature_names())return None
*****************************************************************************
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
Loading model cost 0.856 seconds.
Prefix dict has been built succesfully.
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
文本特征抽取的结果:[[ 0. 0. 0. 0.43643578 0. 0. 0.0. 0. 0.21821789 0. 0.21821789 0. 0.0. 0. 0.21821789 0.21821789 0. 0.436435780. 0.21821789 0. 0.43643578 0.21821789 0. 0.0. 0.21821789 0.21821789 0. 0. 0.218217890. ][ 0.2410822 0. 0. 0. 0.2410822 0.24108220.2410822 0. 0. 0. 0. 0. 0.0. 0.2410822 0.55004769 0. 0. 0. 0.0.2410822 0. 0. 0. 0. 0.482164410. 0. 0. 0. 0. 0.24108220. 0.2410822 ][ 0. 0.644003 0.48300225 0. 0. 0. 0.0.16100075 0.16100075 0. 0.16100075 0. 0.161000750.16100075 0. 0.12244522 0. 0. 0.161000750. 0. 0. 0.16100075 0. 0. 0.0.3220015 0.16100075 0. 0. 0.16100075 0. 0.0. ]]
返回特征名字:['之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
