4.Spam 分类器
总体目标:创建一个垃圾邮件过滤系统
基本步骤:
(1)从http://spamassassin.apache.org/old/publiccorpus/网址下载开源数据,包括垃圾邮件和普通邮件
(2)解压数据集,观察并熟悉数据格式
(3)将数据集分成训练集和测试集
(4)制作一个针对该数据集的数据预处理管道,将每一封邮件转换成特征向量的形式
(5)添加超参数
(6)训练几种机器学习分类器,计算精确率和召回率
首先,获取数据:
import os
import tarfile
from six.moves import urllib
DOWNLOAD_ROOT = "http://spamassassin.apache.org/old/publiccorpus/"
HAM_URL = DOWNLOAD_ROOT + "20030228_easy_ham.tar.bz2"
SPAM_URL = DOWNLOAD_ROOT + "20030228_spam.tar.bz2"
SPAM_PATH = os.path.join("datasets","spam")
def fetch_spam_data(spam_url = SPAM_URL,spam_path = SPAM_PATH):
if not os.path.isdir(spam_path):
os.makedirs(spam_path)
for filename,url in (("ham.tar.bz2",HAM_URL),("spam.tar.bz2",SPAM_URL)):
path = os.path.join(spam_path,filename)
if not os.path.isfile(path):
urllib.request.urlretrieve(url,path)
tar_bz2_file = tarfile.open(path)
tar_bz2_file.extractall(path = SPAM_PATH)
tar_bz2_file.close()
fetch_spam_data()
接着,加载所有emails:
HAM_DIR = os.patn.join(SPAM_PATH,"easy_ham")
SPAM_DIR = os.join.patn(SPAM_PATH,"spam")
ham_filenames = [name for name in sorted(os.listdir(HAM_DIR)) if len(name) > 20]
spam_filenames = [name for name in sorted(os.listdir(SPAM_DIR)) if len(name) > 20]
获取到数据之后,看一下垃圾邮件和普通邮件分别有多少封。
len(ham_filenames)
len(spam_filenames)
, ![]()
结果显示,被标为普通邮件的有2500封,垃圾邮件的有500封。很明显,这个实际结果的分类情况是不均衡的。
使用Python的email模块来解析这些邮件(这处理标头,编码,等等):
import email
import email.policy
def load_email(is_spam,filename,spam_path = SPAM_PATH):
directory = "spam" if is_spam else "easy_ham"
with open(os.path.join(spam_path,directory,filename),"rb") as f:
return email.parser.BytesParser(policy = email.policy.default).parse(f)
ham_emails = [load_email(is_spam = False,filename = name) for name in ham_filenames]
spam_emails = [load_email(is_spam = True,filename = name) for name in spam_filenames]
据此,ham_emails和spam_emails就得到了。
让我们看一个ham的例子和一个spam的例子,来感受一下数据是什么样子的:
print(ham_emails[4].get_content().strip())

从内容上来看,这是一封以个人名义发送的邮件,很可能使用的邮箱是雅虎邮箱,具体内容都是一些偏私人的东西。
print(spam_emails[6].get_content().strip())

很明显这就是一封广告邮件,虽然最后发信人还极力表示“This is not spam!”。
对比这两封邮件,我们可以很明显发现,首先,普通邮件应该不会有那么多的数字,而垃圾邮件则不然,因为广告邮件经常需要留下电话号码,标出价格等等,所以数字很多;其次,垃圾邮件会有很多奇怪的符号,比如$,¥,甚至这里根本无法识别的符号,而普通

本文介绍了一个基于机器学习的垃圾邮件过滤系统的创建过程,包括数据集的获取与预处理,特征提取,模型训练与评估。
&spm=1001.2101.3001.5002&articleId=105009345&d=1&t=3&u=fa1b236cafe647118f01a7d1c755e7cc)
774

被折叠的 条评论
为什么被折叠?



