03_data特征抽取 of 特征工程【day1】
0、Xmind
1、data的特征抽取
1、what is 特征抽取示例?
特征提取:文本,字符串
得出结论:
特征值化是为了计算机更好的理解data
2、sklearn特征抽取API
sklearn.feature_extraction
特征 feature 抽取 extraction
2、字典特征抽取
1、 DictVectorizer
类:sklearn.feature_extraction.DictVectorizer
字典 Dict 数字化 Vectorizer
作用:对字典数据进行特征值化
DictVectorizer语法:
流程:
input: list类型
[{'city': '北京','temperature':100}
,{'city': '上海','temperature':60}
,{'city': '深圳','temperature':30}]
return sparse矩阵
2、代码demo
from sklearn.feature_extraction import DictVectorizer # 字典抽取类 def dictVec(): """ 字典data抽取 :return: """ # 实例化DictVectorizer dict = DictVectorizer() # dict = DictVectorizer(sparse=False) # 调用fit_transform方法输入data并transform data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}] res = dict.fit_transform(data) # 打印结果 print(dict.get_feature_names()) # return 类别名称 print(res) return None if __name__ == '__main__': dictVec() ''' ['city=上海', 'city=北京', 'city=深圳', 'temperature'] [[ 0. 1. 0. 100.] [ 1. 0. 0. 60.] [ 0. 0. 1. 30.]] (0, 1) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.0 '''
分析:
sparse=True 默认
sparse矩阵
节约内存,方便read处理
sparse=False
ndarray类型 二维array
dict.get_feature_names() # return 类别名称.
3、字典抽取总结
dcit抽取:把dict中一些类别的data分别转换成特征
数组形式、有类别的这些特征、首先要转换成dict data
可以舍弃某些data
if pclass 为n+1的话,这类data可以舍弃
4、one-hot编码
为每个类别生成 bool列
目的
数组形式、有类别的这些特征 --->首先要转换成dict data ----> one-hot编码
3、文本特征抽取
1、what is 文本特征抽取?
文本 --> number
2、方法
Count
tf * idf
3、用途
文本分类、情感分析
3.1 count
1、text.CountVectorizer
类:sklearn.feature_extraction.text.CountVectorizer
作用:对文本数据进行特征值化
语法:
流程:
1.实例化类CountVectorizer
2.调用fit_transform方法输入data并转换
2、代码demo
from sklearn.feature_extraction.text import CountVectorizer # 文本抽取类 count def countVect(): """ 文本data抽取 :return: None """ # 1. 实例化 cv = CountVectorizer() # 2.调用fit_transform转换data text1 = ["life is short,i like python", "life is too long,i dislike python"] text = ["生活很短,我喜欢python", "生活太久了,我不喜欢python"] data = cv.fit_transform(text) # 3.print result print(cv.get_feature_names()) # return list of word print(data.toarray()) # sparse矩阵 转换成 array二维 # print(cv.inverse_transform(data)) # 基本用不到 if __name__ == '__main__': countVect()
result:
英文
中文
两个 is
分析:
对于单个英文字母不统计:没有分类依据(无情感、不反映主题)
3、jieba分词:中文文本
1.如何去对中文文本特征值化?
中文分词---> 特征提取
result:
空格分开
不支持单个中文字!
2. jieba分词
流程:
4、代码:中文特征抽取
from sklearn.feature_extraction.text import CountVectorizer # 文本抽取类 count import jieba # jieba 中文分词 def zhCNVect(): """ 中文特征值化 :return: None """ c1,c2,c3 = cutWord() # 实例化CountVectorizer ch_v = CountVectorizer() # fit_transfrom 文本转换成num data = ch_v.fit_transform([c1,c2,c3]) # print result print(ch_v.get_feature_names()) print(data.toarray()) def cutWord(): # jieba.cut 分词 input1 = "今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。" input2 ="我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。" input3 ="如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。" con1 = jieba.cut(input1) con2 = jieba.cut(input2) con3 = jieba.cut(input3) # 转换成list content1 = list(con1) content2 = list(con2) content3 = list(con3) # list转换成str c1 = " ".join(content1) c2 = " ".join(content2) c3 = " ".join(content3) print(c1,c2,c3) return c1,c2,c3 if __name__ == '__main__': # dictVec() # countVect() zhCNVect()
result:
3.2 tfidf 重要性程度
1、 如何通过词语占比判定文章类型?
NO!中性词的次数,我们,明天等
2、tf * idf 重要性程度
朴素贝叶斯
tf: term frequency 词的频率
(出现的count)
idf: inverse document frequency 逆文档频率
log(总文档数量/该词出现的文档数量)
log(数值):输入的值越小,结果越小
tf * idf 重要性程度
3、text.TfidfVectorizer
类:sklearn.feature_extracion.text.TfidfVectorizer
语法:
代码:
from sklearn.feature_extraction.text import TfidfVectorizer # 文本抽取类 tf*idf import jieba # jieba 中文分词 def cutWord(): # jieba.cut 分词 input1 = "今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。" input2 ="我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。" input3 ="如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。" con1 = jieba.cut(input1) con2 = jieba.cut(input2) con3 = jieba.cut(input3) # 转换成list content1 = list(con1) content2 = list(con2) content3 = list(con3) # list转换成str c1 = " ".join(content1) c2 = " ".join(content2) c3 = " ".join(content3) print(c1,c2,c3) return c1,c2,c3 def tfidfvec(): """ 中文特征值化 :return: """ c1,c2,c3 = cutWord() # 实例化CountVectorizer tf = TfidfVectorizer() # fit_transfrom 文本转换成num data = tf.fit_transform([c1,c2,c3]) # print result print(tf.get_feature_names()) print(data.toarray()) if __name__ == '__main__': tfidfvec()
重要性
4、why need TfidfVectorizer?
图片的分类 后面讲