机器学习:11.朴素贝叶斯-垃圾邮件分类
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)
测试结果如下:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· DeepSeek智能编程
· 精选4款基于.NET开源、功能强大的通讯调试工具
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?