1. 读邮件数据集文件,提取邮件本身与标签。
列表
numpy数组
2.邮件预处理
- 邮件分句
- 句子分词
- 大小写,标点符号,去掉过短的单词
- 词性还原:复数、时态、比较级
- 连接成字符串
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:\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)
运行结果:
3. 训练集与测试集
4. 词向量
词集模型****将词汇转为向量,生成的词向量只有0和1,表示该词汇在文本中是否出现过
5. 模型