Skip to content

ysh329/spam-msg-classifier

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

基于文本内容的垃圾短信识别

问题背景:垃圾短信已日益成为困扰运营商和手机用户的难题,严重影响到人们正常生活、侵害到运营商的社会形象以及危害着社会稳定。而不法分子运用科技手段不断更新垃圾短信形式且传播途径非常广泛,传统的基于策略、关键词等过滤的效果有限,很多垃圾短信“逃脱”过滤,继续到达手机终端。如何结合机器学习算法、大数据分析挖掘来智能地识别垃圾短信及其变种是当下的一个热门课题。

问题描述:基于短信文本内容,准确地、完整地识别出垃圾短信、正常短信。用准确率、查全率、效率(每秒处理条数)衡量。考虑到现实环境中数据量巨大,请同时考虑算法单机实现版和并行实现版。

  1. 文本分析可采用开源分词器(也可自己完善);
  2. 算法不限于单一算法,可以是组合算法;
  3. 开发语言不限,java,python,R等;
  4. 算法评估指标:查全率、准确率、性能(效率:每秒处理的记录数)

阶段目标:

总共包含7个阶段,每个阶段有其对应的检查方式:

  1. 数据库设计和实现
  2. 【短信表】的数据导入和预处理
  3. 【词语表】的数据导入
  4. 从短信分词后的字符串到索引向量再到稀疏词语向量
  5. 统计垃圾短信词频并计算垃圾短信词语概率
  6. 构造分类器模型
  7. 计算算法评估指标

####1) 数据库设计和实现。
检查方式:能在数据库中清楚地看到数据库中的两个表(【短信表】和【分词表】),并描述表结构和表字段的含义。
将用于短信存储和阶段处理的数据储存在数据库中,需要设计并实现数据表的逻辑关系,并表明清楚对应字段的含义。
具体来说,需要实现两个表:【短信表】和【词语表】。
【短信表】有存储短信原始数据的字段外,还有其它处理过程中的字段(比方说,垃圾短信标记,分词后的短信字符串,去停用词后的短信字符串,短信关键词等字段);
【词语表】是对短信做过分词后的结果去重复得到的——不重复词语的表(在该表中,有出现频率,概率等等字段)。

####2) 【短信表】的数据导入和预处理。
检查方式:能在数据库的【短信表】中看到导入的原始短信数据和预处理后的数据(短信字符串长度,短信字符串词数等等字段),并能描述清楚操作流程和思想。
将原始短信数据,预处理后的短信数据导入设计完成的数据库中。其中,预处理是指对短信做分词,去停用词,元数据统计(元数据是指描述数据的数据,比方说短信字符串长度,短信字符串词数)等等操作。
将两部分(原始短信数据,预处理短信数据)的数据导入数据库的【短信表】中。

####3) 【词语表】的数据导入。
检查方式:能在数据库中的【词语表】查看导入的不重复词语。
【词语表】数据导入涉及到数据量比较大(80万训练集数据,20万测试集数据),需要用到大数据处理框架Spark来做词语去重,否则会因任务量过大而导致程序卡死。
这个过程中,我们首先会从数据库的【短信表】中抽取出分过词的短信字符串,然后将其读入进我们的数据处理框架Spark中,通过Spark自带的方法进行去重。
在去重复词语操作完成后,我们会将不重复词语导入到【词语表】中。

####4) 从短信分词后的字符串到索引向量再到稀疏词语向量。
检查方式:能在【短信表】看到从分词后字符串转换后的索引向量字段,以及词语向量字段。其中,【短信表】索引向量字段值和词语向量字段值能与【词语表】的索引值对应上。
由于短信是一个字符串形式的数据,我们需要计算需要将其转换为数字或者向量的形式。
首先,我们将字符串分词,并得出不重复词语以及自动生成索引。之后,我们用索引来替代分词后字符串中的词语,这时就将分词后的字符串转换成了索引向量,但是还不够,此时的索引向量还无法计算。
我们需要将其进一步转化,那就是将这个索引向量进一步转换成词语向量。比方说,我们的【词语表】中不重复词有1000个,那么一个短信的词语向量就表示为一个1000个元素的向量,其中第i个元素的值为就是在【词语表】中,索引值为i的词语在该短信中出现的次数。这样,就实现了从短信字符串到词语向量的表示。

####5) 统计垃圾短信词频并计算垃圾短信词语概率。
检查方式:在【词语表】中统计索引为i的词语出现在垃圾短信中的词数,正常短信中的词数,所有短信中出现的词数,以及该词是垃圾词的概率(能看到这四个字段的值),以及可视化后的的三个短信词频条形图。
统计标记数据中垃圾短信的词语频率,得到垃圾短信,正常短信,所有短信的三个词语频率的分布,并对结果可视化为条形图。

####6) 构造分类器模型。
检查方式:在【短信表】中看到所有短信依照下面公式计算出的垃圾短信概率的字段值。
模型为条件概率模型。比方说,某短信的词语向量表示为$[v1, v2, v3, v4, v5]$,要计算第$i$个短信为垃圾短信的概率$p^{(i)}$,有 :
$$ p^{(i)} = p(v1)\times p(v2|v1)\times p(v3|v1,v2)\times p(v4|v1,v2,v3)\times p(v5|v1,v2,v3,v4) $$

由于此计算公式计算量太大,将其化简为:

$$ p^{(i)} = p(v1)\times p(v2)\times p(v3)\times p(v4)\times p(v5) $$
其中,$p(v)$是在5)中计算的垃圾词概率,即该词语出现在垃圾短信的词数除以正常短信和垃圾短信中出现的总次数。
我们对训练集数据中的所有的垃圾短信用简化过的公式计算,并计算出这些短信为垃圾短信的平均概率,以此概率为阈值,作为判断新短信是否为垃圾短信的依据。

####7)计算算法评估指标。
检查方式:计算出查全率,准确率,性能的结果。
计算查全率(即召回率),准确率、性能(效率:每秒处理的记录数)。
其中,查全率$P_{recall}$,准确率$P_{precision}$,性能$M$的计算公式为:
$$ P_{precision} = \frac{分类器分为正确的短信条数}{分类器分的所有短信条数} $$

$$ P_{recall} = \frac{分类器分为正确的短信条数}{分类器分的所有短信条数中事实上是正确短信的条数} $$

$$ M = \frac{分类器对所有样本分类的时间}{分类器分类的短信个数} $$

About

A spam message classifier based on Naive Bayes.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages