Chapter 3 Classification (垃圾邮件处理)

本文介绍了一个基于机器学习的垃圾邮件过滤系统的创建过程,包括数据集的获取与预处理,特征提取,模型训练与评估。

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!”。

对比这两封邮件,我们可以很明显发现,首先,普通邮件应该不会有那么多的数字,而垃圾邮件则不然,因为广告邮件经常需要留下电话号码,标出价格等等,所以数字很多;其次,垃圾邮件会有很多奇怪的符号,比如$,¥,甚至这里根本无法识别的符号,而普通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值