前几天ubuntn16虚拟机又被弄爆了,这几天配置了一个深度deepin的系统,然后安装完anaconda和pycharm配置好环境解决了matplotlib中文现实问题。
进入正题
1.Sklearn简介
Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。当我们面临机器学习问题时,便可选择相应的方法。
2.安装sklearn
- 安装sklearn的包
pip3 install Scikit-learn
- 查看是否成功(配置好anaconda的用户直接import就行)
impart sklearn
- 注意安装sklearn需要numpy,pandas等库
3.利用sklearn对数据特征进行抽取
先看一个例子,看看sklearn做了什么事
#导入包
from sklearn.feature_extraction.text import CountVectorizer
#实例化CountVectorizer
vector=CountVectorizer()
#调用fit_transfrom输入并转换数据
res=vector.fit_transform(["life is short,i like python","life is too long,i dislike python"])
#打印看看结果
print(vector.get_feature_names())
print(res.toarray())
运行结果
这里就相当于根据这两句话生成了一个二维数组,表头就是单词,而01代表着单词是否出现就相当于生成了一个01矩阵。数据特征的提取就是将一些文字或者其他类型的数据转换成数字类型,以便数据分析
下面是几种类型数据的抽取
1.字典类型数据抽取
#实例化DictVectorizer
dict=DictVectorizer(sparse=False)
# 调用fit_transfrom输入并转换数据
res=dict.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature':80},{'city':'天津','temperature':50}])
#打印结果get_feature_names()方法是打印表头
print(dict.get_feature_names())
print(res)
结果:
可以看出这里将字典数据转换成了3维数组
2.文本数据抽取以及中文的处理
#对文本进行数据特征值化
count=CountVectorizer()
# 调用fit_transfrom输入并转换数据
res=count.fit_transform(["life is short,i like python","life is too long,i dislike python"])
# 打印看看结果
print(count.get_feature_names())
print(res.toarray())
结果(这个就是一开始举的例子)
重点在于中文的处理
#对文本进行数据特征值化
count=CountVectorizer()
# 调用fit_transfrom输入并转换数据
res=count.fit_transform(["人生苦短,我用python","人生漫长,我讨厌python"])
# 打印看看结果
print(count.get_feature_names())
print(res.toarray())
结果
其实这会有个问题,中文从哪个字开始断句呢,系统其实是根据空格断句的,因为英文就是通过空格断开的,这里要想很好的断句又保留句子的主要词语就需要进行中文分词,这里用到jieba分词库
#下载jieba
pip3 install jieba
#jieba用法
jieba.cut("我喜欢编程")
#返回的结果类型是一个词语生成器
这里是jieba处理中文的流程
#以下的这些都是词语生成器类型要转化为数组类型['我', '的', '家乡', '在', '黄岩'.....
a=jieba.cut("我的家乡在黄岩,那是一座美丽的城市,是个盛产桔子的地方")
b=jieba.cut("我拿起剪刀剪开了包装箱,小心翼翼的拿出了草莓种苗")
c=jieba.cut("那一天,我早早地回到了家,津津有味地看着书")
#转换为列表类型
a1=list(a)
b1=list(b)
c1=list(c)
#列表转化为字符串,将里面的逗号替换成空格
a2=" ".join(a1)
b2=" ".join(b1)
c2=" ".join(c1)
然后将a2,b2,c2传入刚才的文本数据的处理得到如下结果(单个英文单词或者中文单词将不进行处理,会被直接丢弃)
最后附上全部代码
#导入包
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction import DictVectorizer
import jieba
# #实例化CountVectorizer
# vector=CountVectorizer()
# #调用fit_transfrom输入并转换数据
# res=vector.fit_transform(["life is short,i like python","life is too long,i dislike python"])
# #打印看看结果
# print(vector.get_feature_names())
# print(res.toarray())
def dictvec():
#实例化DictVectorizer
dict=DictVectorizer(sparse=False)
# 调用fit_transfrom输入并转换数据
res=dict.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature':80},{'city':'天津','temperature':50}])
#打印结果
print(dict.get_feature_names())
print(res)
def countvec():
#对文本进行数据特征值化
a2,b2,c2=cutword()
print(a2,b2,c2)
count=CountVectorizer()
# 调用fit_transfrom输入并转换数据
res=count.fit_transform([a2,b2,c2])
# 打印看看结果
print(count.get_feature_names())
print(res.toarray())
def cutword():
#以下的这些都是词语生成器类型要转化为数组类型['我', '的', '家乡', '在', '黄岩'.....
a=jieba.cut("我的家乡在黄岩,那是一座美丽的城市,是个盛产桔子的地方")
b=jieba.cut("我拿起剪刀剪开了包装箱,小心翼翼的拿出了草莓种苗")
c=jieba.cut("那一天,我早早地回到了家,津津有味地看着书")
#转换为列表类型
a1=list(a)
b1=list(b)
c1=list(c)
#列表转化为字符串,将里面的逗号替换成空格
a2=" ".join(a1)
b2=" ".join(b1)
c2=" ".join(c1)
return a2,b2,c2
if __name__ == "__main__":
#我将这些都写在了函数里,想运行哪个就直接写函数名
countvec()