美文网首页人工智能相关收集机器学习与数据挖掘机器学习和人工智能入门
Python机器学习实战—使用朴素贝叶斯进行垃圾短信识别

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

作者: 9c8bd366d2f7 | 来源:发表于2017-07-23 22:28 被阅读206次

    一、引子

    现在的很多手机管理软件都有垃圾短信拦截的功能,很智能很贴心是不是
    嗯~ 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 PlaintextCorpusReader
    import 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文件的可以关注我的微信公众号:州的先生 回复关键字:垃圾短信识别
    (百度云分享经常抽风被封,如果分享链接失效,欢迎反馈)

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/gpvpkxtx.html