石凤贵
摘要:随着科技的快速发展,手持终端已成为我们日常生活和工作中不可或缺的一部分。信息技术正在不断改变我们的工作和生活,但信息安全问题也给我们的信息和财产安全带来了威胁,垃圾短信层出不穷。对于垃圾短信,应该构建一种智能化的拦截和过滤机制进行自动识别处理。本文介绍了机器学习算法和中文信息处理技术并构建了短信识别应用。
关键词:机器学习;朴素贝叶斯;Scikit-Leam;垃圾短信
中图分类号:TP181
文献标识码:A
文章编号:1009-3044(2020)03-0202-03
当前,信息技术正处于高速发展阶段,各类诈骗电话、诈骗短信、垃圾短信层出不穷,这些垃圾类短信直接威胁到人们的日常生活和工作,稍有不慎就会导致经济损失。对于对这些垃圾信息识别能力较差的人群更容易上当受骗。尽管现在出现了各类垃圾短信识别软件,但对信息不能进行个性化拦截,大多还是依赖于黑白名单,识别拦截垃圾短信需要更加智能化。
短信内容属于中文本数据,对垃圾短信应采用文本处理和分类技术进行文本挖掘。机器学习是一门多领域交叉学科,主要涉及概率与统计、计算机算法等,研究计算机模拟人类学习获取新知识和技能,改进知识结构和性能。机器学习是人工智能的核心,人工智能通过机器学习得意实现。机器学习的研究主要包括决策树、随机森林、人工神经网络、贝叶斯、支持向量机等。
本文介绍了使用机器学习方法来智能化识别垃圾短信,包括朴素贝叶斯算法、Sciki-Learn机器学习算法库、TF-IDF、分类模型构建及测试评估。
1 机器学习
机器学习是计算机科学与人工智能的重要分支领域。计算机通过“数据”学习,“数据”相当于人的经验,通过学习这些经验数据生成一个算法模型,对于新的数据可以利用生成的模型进行判断,这就是机器学习。机器学习就是从数据中产生模型的算法。数据集中的每条记录是对一个事件或对象的描述,称为样本。从数据中获得模型的过程称为训练即学习,这个过程中使用的数据称为训练数据。模型有时也称为学习器,
机器学习过程如图1所示。
Python Scikit-Leam库封装了多种机器学习算法,提供各种机器学习算法接口,可以让用户简单、高效地进行数据挖掘和数据分析。本文使用Scikit-Learn进行垃圾短信文本数据分析。
2 朴素贝叶斯算法
朴素贝叶斯算法是一种分类算法,用于构建分类模型即分类器,允许使用概率给出一组特征来预测一个类,需要的训练比较少。朴素贝叶斯是一种运用广泛,分类效果比较突出的分类方法,特别是在处理文本分类任务,是一种分类效果比较好的方法。
3.1贝叶斯定理
3 相关关键技术
3.1 中文分词
中文语句结构复杂,语句中词语没有明显的分隔符号。词是构成中文语句的基本单元,词语之间紧密连接在一起组成语句。因此,理解语句需要先理解词语,分词质量的高低直接影响文本分词效果。目前,中文分词技术不断完善,主要的分词工具有NLPIR (Natural Language Processing&Information Re-trieval)、THULAC f THU LexicalAnalvzer for Chinese)、jieba分词和Snow NLP等分词器[2]。使用时,根据项目应用场景选用合适的中文分词器。
文本的分类,基本上是基于词袋模型,也就是一个文本中包含多少词以及各个词的频率。对于英文,其天生的句子空格可以很容易分割單词。但是中文就得先进行分词处理,也就是将一个完整的中文分割为一个一个词。Python提供了第三方模块-jieba分词来对中文进行分词。
jieba中文分词基于前缀词典实现高效词图扫描,对句子中所有可能生成词情况构成有向无环图(DAG),采用动态查找最大概率路径,切分出基于词频的最大切分组合。对于未登陆词,采用汉字成词HMM模型即隐马尔科夫模型。对于停用词,可以自定义。jieba分词器被广泛应用在中文分词,用Python语言开发的开源免费分词工具,同时根据文本内容可以自定义词典和修改词典。因此,本文采用jieba中文分词器对短信内容进行分词。
3.2 特征提取
特征数据表示输入的数据,目标数据则是输入数据的属性,本文中,短信内容就是特征数据,短信的分类就是目标数据。本文使用机器学习Scikit-Leam算法库实现应用。从文本中提取特征,需要利用到Scikit-Learn中的CountVectorizer0方法和TfidfTransformer0方法。CountVectorizer0用于将文本从标量转换为向量,Tfidfl ransformer0则将向量文本转换为tf-idf矩阵。
3.3 TF-IDF
TF-IDF(Term Frequency - Inverse Document Frequency)为“词频一逆文本频率”,包括TF和IDF两部分。TF为“词频”即文本中词的出现频率统计,作为文本特征。IDF为“逆文本频率”,反应一个词在所有文档中出现的频率。如果一个词在多个文本中出现,则IDF值低;如果一个词在较少的文本中出现,则IDF值高;如果一个词在所有文本中均出现,则IDF值为0。IDF基本计算公式如公式10所示,N表示语料库中文本数,Ⅳ(x)表示其中包含词x的文本数:
4 应用实现
4.1 对短信内容进行分词
jieba中文分词支持三种模式[3]:
1)全模式
seg_list= jieba.cut(”我来到北京清华大学”,cut_aIl=True)
print(”全模式:”+”/¨.join(seg_list》
分词结果:我/来到/北京/清华/清华大学/华大/大学
2)精确模式
seg_list= jieba.cut(”我来到北京清华大学”,cut_aIl=False)
print(”精准模式:”+”/”.join(seg_list》
分词结果:我/来到/北京/清华大学
默认模式是精确模式
3)搜索引擎模式
seg_list= jieba. cut_for_search('小明硕士毕业于中国科学院计算所,后在日本京都大学深造”)
print(”,”.join(seg_list》
分词结果:小明,硕士,毕业,于,中国,科学,学院,科学院,中国科学院,计算,计算所,后,在,日本,京都,大学,日本京都大学,深造
本文分词模式采用默认,语料中增加一列存放分词结果:
data= pd.read_csv(r”./data/rubmessage. csv”, encoding= 'utf_8,sep=,,)#导入短信数据
data[,分词短信]-data[,短信内容].apply(lambda x:””.join(jieba.cut(x》)
data.head0#显示前5个样本
4.2 特征提取及分割数据集
特征数据表示输入的数据,目标数据则是输入数据的属性。短信内容就是特征数据,短信的分类就是目标数据。代码如下:
x= data[”分词短信”].values
y= data[,分类,].values
使用skleam的分割模块分割出训练集和测试集,直接使用train_test_split0:
x_train, x_test. y_train. y_test=train_test_split(x,y,test_size=0.11
4.3 文本特征数字化
from sklearn. feature_extraction. text import TfidfTransformer,CountVectorizer
#定义向量转换器和TF-IDF转换器
vectorizer= CountVectorizer0
tfidf_transformer= TfidfTransformer0
#训练集数字化
x_train_termcounts= vectorizer.fit_transform(x_train)
x_train_tfidf
=
tfidf_ transformer.fit_transform(x_train_termcounts)
#测试集数字化
x—test termcounts= vectorizer.transform(x_test)
x_test_tfidf= tfidf_transformer.transform(x_test_termcounts)
4.4 模型構建、测试及评估
1)构建朴素贝叶斯分类模型并训练
from sklearn.naive_bayes import MultinomialNB
classifier= MultinomialNB O.fit(x_train_tfidf, y_train)
2)测试模型
predicted_categories= classifier.predict(x_test_tfidf)
print(predicted_categories)
结果:
[0 00001000000000000000000100000000 0 0 0000000 0 0 0 0 0 000000 0 0 0 1 0 0000000 0 00 0]
3)评估模型
from sklearn.metrics import accuracy_score print(”准确率:”,accuracy_score(y_test,predicted_c ategories》
评估结果:
准确率:0.9420289855072463
参考文献:
[1]刘秋阳,林泽锋,栾青青.基于朴素贝叶斯算法的垃圾短信智能识别系统[J].电脑知识与技术,2016,12(12):190-192.
[2]赖文辉,乔宇鹏.基于词向量和卷积神经网络的垃圾短信识别方法[J].计算机应用,2018,38(9):2469-2476.
[3]结巴中文分词[EB/OL].https://github.com/fxsjy/jieba.