Python机器学习实战—使用朴素贝叶斯进行垃圾短信识别

一、引子

现在的很多手机管理软件都有垃圾短信拦截的功能,很智能很贴心是不是 嗯~ o( ̄▽ ̄)o 对于经常被垃圾短信骚扰的人来说,很是有用。(๑•̀ㅂ•́)و✧ 但是很多的拦截软件在拦截到垃圾短信之后……又发个通知提示拦截到了垃圾短信╮(﹀_﹀)╭ 好奇心害死猫,你告诉了我你拦截到了垃圾短信,我当然想知道你拦截的是什么垃圾短信了╮(╯_╰)╭

二、分类与垃圾短信识别

机器学习按性质来看,可以分为三大类:

  • 分类(监督)
  • 回归(监督)
  • 聚类(半监督) 垃圾短信通常用已标记的短信数据,对未知的短信进行判断,其属于机器学习中的分类性质。 在Python中有很多机器学习的模块,比如Sklearn、Tensorflow、Caffe等,可以很方便地调用一些机器学习的算法。

三、垃圾短信识别

嗯,直接上手干……( ̄_, ̄ ) 80w训练数据集和20w测试数据集均来源于github上的一位小哥哥,在此谢过d=====( ̄▽ ̄*)b

1、数据处理

嗯,先看看数据长啥样:

import pandas as pd
data = pd.read_csv(r"H:\RubbishMessage\data\80w.txt",encoding='utf-8',sep='    ',header=None)
data.head()

最后一列为短信的内容,倒数第二列则是短信的类型,0表示正常短信,1表示垃圾短信。 然后,我们对短信内容按照不同的类型(正常短信和垃圾短信)进行分割和分词:

# 垃圾短信import jieba
spam = data[data[1] == 1]
spam[2] = spam[2].map(lambda x:' '.join(jieba.cut(x)))
spam.head()
# 正常短信
normal = data[data[1] == 0]
normal[2] = normal[2].map(lambda x:' '.join(jieba.cut(x)))
normal.head()

分别将不同类型分词后的短信保存为不同的文件:

spam.to_csv('soam.csv',encoding='utf-8',header=False,index=False,columns=[2])
normal.to_csv('normal.csv',encoding='utf-8',header=False,index=False,columns=[2])

2、模型选择和训练

在此我们没有选择Sklearn或是其他的深度学习库,而是选用NLTK自然语言处理库来进行贝叶斯分类。 导入模块:

import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import PlaintextCorpusReaderimport random

加载刚刚导出的短信文件:

加载短信语料库
message_corpus = PlaintextCorpusReader('./',['soam.csv','normal.csv'])
all_message = message_corpus.words()

定义一个特征函数,用于生成特征:

def massage_feature(word,num_letter=1):
    return {'feature':word[-num_letter:]}

对短信特征进行标记提取:

labels_name = ([(massage,'垃圾') for massage in message_corpus.words('soam.csv')]+[(massage,'正常') for massage in message_corpus.words('normal.csv')])
random.seed(7)
random.shuffle(labels_name)

训练并预测模型

from nltk.classify import accuracy as nltk_accuracy
featuresets = [(massage_feature(n),massage) for (n,massage) in labels_name]
train_set,test_set = featuresets[2000:],featuresets[:2000]
classifier = NaiveBayesClassifier.train(train_set)

最后,咱们看看预测的准确率怎么样:

print('结果准确率:',str(100*nltk_accuracy(classifier,test_set))+str('%'))

在没有调整优化参数的情况下,有百分之八十几的准确率,还是不错的 ━━( ̄ー ̄*|||━━ PS: 需要短信的训练数据和测试数据以及jupyter notebook文件的可以回复关键字:垃圾短信识别

(百度分享经常抽风被封,如果分享链接失效,欢迎反馈)

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2017-07-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习和数学

[Tensorflow] Tensorflow中模型保存与回收的简单总结

今天要聊得是怎么利用TensorFlow来保存我们的模型文件,以及模型文件的回收(读取)。刚开始接触TensorFlow的时候,没在意模型文件的使用,只要能...

3458
来自专栏数据小魔方

像电影一样记录数据可视化

之前写过两篇关于使用animation包来制作时间维度动态可视化GIF图,效果还是很棒的,最近又发现了一个好玩的包——gganimate,它也是主打制作时间维度...

2695
来自专栏24K纯开源

ChartDirector应用笔记(一)

ChartDirector介绍 ChartDirector是一款小巧精细的商业图表库。其适用的语言范围非常广泛,包括.Net, Java, Asp, VB, ...

1947
来自专栏杨海力的专栏

Spark MLlib 算法系列之 FM

Spark之所以在机器学习方面具有得天独厚的优势,有以下几点原因:

1.2K1
来自专栏量子位

简化深度学习实践流程:新鲜出炉的TensorFlow项目模板来了

林鳞 编译自 GitHub 量子位 出品 | 公众号 QbitAI 新的TensorFlow项目模板来了。 昨天,用户mrgemy95在Reddit上发帖,称这...

3694
来自专栏QQ音乐技术团队的专栏

理解 iOS Core Audio 音频概念

在了解 iOS Core Audio 相关技术的时候,会遇到 bitrate、sample、frame 和 packet 等概念。由于业界在不同场合下使用 pa...

2417
来自专栏杨海力的专栏

Spark MLlib 算法系列之 LR

Spark之所以在机器学习方面具有得天独厚的优势,有以下几点原因:

2932
来自专栏算法channel

机器学习|PageRank算法原理

01 — 网页排名主要考虑因素 学术界评判学术论文重要性通用方法是看论文的引用次数,原理很多时候都是可以通用的,学术界的思想可以应用到工业界。 google创始...

3076
来自专栏AI研习社

问答 | tensorflow 怎么配置非数据并行分布式?

假设模型有两个conv层和1个fc层,有3台服务器每台各一块显卡,请问要怎么实现把计算图拆成3部分,每块显卡分别计算一个层,而不是把计算图完整复制3份放到3块卡...

1203
来自专栏CSDN技术头条

基于OpenGL ES的深度学习框架编写

背景与工程定位 背景 项目组基于深度学习实现了视频风格化和人像抠图的功能,但这是在PC/服务端上跑的,现在需要移植到移动端,因此需要一个移动端的深度学习的计算框...

2898

扫码关注云+社区