1. 读邮件数据集文件,提取邮件本身与标签。
测试数据:
链接:https://pan.baidu.com/s/1BiftJ1BBggybitfqeZbSDQ
提取码:en47
列表
numpy数组
代码如下:
import csv sms = open(\'../data/SMSSpamCollection\', \'r\', encoding=\'utf-8\') data = csv.reader(sms, delimiter=\'\t\') 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=\'\t\') # tab作为分隔符 for line in sms_csv: sms_type.append(line[0]) sms_con.append(preprocessing(line[1])) sms.close() print("邮件标题:", sms_type, "\n\n") print("邮件内容:") for i in sms_con: print(i)
测试结果如下: