zoukankan      html  css  js  c++  java
  • 机器学习:12.朴素贝叶斯-垃圾邮件分类

    1. 读邮件数据集文件,提取邮件本身与标签。

    测试数据:

    链接:https://pan.baidu.com/s/1BiftJ1BBggybitfqeZbSDQ
    提取码:en47

    列表

    numpy数组

    代码如下:

    import csv
    
    sms = open('../data/SMSSpamCollection', 'r', encoding='utf-8')
    data = csv.reader(sms, delimiter='	')
    for i in data:
        print(i)
    sms.close()

    测试结果:

    2.邮件预处理

    • 邮件分句
    • 名子分词
    • 去掉过短的单词
    • 词性还原
    • 连接成字符串
    •  传统方法来实现
    •  nltk库的安装与使用

    传统方法实现代码如下:(写法麻烦还是用nltk实现吧)

    安装nltk库:在Pycharm中安装结果如下:

     

     测试nltk库,输入命令运行,查看版本:

    import nltk
    
    print(nltk.__doc__)

    下载相关数据包

    下载nltk_data数据包:

    链接:https://pan.baidu.com/s/1DG9X7z1aNlGH-yH3SPyugg
    提取码:rp15

     下载好后的操作:

     ☆注意:如果不知道把数据包放到哪的可以运行我的最后程序代码

    运行结果如下:

     然后进入nltk_data文件夹下一级目录tokenizers文件夹下:

     解压punkt.zip此文件:

     解压后如图所示:

    2.1 nltk库 分词

    nltk.sent_tokenize(text) #对文本按照句子进行分割

    nltk.word_tokenize(sent) #对句子进行分词

    2.2 punkt 停用词

    from nltk.corpus import stopwords

    stops=stopwords.words('english')

    2.3 NLTK 词性标注

    nltk.pos_tag(tokens)

    2.4 Lemmatisation(词性还原)

    from nltk.stem import WordNetLemmatizer

    lemmatizer = WordNetLemmatizer()

    lemmatizer.lemmatize('leaves') #缺省名词

    lemmatizer.lemmatize('best',pos='a')

    lemmatizer.lemmatize('made',pos='v')

    一般先要分词、词性标注,再按词性做词性还原。

    2.5 编写预处理函数

    def preprocessing(text):

    sms_data.append(preprocessing(line[1])) #对每封邮件做预处理

     3. 训练集与测试集

    4. 词向量

    5. 模型

    实现代码如下:

    import nltk
    from nltk.corpus import stopwords
    from nltk.stem import WordNetLemmatizer
    import csv
    import string
    
    
    # 邮件预处理
    def preprocessing(text):
        text = text.lower()  # 将大学字符转成小写字符
        seq = string.punctuation  # string.punctuation 是python内置的标点符号的合集
        # 去除符号
        for ch in seq:
            text = text.replace(ch, '')  # 用空格代替去掉的符号
        tokens = []  # 定义一个空列表
        # 分词
        for set in nltk.sent_tokenize(text):  # 分句
            for word in nltk.word_tokenize(set):  # 分词
                tokens.append(word)  # 将分词结果追加进列表
        # 去除停用词
        stops = stopwords.words("english")  # 获取停用词
        tokens = [token for token in tokens if token not in stops]
        # print('去除停用词后列表长度', len(tokens))
        # 查看词性词性
        nltk.pos_tag(tokens)
        # 还原词性
        lemmatizer = WordNetLemmatizer()  # 定义还原对象
        tokens = [lemmatizer.lemmatize(token, pos='n') for token in tokens]  # 还原成名词
        tokens = [lemmatizer.lemmatize(token, pos='v') for token in tokens]  # 还原成动词
        tokens = [lemmatizer.lemmatize(token, pos='a') for token in tokens]  # 还原成形容词
        return tokens
    
    
    if __name__ == '__main__':
        sms = open('../data/SMSSpamCollection', 'r', encoding='utf-8')
        sms_type = []  # 邮件标题
        sms_con = []  # 邮件内容
        # 读csv文件
        sms_csv = csv.reader(sms, delimiter='	')  # tab作为分隔符
    
        for line in sms_csv:
            sms_type.append(line[0])
            sms_con.append(preprocessing(line[1]))
        sms.close()
        print("邮件标题:", sms_type, "
    
    ")
        print("邮件内容:")
        for i in sms_con:
            print(i)

    测试结果如下:

  • 相关阅读:
    飞思卡尔IMX6处理器的GPIO配置方式
    批处理清除VisualStudio解决方案文件夹
    总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告
    详解Linux2.6内核中基于platform机制的驱动模型 (经典)
    [驱动注册]platform_driver_register()与platform_device_register()
    机器人系统常用仿真软件介绍效果与评价指标
    WINCE的批处理
    项目开发中的人月及如何计算
    常用的六个富文本编辑器
    如何获取公众号里面的歌曲
  • 原文地址:https://www.cnblogs.com/zhif97/p/12918661.html
Copyright © 2011-2022 走看看