(一)数据的特征抽取
将分类、文字、图像等非连续的变量做特征表述,将这些特征做数学化表述
利用sklearn.feature_extraction方法处理
1.分类特征变量的提取
sklearn.feature_extraction.DictVectorizer(sparse = True)
#dict:字典;vectorizer:数字化
(1)sparse参数
将映射列表转换为Numpy数组或scipy.sparse矩阵
- sparse 是否转换为scipy.sparse矩阵表示,默认开启
字典放在列表里面的
sparse矩阵:
(sparse = True,默认为True)
对比
(sparse = Flase)
说的是一个位置的关系。ndarray的类型,即二维数组。
将字典类型处理为0-1的这些编码,这些编码为one-hot编码
在对类别进行特征化处理中,就是把类别进行的one-hot处理,也就是通过0-1的格式,属于这个类别是1,不属于这个类别是0
例子:
经过分类特征变量抽取后变为:
(2)get_feature_names
print(dict.get_feature_names())
字典数据抽取:把字典中一些类别数据,分别进行转换成特征
方法
fit_transform(X,y)
应用并转化映射列表X,y为目标类型
inverse_transform(X[, dict_type])
将Numpy数组或scipy.sparse矩阵转换为映射列表,也即转化为之前的数据
2.文本特征提取(只限于英文)
数值为1表示词表中的这个词出现,为0表示未出现
sklearn.feature_extraction.text.CountVectorizer()
将文本文档的集合转换为计数矩阵(scipy.sparse matrices)
def countvec():
'''对文本进行特征值化
:return :None'''
cv=CountVectorizer()
data=cv.fit_transform(["life is short short short short short,i like like like python","life is too long,i dislike python"])
print(cv.get_feature_names())
print(data.toarray()) #用toarray()转成二维数组
print(data)
return None
if __name__=='__main__':
# dictvec()
countvec()
文本特征提取的意思是
(1)统计所有文章中所有的词,重复的只看做一次
(2)对每篇文章,在词的列表里面进行统计每个词出现的次数
对于单个字母,由于对全文没有太多意义,在这个方法中对单个字母不统计
文本特征提取的应用环境是文本分类和情感分析等。
由于这个库的文本提取标识是通过逗号和空格,所以对于中文来说并不实用
def countvec():
'''对文本进行特征值化
:return :None'''
cv=CountVectorizer()
#data=cv.fit_transform(["life is short short short short short,'i' like like like python","life is too long,i dislike python"])
data = cv.fit_transform(
["人生海海,我想学习", "人生 海 海,我 想 睡觉"])
print(cv.get_feature_names())
print(data.toarray()) #用toarray()转成二维数组
print(data)
return None
if __name__=='__main__':
# dictvec()
countvec()
用jieba这个库进行分词
import jieba
当这个库从pycharm中下载时,会找不到这个内容。通过
https://pypi.doubanio.com/simple/
这个地方下载。例如安装jieba。
进入cmd,录入pip install jieba -i https://pypi.douban.com/simple/
就可以实现安装
估计其他的找不到的库也应该可以这样。
引入jieba库之后,可以使用jieba.cut()方法,将文章按词和字拆成对象。
将对象用list函数,转化为list对象。
但由于fit_transform([c1, c2, c3])处理的是列表中的文章,所以还需要用
c1 = ' '.join(content1)将list对象连接起来,形成类似英文句子文章的形式。
def cutword():
'''中文特征值化 :return :None'''
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 吧列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1, c2, c3
def hanzivec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()#因为返回的就是c1, c2, c3
print(c1, c2, c3)
cv = CountVectorizer()
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
return None
最后,主函数定义了函数执行的框架先后顺序。
if __name__=='__main__': # dictvec() #countvec() hanzivec()
4.更高级的文本特征提取
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
需要在之前CountVectorizer的基础上,加上TfidfVectorizer库
def tfidfvec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
return None
def hanzivec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()#因为返回的就是c1, c2, c3
print(c1, c2, c3)
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
return None
if __name__=='__main__':
# dictvec()
#countvec()
hanzivec()
代码与CountVectorizer()相同,只是换了TfidfVectorizer()类进行实例化。
Tf:term frequency词的频率
idf:逆文档频率inverse document frequency,通过log(总文档数量/该词出现的文档数量 )来计算,所以结果出现的数为小数
主要的思想:体现每个词的重要程度。(Tfidf避免了因为,所以等这些不是很重要的词)