摘 要
近年来,随着通信技术的不断进步,我国使用手机的用户数量日益增多,短信成为一种方便的信息传递渠道。然而,短信在使人们的日常生活变得更加方便的同时,垃圾短信的泛滥也越来越严重,严重干扰了人们的生活,成为了危害社会公共安全的一大公害。
本论文分析了垃圾短信过滤技术现状,同时对人工智能文本分类中涉及的中文分词、停用词过滤、词向量、卷积神经网络、Tensorflow框架等相关技术进行了研究。为了提高垃圾短信识别的准确率,针对人工设计特征选择方法提取短信特征时产生的数据稀疏、文本特征信息共现不足和文本特征提取困难等问题,本文采用基于Word2Vec模型的词向量特征提取方法和CNN模型相结合的方法进行垃圾短信识别,并给出了详细的设计和实现过程。
关键词:
垃圾短信、文本分类、中文分词、停用词、词向量、卷积神经网咯、Tensorflow
第一章 著论
1.1 研究背景
近年来,随着通信技术的不断进步,我国使用手机的用户数量日益增多,短信成为一种方便的信息传递渠道。然而,短信在使人们的日常生活变得更加方便的同时,垃圾短信的泛滥也越来越严重,严重干扰了人们的生活,成为了危害社会公共安全的一大公害。像笔者的手机每天都能够收到很多垃圾短信(包括诈骗和广告推销的短信),对诈骗短信每次进行举报和删除后,对方又总是会换个号码再发信息发过来,有时对短信采取无视的方法,又会错过真正有用的短信。
360 互联网安全中心于 2017 年 2 月发布的《2016 年中国互联网安全报告》显示,360 手机卫士在 2016 年内为全国手机用户共拦截约 173.5 亿条垃圾短信。绝大多数垃圾短信的内容都是广告推销或者影响社会稳定团结的谣言、诈骗等。
工业和信息化部于 2015 年 6 月颁布施行的《通信短信息服务管理规定》,其中规定任何短信服务提供商和短信内容发送者在未经用户同意的情况下,都不得向用户发送商业性的信息。因此垃圾短信成为当前一个重要的社会问题,有效识别垃圾短信对维护国家安全、社会稳定和人们正常生活具有重要的时代背景意义。
1.2 研究现状
随着垃圾短信泛滥问题越来越严重,使得短信服务提供商、手机厂商、安全软件厂商等也相继出了垃圾短信过滤方案。目前对垃圾短信进行有效识别的方法主要有三种,分别是基于黑白名单的方法、基于规则的方法和基于短信内容的方法。
基于黑名单和规则的识别方法比较简单,但需要手动添加号码名单和关键词,能够添加的数量相对有限且难以全面,导致识别的效果较差(就如上面笔者通过手机软件的举报功能对信息进行举报之后,对方总是能换个号码再发过来,而有些号码一半是正常短信,一半是广告推销,无法加入黑名单,而定规则也比较难全面)。所以利用人工智能文本分类技术从短信内容上识别出垃圾短信是目前的主要研究方向,即先让机器对人工标注过是否是垃圾短信的短信进行有监督学习生成模型,再利用生成的模型对新短信进行判断是否是垃圾短信,然后进行过滤。
1.3 研究内容
本文分析了垃圾短信过滤技术现状,研究了人工智能文本分类相关技术,及垃圾短信过滤基于词向量和卷积神经网络的实现,主要研究内容包括:
(一) 原始短信中特殊字符的处理;
(二) 中文分词原理,通过jieba分词器对中文短信进行分词,以及对停用词的过滤;
(三) 使用gensim的Word2Vec基于Wiki百科语料库训练词向量模型,通过训练好的词向量模型获取短信文本的特征;
(四) 卷积神经网络模型对于文本分类的适用性,及用于文本分类时卷积神经网络中每一层的设计及实现;
(五) Tensorflow框架的数据载体、模型载体、会话、优化器、数据处理方法,基于Tensorflow框架实现CNN模型。
1.4 论文结构
第一章绪论,介绍了课题研究的背景及意义,垃圾短信过滤技术研究现状,本文主要研究内容和论文结构。
第二章相关技术,简要介绍了垃圾短信过滤系统设计和实现过程中需要用到的中文分词、停用词过滤、词向量、CNN模型、Tensorflow等相关技术。
第三章总体设计,对垃圾短信过滤系统整体进行了设计,定义了本文要重点研究的垃圾短信分类模型训练模块和垃圾短信识别模块在整个系统中的上下文。使读者对每个模块需要实现的功能及系统边界有个直观的认识。
第四章详细设计及实现,对垃圾短信分类模型设计进行了研究并实现,研究了垃圾短信分类模型的整体流程、数据预处理、短信特征提取、模型的设计训练和评估的整个过程,同时也对自己基于WIKI百科训练词向量模型的过程进行描述。
第五章总结及展望,对工作做简要的总结,并对后续工作提出设想。
第二章 相关技术
2.1 中文分词
指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。
本系统是对中文短信进行分类,从而过滤垃圾短信,基于词向量来设计和实现的,因此应该以分开的具有独立语言意义的词组作为文本的最小组成要素。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,因此中文文本预处理的首要任务是先对文本进行中文分词,将词与词分隔开来
有研究表明,分词质量高低与最终的文本分类效果息息相关,因此快速准确的分词算法是非常重要的。
JIEBA是目前比较流行的一款python中文分词工具,同时也是免费开源的,它支持三种分词模式:
1)精确模式:试图将句子最精确地分开,适合文本分析;
2)全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;
3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
本系统采用JIEBA中比较适合于文本分析的精确分词模式对短信文本进行分词处理。
2.2 停用词过滤
停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。这些停用词都是人工输入、非自动化生成的,生成后的停用词会形成一个停用词表。但是,并没有一个明确的停用词表能够适用于所有的工具。甚至有一些工具是明确地避免使用停用词来支持短语搜索的。
停用词是通常被认为没用的词,大致可分为如下两类:
1、使用十分广泛,甚至是过于频繁的一些单词。比如英文的“i”、“is”、“what”,中文的“我”、“就”之类词几乎在每个文档上均会出现,
2、文本中出现频率很高,但实际意义又不大的词。这一类主要包括了语气助词、副词、介词、连词等,通常自身并无明确意义,只有将其放入一个完整的句子中才有一定作用的词语。如常见的“的”、“在”、“和”、“接着”之类,比如“SEO研究院是原创的SEO博客”这句话中的“是”、“的”就是两个停用词。
停用词过滤,是文本分析中一个预处理方法。它的功能是过滤分词结果中的噪声,节省存储空间和提高搜索效率。
2.3 词向量
词向量(Word embedding),又叫Word嵌入式自然语言处理(NLP)中的一组语言建模和特征学习技术的统称。
比起传统向量空间模型,词向量模型具有可以表示词语之间的类比关系、低维、是连续的实数的特点。
向量空间模型 | 词向量模型 | |
词语之间距离 | Hamming distance 只有相同与不同 | 余弦距离 可以表示词语之间的类比关系 |
向量维度大小 | 高维向量,~30K 大小等于词典大小,即词典中有多少个不同的词,决定了向量维度大小 | 低维向量,~50-300 可以自行决定向量维度大小 (电脑计算能力较强可以用高点维数,计算能力较弱则可以用小点向量,维度越高表达能力越丰富,因为有更多维度存储信息) |
表示方法 | 离散,整数 | 连续,实数 |
词向量方法比起传统向量空间模型的优势是可以通过控制向量的维数来解决“维数灾难”的问题,并且词向量在训练过程中注重词与词之间的位置关系,保留词组在语义之间的联系。
词向量是训练语言模型得到的,词向量表示一个矩阵,矩阵的每一行向量对应了一个向量的词,矩阵的列数代表了词向量的维度。
Word2vec是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。
2.4 CNN模型
CNN模型是一种以卷积为核心的前馈神经网络模型。神经网络和深度学习模型种类繁多,其中前馈神经网络是相对比较成熟、应用比较广泛的一类。相较于其他前馈神经网络,CNN模型的参数较少,泛化能力强,它是当前深度学习领域的研究热点之一,被大量应用于计算机视觉、自然语言处理等领域。
CNN模型由一系列的层不断堆叠而成。一些复杂的CNN模型可以采用多个堆叠的层同时对输入数据做处理。卷积层是CNN模型的主要组成模块之一,它所对应的数学操作即为卷积运算。CNN模型除了必备的卷积层和激活层之外,还可以包含其他层,如池化层、全连接层、批归一化层等。CNN模型的每一层都可以代表一种数学操作。这些操作有些是线性的,比如卷积、全连接、批归一化操作等;有些是非线性的,比如池化、激活操作等。非线性操作的存在保证了CNN模型是一个非线性模型,使其具备强大的学习能力。训练后的CNN模型整体上可看作一种非线性映射。
下图为CNN模型的基本结构:
2.5 TensorFlow
TensorFlow是Google开源软件库,是一个基于数据流编程的符号数学系统,被广泛应用于各类机器学习算法的编程实现。
Tensorflow框架特点:
- 轻便,可扩展
- 可以在不同设备上运行,小到智能手机,大到计算机集群,
- 轻量级软件,可以立刻生成训练模型,也能重新实现它
- 有强大的社区和企业支持,因此可以广泛的用于从个人到企业,从初创企业到大公司
Tensorflow与Theano、Caffe等软件一样使用基于声明式编程的数据流图作为编程范式。它是结构化、抽象化的,用户不必纠结于每个步骤的具体实现,而是通过下定义的方式描述期望达到的状态。与命令式编程相比,声明式编程更擅长基于数理逻辑的应用领域,如深度学习、人工智能、符号计算系统等。
第三章 需求概述
垃圾短信的过滤即可以在短信网关中进行实现,也可以通过在用户手机安装垃圾短信过滤APP进行实现。
一般来说,如果是短信网关中对垃圾短信过滤,基于可扩展性和可维护性等角度考虑,垃圾短信的识别模块会以单独的服务形式提供。短信网关收到SP发送给用户手机的短信时会先调用垃圾短信识别服务判断短信是否是垃圾短信,如果是垃圾短信则进行过滤,否则发送给用户手机。
如果是手机APP形式实现垃圾短信过滤,则垃圾短信的识别模块可以以后台服务的形式提供(可扩展性和可维护性考虑),也可以直接作为APP中的一个子模块实现(基于流量性能等考虑)。
不管垃圾短信的识别模块以何种方式提供,首先都需要先有垃圾短信分类模型。这里以在短信网关中实现垃圾短信过滤为例,展示垃圾短信分类模型的训练模块在整个系统中的上下文。
图:系统上下文
系统上下文中可以看出垃圾短信分类模型训练模块和垃圾短信识别模块在整个系统中所处的位置和系统边界。基于时间考虑,暂时不对整个垃圾短信过滤系统进行实现,只对其中垃圾短信分类模型进行详细的设计及实现。
第四章 模型设计与实现
4.1 垃圾短信分类模型设计及实现
4.1.1 整体流程
4.1.2 短信数据集收集
4.1.2.1数据集收集
从网上下载了带标签的短信数据集,第一列为标签,第二列为短信文本,格式如下:
4.1.2.2数据加载
从数据集文件中读取数据到内存,代码实现如下:
4.1.3 数据预处理
4.1.3.1数据清洗
由于原始的短信文本数据的格式没有统一的规范,包含许多标点符号和表情图形或颜文字等特殊元素,无法直接处理,需要先对其进行数据清洗。
原始的短信文本数据里的标点符号、表情图和颜文字等与短信的上下文语境之间没有语义关联,首先需要将这些特殊元素过滤掉,只保留具有语言信息意义的中文词组和一些专有的外文词汇。
另外词向量模型中词语是先将繁体转换为简体进行处理的,所以短信文本也采用相同的处理将繁体字转换为简体字。
原始的短信文本经过数据预处理步骤后,格式更为统一规范,为后续的分词处理奠定了良好的基础。
数据清洗的代码实现如下:
以短信文本内容“查账还款分期贷款,吃喝玩乐一步到位,下载掌上生活APP,我们为您准备了一份价值500元新户大礼包,戳 cmbt.cn/uNq 。[招商银行]”为例,经过数据清洗后变为“查账还款分期贷款 吃喝玩乐一步到位 下载掌上生活 我们为您准备了一份价值 元新户大礼包 戳 招商银行”。
4.1.3.2中文分词
由于中文不像英文以空格作为单词之间的分隔符,中文词汇之间没有明确的界限,因此需要先对短信进行中文分词处理,以词作为短信的组成要素。
本文采用 python 第三方库 中的 jieba 分词器里的精确分词模式作为分词工具。
代码实现如下:
以上节经过清洗后的短信文本内容是“查账还款分期贷款 吃喝玩乐一步到位 下载掌上生活 我们为您准备了一份价值 元新户大礼包 戳 招商银行”为例,分词完毕后结果为“['查账', '还款', '分期', '贷款', '吃喝玩乐', '一步到位', '下载', '掌上', '生活', '我们', '为', '您', '准备', '了', '一份', '价值', '元新户', '大礼包', '戳', '招商银行']”。取得了较好的分词效果。
4.1.3.3停用词过滤
分词完毕后,一般还要去除短信文本中的停用词,节省存储空间,提高效率,去除噪音。停用词过滤时先准备停用词表,再过滤短信文本中包含在停用词表中的词。
代码实现如下:
上小节中中分分词后的句子,经过停用词过滤后,结果如下:
4.1.4 短信特征提取
经过中文分词后的短信文本,我们可以从已经训练好的词向量模型中获取短信文本的词向量(关于如何训练词向量模型具体参考4.2章节基于WIKI百科语料库的词向量模型设计及实现),表示成特征矩阵形式。
由于每条短信文本长短不一,而后续训练卷积神经网络模型的输入层,需要将各条短信的特征矩阵设置为同一大小。特征矩阵的高度应该由短信数据集中长度最长的短信决定。若短信数据集中各条短信在经过中文分词处理后,词组数目最多的一条短信含有m个词,则该短信由 m个 k维向量按照词组的顺序进行纵向排列成 m×k 的特征矩阵表示。对于含词汇数目小于 m 的短信则需要作补零处理。
代码实现如下:
得到短信的词向量表示的特征矩阵之后,我们就可以把它作为卷积神经网络的输入数据。
4.1.5 垃圾短信分类CNN模型设计及实现
一个典型的CNN由输入层、卷积层、激励层、池化层和全连接层五部分构成。 CNN 区别于其它神经网络之处在于 CNN 采用了局部连接和权值共享技术,对局部微小的特征更加敏感,这更有利于提取短信文本的特征信息。通过对短信文本进行卷积和池化操作,可以在词和词的位置信息之间提取出更多的抽象特征值和相关语义信息。
CNN 模型起初用在图像处理领域中,以每张图片的像素矩阵作为模型的输入。灰度图像以一个二维矩阵表示,由于每个像素点只能有一个值表示颜色,因此灰度图像也称为单通道图像;彩色图像也叫 RGB 通道图像, 以一个三维矩阵表示,每一维矩阵分别代表红色(R)通道、绿色(G)通道和蓝色(B)通道。本文用于垃圾短信识别的CNN模型的输入层是类似于灰度图像的表示各个短信文本的二维特征矩阵,因此每条短信都只有一个通道。
4.1.5.1输入层设计及实现
输入层的作用是把提取到的表示短信的特征矩阵作为输入数据传送到CNN 模型中,并和下一层的卷积层连接起来。为了在垃圾短信识别任务中应用卷积神经网络模型,模型的输入应该是类似于图像像素的特征矩阵。一条短信的每个词向量表示特征矩阵的一行,包含的词个数就是特征矩阵的行数,词向量的维度就是特征矩阵的列数。
但由于短信长短不一,为便于后续卷积层和池化层提取出更加抽象的高层次,这里需要将短信的特征矩阵设置为同一大小(具体参见4.1.4短信特征提取)。
一般在输入层还需要做归一化等处理,本文未对这一块进行研究,暂略。
4.1.5.2卷积层设计
卷积层作为CNN的核心组成部分,是使用一系列卷积核与输入数据做卷积的线性计算层。卷积层的提出是为了利用输入数据中特征的局域性和位置无关性来降低整个模型的参数量。
卷积计算的结果与卷积核大小h*k,步长s和补零p这四个参数密切相关。
本文设计卷积核的宽度等于词向量的维度k,高度h根据文本的长度设置合适的值,步长s=1,不补0。
卷积核以大小为 1 的步长从文本特征矩阵的顶部由上至下开始扫描并和卷积核窗口内的矩阵进行卷积计算,每一步都提取出一个新的特征值。假设一条短信的特征矩阵为m*k, 经过卷积操作后,则变为了(m-h+1)*1的特征图V
特征图V的高度为m-h+1, 宽度为1。
窗口高度不同的卷积核可以提取出高度也不同的特征图V,意味着可以从不同的角度提取短信特征,得到更为完善的特征信息。CNN的强大之处就在于其卷积块强大的特征提取能力。
为了从不同角度提取特征而不增加计算的复杂度, Kim所提出的模型(参考文献8)使用了三种不同的卷积窗口。由于不同的短信,其前后文的语义关联不一样,为从短信文本中提取较为完备的特征,因此本文也使用三种窗口高度不同的卷积核提取相应的局部语义特征。因短信文本的长度一般在几个到几十个词之间,可将卷积核的高度分别设置为 3、4、5,最终得到 3 种不同粒度的特征。CNN提取特征的具体流程下图所示。
三种卷积核的大小分别设置为 3* k 、 4*k 、 5*k ,通过卷积核扫描运算后,获得 3 种粒度大小分别为(m-2)*1、 (m-3 )*1和 (m-4 )*1的特征图。
本文设置每种尺寸卷积核各128个,即对每条短信文本的特征矩阵输入,一种卷积核可得到 128 个特征图,卷积层输出 384个特征图。
代码实现如下所示:
4.1.5.3池化层设计
池化层的功能是对局部信息再总结,使卷积层提取到的文本向量维数减小,防止出现过拟合。池化操作包括常用的 Max-Pooling 和 Average-Pooling。Max-Pooling是输出所接收到特征图V中的最大值,可以认为这个最大值是短信的最显著的特征。 Average-Pooling是输出特征图V中所有值的平均值。常见的自然语言处理任务中通常使用Max-Pooling方法,而且有研究表明Max-Pooling 更适合于文本分类。因此本文以 Max-Pooling 为基础进行研究。 考虑到短信文本的长度差异,本文采取 1-maxpooling 的 池化策略,即对每一个特征图只取一个最大值。卷积层输出的 384个特征图经过池化处理后得到384个特征值。
4.1.5.4全连接层设计
池化操作得到的384个特征值是对垃圾短信识别最具影响的局部特征。全连接的操作是对这 384 个特征值进行融合,本文以串接的方式把这 384 个特征值串联起来,形成一个固定长度的融合特征向量来表示短信的语义特征。特征向量的长度不再与短信的长度相关联,每条短信的有效特征都是一个 384维的向量。
在训练全连接层参数时,为避免发生过拟合,采取 dropout 策略使部分神经节点失效,即一些已经训练过的参数 在每一次更新时将被随机选择丢弃。在训练神经网络模型的参数时将 dropout 的值设置为0.5,
把表示短信的语义特征向量 message V输入最后的 softmaxRegression分类器,从全局的角度对特征进行分析,进而完成垃圾短信的识别。
代码实现如下:
4.1.6 垃圾短信分类模型训练
为使训练过程既可以获得较好的收敛效果也可以达到较快的收敛速度,本文使用 mini-batch 梯度下降法进行 CNN 模型的训练,即用一部分短信参与迭代过程。短信样本容量为 50000,为实现收敛效果和收敛速度之间的平衡,将每批样本大小设置为 1000。
获取批量数据代码实现如下:
训练模型时,本文采用了应用比较广泛的AdamOptimizer 优化器。
CNN模型训练参数设置如下:
参数名称 | 参数值 |
词向量维度 | 100 |
卷积核个数 | 128 |
卷积核窗口高度 | 3,4,5 |
Mini-batch | 1000 |
dropout | 0.5 |
训练次数 | 20 |
学习率 | 0.001,0.01,0.1 |
由于时间关系,本文并没有对训练结果以图形化,进行显示比较。所以这里以文字描述训练结果。
由于笔者测试机器配置等原因,当使用10W条的短信文本进行训练时训练一半会出现错误,所以笔者只使用了5W条短信文本进行训练,当学习率设置为0.01和0.001时都能较快收敛。当学习率设置为0.1时则不停振荡,不易收敛。
下面时当学习率设置为0.01,训练次数为20时的一次训练结果。训练完成后,对模型进行保存。
4.1.7 垃圾短信分类模型评估
笔者另外取未参与训练的2W条数据评估,准确率为0.98475
4.1.8 训练模型参数优化
上面的模型训练完成之后,对新数据集进行评估,准确率达到了0.98475,取得了相对较好得结果。我们还可以通过对训练参数进行修改测试看是否能够取得更优的结果。
比如可以将卷积核高度改为2、3、4,看是否能提高识别准确率。
学习率设置为0.02、0.005看收敛速度。
将垃圾短信分类模型移到内存等配置更高的机器进行训练,训练数据集增加到10W和20W,看是否能提高识别准确率。
由于时间关系,这里暂略。
4.2 基于WIKI百科的词向量模型设计及实现
4.2.1 设计描述
若要得到质量较高的词向量,需要具备较大规模的语料库,目的是为了充分地反映出词组在语义空间的位置关系。而维基中文语料是公认的大型中文语料,本文采用维基中文语料库训练词向量。
训练词向量模型时有两个重要的参数需要设置,分别是窗口长度参数c 和词向量维数 k。 原则上c值越大,考虑前后文的关系就更全面,一般能使预测的结果更加精确,但也会使训练时间更长,因此需要不断尝试来确定c 值的大小。由于短信文本的长度较短,故c的值不宜太大,否则容易引起关联到很多语义不相关的词汇。 词向量维数 k可以根据所解决问题的要求和语料库的大小确定。为更能体现各个词组在语义空间上的分布情况,应该使词向量的维数尽量大一些。但前提是需要有大而均匀的语料库作为支撑,为避免发生过拟合现象,也需要更高要求的模型表达能力和硬件计算能力。在确定了合适的c和k以后,模型可根据数据集训练出各个词组的词向量。
在短信文本中,词与词、句子与句子之间在语境上更依赖前后文的关系,而不是割裂孤立起来的,这种语义关联直接影响到最终的识别结果。与用向量空间模型作为特征提取方法相比,Word2Vec 更重视词组前后文之间的语序和语法上的联系。而且所有词组的词向量各个维度上都有数值,这解决了传统特征提取方法中数据稀疏和维数灾难问题。
经权衡,本文暂将词向量的位置k设置为100。窗口大小c设置为5。本文使用 python 的第三方开源库 Gensim 作为训练词向量的工具。
4.2.2 训练流程
4.2.3 下载WIKI中文语料库
本系统使用的语料库是wiki百科的中文语料库,下载地址:
https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2。
4.2.4 数据预处理
4.2.4.1将xml格式数据转为txt
由于下载下来的zhwiki-latest-pages-articles.xml.bz2是XML格式,需要先做一些转换工作。本文使用gensim库中的维基百科处理类WikiCorpus,该类中的get_texts方法将原文件中的文章转化为一个数组,数组中每一个元素对应着原文件中的一篇文章。然后通过for循环便可以将其中的每一篇文章读出,然后保存到wiki.cn.txt文件中。
4.2.4.2繁体转为简体
为了方便后期处理,接下来对上面的结果进行简体化处理,将所有的繁体全部转化为简体。在这里,使用了另外一个库zhconv。对上面结果的每一行调用convert函数即可,转换完后保存到wiki.cn.simple.txt文件中。
4.2.4.3中文分词
对于中文来说,分词是必须要经过的一步处理,下面就需要进行分词操作。这里使用jieba分词器。调用其中的cut方法即可。分词完成后的结果保存在wiki.cn.simple.separate.txt。
4.2.4.4去除非中文词
可以看到,经过上面的处理之后,现在的结果已经差不多了,但是还存在着一些非中文词,所以下一步便将这些词去除。具体做法是通过正则表达式判断每一个词是不是符合汉字开头、汉字结尾、中间全是汉字,即“^[\u4e00-\u9fa5]+$”。
4.2.5 训练词向量
上节完成了对wiki语料库的数据预处理,接下来进行词向量训练。也是使用了gensim库,通过其中的Word2Vec类进行了模型训练,并将最终的词向量保存起来。
4.2.6 训练模型参数优化
我们可以在训练词向量模型时将词向量维度改为150,窗口大小改为3还 4,看最终短信识别准确率能否得到提高。
这里暂略。
第五章 总结及展望
垃圾短信的泛滥越来越严重,严重干扰了人们的生活。为有效识别垃圾短信并建立可靠模型,本文深入研究了短信文本预处理和基于词向量模型的特征提取方法以及基于卷积神经网络的文本分类方法建立了垃圾短信分类模型,取得了相对较好的结果。
但是由于时间的关系,本文中还有许多待解决的问题:
1)本文没有对其他模型的识别效果进行比较,比如LSTM、向量机等模型,后续可以进行一些比较。
2)系统在进行验证的时候,使用了停用词过滤方法和不使用停用词过滤方法准确率并没有显著提升,甚至还略有下降,但是由于时间关系,系统并没有做充分的测试来验证停用词过滤的效果,后续需要对停用词过滤效果进行再次验证。同时考虑修改停用词表,使其更适合短信文本的过滤。
3)系统在使用10W条短信数据集进行测试时由于内存不足的原因发生错误,需要进一步测试代码中各个步骤,内存占用情况。同时考虑在内存和CPU等配置更高的机器上使用更大数据集对模型进行训练。
4)训练时间过长,5W条数据集在训练20次的情况下大概要1个小时,后续可以考虑在分布式平台上对模型进行训练。
5)另外98%的准确率,如果是100条垃圾短信中有2条未被识别出来而发送到用户手机,则关系不大。如果是100条正常短信中有2条被识别成垃圾短信而被过滤,则相对来说有点难以接受。所以模型评估时需要进一步明确正常短信被识别成垃圾短信而被过滤的概率,并找出是哪些正常短信会被识别成垃圾短信,看是否可以通过修改训练数据集来避免正常短信被识别成垃圾短信,也可能需要考虑另外辅助的解决方案。
参考文献及附录
- 《深入理解Tensorflow架构设计与实现原理》彭靖田/林健/白小龙著,人民邮电出版社;
- 《基于词向量和卷积神经网络的垃圾短信识别方法》赖文辉/乔宇鹏著 http://www.cnki.com.cn/Article/CJFDTotal-JSJY20180509001.htm
- 《中文分词的原理与实现》 https://blog.csdn.net/mingzai624/article/details/51698643
- 《中文分词的基本原理以及jieba分词的用法》 https://blog.csdn.net/John_xyz/article/details/54645527
- 《用gensim学习word2vec》https://www.cnblogs.com/pinard/p/7278324.html
- 《基于word2vec使用中文wiki语料库训练词向量》https://www.jianshu.com/p/e21dd72e391e
- 《wiki中文语料库》https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2.
- KIMY.Convolutional neural networks for sentence classification[C] // Proc of Conference on Empirical Methodsin Natural Language Processing,2014:1746-1751
本文为原创,转载请注明来自:垃圾短信过滤基于词向量和卷积神经网络的设计和实现-CSDN博客
源码下载地址:https://github.com/haleylan10/sms_text_classification.git