• 12.朴素贝叶斯-垃圾邮件分类


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

    列表

    numpy数组

    2.邮件预处理

    1. 邮件分句
    2. 句子分词
    3. 大小写,标点符号,去掉过短的单词
    4. 词性还原:复数、时态、比较级
    5. 连接成字符串

    2.1 传统方法来实现

    2.2 nltk库的安装与使用

    pip install nltk

    import nltk

    nltk.download()     # sever地址改成 http://www.nltk.org/nltk_data/

    或:https://github.com/nltk/nltk_data下载gh-pages分支,里面的Packages就是我们要的资源。

    将Packages文件夹改名为nltk_data。

    或:网盘链接:https://pan.baidu.com/s/1iJGCrz4fW3uYpuquB5jbew    提取码:o5ea

    放在用户目录。

    安装过程
    第一种方法:

     第二种方法:手动安装

    从GitHub上面下载(https://github.com/nltk/nltk_data

    解压后将文件放到相应目录下,可以通过 nltk.data.find(".")查到安装放置的目录,然后将其中的packages文件夹更名为nltk_data,然后复制到查到的目录下

        

    安装完成,通过下述命令可查看nltk版本:

    import nltk

    print nltk.__doc__

    2.1 nltk库 分词

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

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

    2.2 punkt 停用词

    from nltk.corpus import stopwords

    stops=stopwords.words('english')

    *如果提示需要下载punkt

    nltk.download(‘punkt’)  或 下载punkt.zip

    https://pan.baidu.com/s/1OwLB0O8fBWkdLx8VJ-9uNQ  密码:mema

    复制到对应的失败的目录C:UsersAdministratorAppDataRoaming ltk_data okenizers并解压。

    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 编写预处理函数

    总分析:特征为两个:普通邮件、垃圾邮件(y1,y2)------------特征:文本内容(x1,x2,x3....),需要通过分词来实现--------------模型:构建模型,进行预测

    def preprocessing(text):

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

     1 import pandas as pd
     2 import nltk
     3 from nltk.book import *
     4 from nltk.corpus import stopwords #停用词处理
     5 import re #标点符号处理
     6 from nltk.stem import WordNetLemmatizer #词性处理
     7 # nltk.download()
     8 # nltk.data.find(".") #查找安装nltk数据的地方
     9 # # 分词第一种
    10 # tokens=[] #用来存放单词
    11 # for i in range(len(sms_data)): #每一条邮件内容数据
    12 #     for sents in nltk.sent_tokenize(sms_data[i]): #每一条数据进行句子分句
    13 #         for words in nltk.word_tokenize(sents): #每条数据进行句子分单词
    14 #             tokens.append(words)
    15 # tokens
    16 
    17 def preprocess(text):
    18     # 分词第二种 写成一行
    19     tokens=[word for sents in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sents)]
    20 
    21     #去除停用词
    22     stops=stopwords.words('english') #英文单词中的停用词
    23     tokens=[token for token in tokens if token not in stops] #不在停用词里面的话,就保留下来
    24 
    25     # 去掉短语3的单词并且用lower()方法实现大写转小写
    26     tokens=[token.lower() for token in tokens if len(token)>=3]
    27 
    28     # 去除标点
    29     tokens=[re.sub('[!,;:?"\.../]+','',token) for token in tokens ]
    30     tokens=[token for token in tokens if token!='']
    31 
    32     # 词性还原
    33     tags=nltk.pos_tag(tokens) #可以知道每个次词的词性
    34     lemmatizer=WordNetLemmatizer()
    35     tokens=  [lemmatizer.lemmatize(token,pos='v') for token in tokens]#动词,时态
    36     tokens = [lemmatizer.lemmatize(token, pos='a') for token in tokens]  # 形容词,比较级
    37     tokens = [lemmatizer.lemmatize(token, pos='n') for token in tokens]  # 名词,单复数
    38     return tokens
    39 
    40 if __name__=="__main__":
    41     # 读取文件,根据	区分,把数据根据标签和内容分开
    42     emails = pd.read_csv("./机器学习/SMSSpamCollection.txt", encoding='utf-8', sep="	",header=None)
    43     sms_label=[]# sms_label #存放标签,是普通邮件还是垃圾邮件
    44     new_data=[]# sms_data #存放数据即邮件内容,文本
    45     
    46     for i in range(emails.shape[0]): #循环
    47         sms_label.append(emails.iloc[i, 0])# 通过数据框的iloc[前行,后列]进行提取
    48         new_data.append(preprocess(emails.iloc[i, 1]))
    49     print("邮件数据的标签为:
    ", sms_label)
    50     print("数据预处理后邮件数据的数据为:
    ", new_data)
    51     new_email = pd.DataFrame({"邮件种类(普通/垃圾)": sms_label, "文本特征": new_data})
    52     
    53 print(new_email)

    运行结果:

    3. 训练集与测试集

    4. 词向量

    词集模型****将词汇转为向量,生成的词向量只有0和1,表示该词汇在文本中是否出现过

    5. 模型

  • 相关阅读:
    SAP 盘盈盘亏移动类型701&702 Vs 711&712
    SAP MM里的ERS功能不适用于供应商寄售采购模式
    Docker overlay2占用大量磁盘空间解决办法
    pytorch 文本多分类
    Python调试输出变量一部分变成了省略号
    Python sklearn.externals中的joblib导入失败
    Python:SyntaxError:(unicode error) 'unicodeescape' codec can't decode bytes in pos
    dotnetCampus.UITest.WPF 一个支持中文用例的界面单元测试框架
    Introduction to Robotics Toolbox
    CUDA application design and development
  • 原文地址:https://www.cnblogs.com/cyxxixi/p/12892357.html
Copyright © 2020-2023  润新知