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

放在用户目录。

安装过程
第一种方法:
12.朴素贝叶斯-垃圾邮件分类_第1张图片

 第二种方法:手动安装

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

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

 12.朴素贝叶斯-垃圾邮件分类_第2张图片   12.朴素贝叶斯-垃圾邮件分类_第3张图片

安装完成,通过下述命令可查看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:\Users\Administrator\AppData\Roaming\nltk_data\tokenizers并解压。

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     # 读取文件,根据\t区分,把数据根据标签和内容分开
42     emails = pd.read_csv("./机器学习/SMSSpamCollection.txt", encoding='utf-8', sep="\t",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("邮件数据的标签为:\n", sms_label)
50     print("数据预处理后邮件数据的数据为:\n", new_data)
51     new_email = pd.DataFrame({"邮件种类(普通/垃圾)": sms_label, "文本特征": new_data})
52     
53 print(new_email)

运行结果:

12.朴素贝叶斯-垃圾邮件分类_第4张图片

3. 训练集与测试集

4. 词向量

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

5. 模型

你可能感兴趣的:(12.朴素贝叶斯-垃圾邮件分类)