垃圾短信

更新时间:2023-01-01 08:53:17 阅读: 评论:0


2023年1月1日发(作者:汉语什么时候成为国际通用语言)

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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图