python数据挖掘第三篇-垃圾短信⽂本分类
数据挖掘第三篇-⽂本分类
⽂本分类总体上包括8个步骤。数据探索分析-》数据抽取-》⽂本预处理-》分词-》去除停⽤词-》⽂本向量化表⽰-》分类器-》模型评估.重要
python库包括numpy(数组),pandas(⽤于处理结构化数据),matplotlib(绘制词云,便于直观表⽰),sklearn(提供⼤量分类聚类算法库).
1.数据探索分析
(1)获取⼤量未经过处理的⽂档,且标记好⽂档所属类型。
(2)给各个⽂档分配唯⼀的Id,并将之前⽤⽂字标记的分类类别⽤离散数字代替。例如分类标记为[‘正常短信’,‘垃圾短信’],将其离散表⽰
为[0,1].
(3)将Id,⽂档内容,标记作为列,样本个数作为⾏,将这些⽂档读⼊⼀个数组中。形式为:[[Id1,content1,label1],...,[Id_n,content_n,label_n]]
代码⽰例:
importpandasaspd
data=_csv(csv⽂件名,header=None)#读⼊csv⽂件,不读⼊列名
s=['Id','Content','Label']
1.1DataFrame中获取数据的⼀些⽅法:
[]#通过字符串索引的⽅式获取指定⾏列数据例如:
[0:2,'content']#获取第0,1,2⾏的content列的数据,【注意】:0:2获取的是0,1,2⾏,这⼀点和⼀般的切⽚不相同
[[0,2],['content','label']]#通过列表指定⾏列
[]#通过数字索引⽅式,⽤法和数组的⼀模⼀样
['label']#获取label列的数据,结果是⼀维数组
data[['content','label']]#结果是content,label列的所有数据
1.2统计不同label出现频率,绘制饼图
data['label'].value_counts()#获取label这⼀列数据中各个标记出现次数,结果以ries的形式返回
1.2.1绘制饼图
num=data['label'].value_counts()
asplt
(figsize=(3,3))#将画布设置为3*3的正⽅形
(num,labels=['正常','垃圾'])#绘制饼图,num是⼀个ries,ries是⼀个带索引的数组,和字典使⽤类似。
()
2.数据抽取
当不同标记的⽐例不平衡时,需要分层抽样,例如0标记出现72000次,⽽1标记出现8000次,则此时会产⽣模型偷懒问题。
data_normal=[data['label']1].sample(1000,random_state=123)#在label为1的所有数据⾥挑选1000个随机样本
data_bad=[data['label']0].sample(1000,random_state=123)#在label为0的所有数据⾥挑选1000个随机样本
data_new=([data_normal,data_bad],axis=0)#默认⾏拼接,所以axis可不写
3.⽂本预处理
如下图所⽰,content⼀项中包含了xxx,以及⼀些特殊编码字符,以及逗号句号等等的标点符号,这些东西都是⽆意义字符,需要删除掉
删除这些特殊⾮中⽂字符,需要⽤到正则表达式,正则表达式是爬⾍中必不可少的⼀个知识点,是⼀个条件表达式,⽤这个构造的条件表达
式所指定的规则在⼀个指定字符串中检索匹配出符合规则的句⼦。
importre
afterDeleteSpecialWord=data_new['content'].apply(lambdax:('[^u4E00-u9FD5]+','',string))
这⾥的apply表⽰对这个ries数组中的每⼀个元素(即⽂档的内容字符串)都执⾏这个匿名函数x,string是传进来的参数,表⽰将前⾯
指定的正则表达式'[
u4E00-u9FD5]+'所匹配的字符串(即⾮中⽂特殊字符)⽤''代替。这⾥的正则表达式'[u4E00-u9FD5]+':
[]是⼀个原⼦列表,表⽰⾮,u4E00-u9FD5中⽂字符的正则表⽰,前⾯加上
则表⽰⾮中⽂字符,[]+表⽰这个原⼦列表中的字符可以匹配1次或多次。具体
正则表达式的⽤法⽹上资源很多,这⾥不详细解释.
处理完后,标点符号,以及特殊字符都不见了,如下所⽰:
4.分词,去除停⽤词
第⼀步先将之前的content中的内容进⾏分词,分词后content列的元素是⼀个列表,⽐如之前的content列中的元素'我来到北京清华⼤学计算
机学院',执⾏分词后结果为:['我','来到','北京','清华⼤学','计算机','学院']
第⼆步是去除停⽤词,⾸先加载停⽤词⽂件,⾥⾯存储了N个停⽤词,然后对第⼀步中的分词结果进⾏去除存在于停⽤词列表中的词.
代码如下:
importjieba#分词库
withopen('','r')asf:
stop=()#获取的结果是⼀个⼤的字符串,其中换⾏符之类的特殊字符也存在于其中
stop=()#按照空格,换⾏符进⾏分割,获取停⽤词列表
stop=['']+stop#由于之前的stop⾥没有空格,⽽空格是停⽤词,所以重新加回空格
_urdic(path)#加载指定路径path⾥的⽤户⾃定义词典
after_gement=()#进⾏分词
data_after=after_(lambdax:[iforiinxifinotinstop])#去除停⽤词
4.1绘制词云
绘制词云是⽂本分类⾥对词频的⼀个直观图像表⽰,以图像形式呈现,频率⾼的词汇字体更⼤,频率⼩的,字体⼩。
asplt#画图⼯具
fromwordcloudimportWordCloud#词云⼯具库
importitertools#将⼆维数据压缩为⼀维数据
pic=(picturePath)#这⾥picturePath为具体图⽚所在路径,这⾥没有指定.这⾏代码是加载画板的⼀个背景图⽚
'''
wc=WordCloud(font_path=r'C:WindowsFonts字体名称',background_color='white',mask=pic)#⽣成⼀个词云对象,windows系统中的字
体存放在c盘Windows⽂件夹下的Fonts⽂件夹中。因为这⾥统计的都是中⽂,所以不要选英⽂字体,⽽是选择中⽂字体,右键,属性,如
图,为具体的字体名称'''
num=(list((*list(data_after)))).value_counts()#统计词频
_words(num)#将统计好的词频放进去
(wc)
()
⽂本向量化表⽰
⽂本向量化表⽰的含义为:由于我们⽬前得到的是⼀个分词结果,是中⽂,⽽计算机不能直接将中⽂作为分类的输⼊数据,必须将其⽤数字
来表⽰,那么如何将⼀个⽂档⽤⼀个数字化的向量表⽰呢,这就是⽂本向量化。
常⽤的向量化表⽰有词袋模型,词频,TF-IDF,以及考虑上下⽂的词嵌⼊。
词袋模型是指,⼀个⽂档中出现了的词则该词置1,词库中其他词置0,⽽不考虑出现次数的多少。⼀个⽂档则可以表⽰成⼀个N维的0,1向
量,N的⼤⼩取决于词库的⼤⼩。
词频:在词袋模型的基础上,考虑出现词的次数,⽽不是只要出现了就是1。
TF-IDF:考虑⼀个词的词频以及逆⽂档频率,逆⽂档频率是指该词在所有⽂档⾥的稀有程度,该词在所有⽂档⾥出现的⽂档数越少,则该词
越稀有,区分度就越⾼,逆⽂档频率就越⾼,逆⽂档频率=log(所有⽂档数/(出现该词的⽂档数+1)),⽽TF-IDF则=TF*IDF。
在sklearn中的feature_包中有CountVectorizer,TfidfVectorizer直接可以做⽂本向量化⼯作,⼀个是根据词频,⼀个是TF-
IDF。
tmp=data_(lambdax:''.join(x))#由于⾕歌开发的向量化⼯具仅⽀持按空格统计,所以之前的列表存放的单词需要转换成⼀个以
空格分隔开的⼀个⼤字符串。
cv=CountVectorizer().fit(tmp)#加载字典,以及需要向量化的⽂本数据
vector_data=orm(tmp)#向量化,结果是⼀个迭代器
vector_array=vector_y()#将迭代器转为数组
⽂本分类
接下来的步骤和⼀般机器学习分类问题是⼀模⼀样的,不多做介绍。已经得到结构化数据vector_array,以及相应的标签label,可以⽤
sklearn的各种训练模型进⾏训练,测试,模型评估等等。
本文发布于:2023-01-01 08:53:17,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/70955.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |