资讯专栏INFORMATION COLUMN

机器学习项目之实现垃圾邮件处理(1)——数据清洗

fantix / 1521人阅读

摘要:学习了支持向量机算法后想自己用一些数据集来尝试一下,在网络上找了一个垃圾邮件处理的数据集正好适用于支持向量算法,所以在这里不讲算法内容,而是分享我是如何用来实现的。

学习了支持向量机算法后(SVM)想自己用一些数据集来尝试一下,在网络上找了一个垃圾邮件处理的数据集正好适用于SVM支持向量算法,所以在这里不讲SVM算法内容,而是分享我是如何用Python来实现的。
具体数据集:[邮件数据集][1]
[1]: https://pan.baidu.com/s/1ivQmo-04fCa3qVG0SAiUtQ
1. 首先查看数据集

邮件中有很多中特征值,有些是有用的有些却无法帮助我们判断是否是垃圾邮件,所以这里我们选取其中4个特征值(From,To,Data,Content)。
(1、邮件的内容分析——主要包含:发件人、收件人、发件时间以及邮件的内容)
![分类][3]
(2、是否为垃圾邮件的标签,spam——是垃圾邮件;ham——不是垃圾邮件)
2. 分析数据集
分析:垃圾邮件处理问题是一个**监督学习**,仅用来分类邮件好坏固为**二分类**问题,分类内容为**长文本**。
所有非向量形式的特征工程,首先要转换成向量的形式
该数据集适合很多种模型(贝叶斯,KNN),在这里我用SVM来解决
3. 开始进行数据清洗的工作

引入模块常用功能

import os

索引文件(分类标签)读取,该文件中分为两列
第一列:分类标签是否为垃圾邮件(是:spam、否:ham);
第二列:存放邮件对应文件夹路径,两列之间通过空格分割

def read_index_file(file_path):
    type_dict={"spam":"1","ham":"0"}        #用字典存放分类的垃圾邮件(0/1)
    index_file=open(file_path)
    index_dict={}        #存储分类后得到的结构字典
    
    try:
        for line in index_file:        #按照行来读取
            arr=line.split(" ")        #从每行的第一个空格分开
            
            if len(arr) == 2:
                key,value = arr        #将key和value分别赋值前后两段
            #将value中的数据规整,将../data去掉
            value=value.replace("../data","").replace("
","")
            #将每一个值是1/0对应加入数据字典中
            index_dict[value]=type_dict[key.lower()]        #将spam/ham中可能出现的大写字母换成小写
    finally:
        index_file.close()
    return index_dict   

邮件的文件内容数据读取

def read_file(file_path):
    #打开邮件只读r,编码方式gb2312,错误忽略
    file=open(file_path,"r",encoding="gb2312",errors="ignore")
    content_dict={}
    
    try:
        is_content = False
        for line in file:        #按行读取
            line = line.strip()        #去掉每行的空格
            if line.startswith("From:"):
                #将From:后的内容加入数据字典,将key="from:",value=line[5:]5以后的内容
                content_dict["from:"]=line[5:]
            elif line.startswith("To:"):
                content_dict["to:"]=line[3:]
            elif line.startswith("Date:"):
                content_dict["date:"]=line[5:]
            elif not line:
                # 邮件内容与上面信息存在着第一个空行,遇到空行时,这里标记为True以便进行下面的邮件内容处理
                # line文件的行为空时是False,不为空时是True
                is_content = True
            #如果这一行是空行表明下一行开始是具体的内容(content),则开始处理邮件
            if is_content:
                if "content" in content_dict:
                    #如果这一行有内容则加入字典
                    content_dict["content"] += line
                else:
                    #如果这一行没有内容则不加入,继续下一行
                    content_dict["content"] = line
    finally:
        file.close()
 
    return content_dict

3、邮件数据处理(内容的拼接,并用逗号进行分割)

def process_file(file_path):
    content_dict = read_file(file_path)
    
    #进行处理(拼接),get()函数返回指定键的值,指定键的值不存在用指定的默认值unkown代替
    #2,是将需要是数据特征取出来放在键值对中保存,3,则是将所有的特征值合并成,进行拼接
    result_str = content_dict.get("from","unkown").replace(",","").strip()+","
    result_str += content_dict.get("to:","unkown").replace(",","").strip()+","
    result_str += content_dict.get("date:","unkown").replace(",","").strip()+","
    result_str += content_dict.get("content","unkown").replace(",","").strip()
    return result_str

4、开始进行数据处理——函数调用

## os.listdir    返回指定的文件夹包含的文件或文件夹包含的名称列表
index_dict = read_index_file("../data/full/index")        #调用第一个函数
list0 = os.listdir("../data/data")
#开始打印list0
for l1 in list0:        #循环000-299
    l1_path = "../data/data/" + l1         #l1_path   ../data/data/(215)
    print("开始处理文件夹:"+l1_path)
    list1 = os.listdir(l1_path)        #list1:["000", "001", "002", "003"...."299"]
    #将list1打印出来
    write_file_path = "../data/process01_" + l1        #用这个来存放
    with open(write_file_path,"w",encoding="utf-8") as writer:
        for l2 in list1:        #l2循环000-299
            l2_path = l1_path + "/" + l2        #l2_path = ../data/data/(000-215)/(000-299)
            #这就得到了具体的文件内容,然后进行文件数据的读取
            index_key = "/" + l1 + "/" + l2        #index_key = /(000-215)/(000-299)
            
            if index_key in index_dict:
                #读取数据
                content_str = process_file(l2_path)        #3的函数,用来拼接数据元素,及特征值的合并
                #添加分类标签(0/1),可用逗号隔开
                content_str += "," + index_dict[index_key] + "
"
                #进行数据的输出
                writer.writelines(content_str)

将所有构建好的内容进行合并

with open("../data/result_process01","w",encoding="utf-8") as writer:
    #将所有内容合并到result_process01中
    for l1 in list0:
        file_path = "../data/process01_" + l1
        print("开始合并文件:" + file_path)
        
        with open(file_path, encoding="utf-8") as file:
            for line in file:
                writer.writelines(line)

清洗结果

到这一步数据的清洗就完成了,所有我们需要的特征值都被整合到了一起,并且为邮件做了加上了是否为垃圾邮件的标记。

推荐使用jupyter,注意文件的路径问题,特征工程和后面的分类会在下一篇。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44016.html

相关文章

  • 机器学习中的模型和数据

    摘要:很久很久没有更新了,并不是我自己不想,确实是最近太忙了,不管是工作上还是生活上都很忙,唉,之前希望自己能够坚持写博客,没有坚持下来,最近这段时间也是,其实时间吧,能挤还是能挤出来的,但是好不容易挤出来一点时间,不是用来刷手机,就是用来看书了 很久很久没有更新了,并不是我自己不想,确实是最近太忙了,不管是工作上还是生活上都很忙,唉,之前希望自己能够坚持写博客,没有坚持下来,最近这段时间也...

    endless_road 评论0 收藏0
  • 机器学习初体验

    摘要:机器学习其实不是新的技术,前两年它的名字叫数据挖掘或预测分析。机器学习其实也是类似的过程。概览机器学习的处理对象是数据,这些数据一般从应用采集而来,采集的过程,机器学习是不关注的。 刚看《机器学习系统设计》,边看边理解形成了以下心得。机器学习其实不是新的技术,前两年它的名字叫数据挖掘或预测分析。和统计学的关联非常大,统计学是研究现有的大量数据,来帮助人更好的理解数据。机器学习其实也是类...

    liujs 评论0 收藏0
  • 机器学习实例

    摘要:当模型准备完成后,当再次输入未经区分的邮件时,机器学习算法即可按照模型的规则来自主判断区分邮件。通过相同的机器学习算法还可以将用户评论作为输入从而分析用户对商品给出的是正面还是负面评价。 小周天 岂安科技售前顾问 主要负责名词解释 引子 笔者作为与机器学习同龄的一代,从小学时就开始了对 AI 的不断钻研,上上下下左右左右 BA 的代码敲得无比熟练。经常在与 AI 的对战中获得大胜。...

    Mr_zhang 评论0 收藏0
  • 成为数据科学家的入门项目

    摘要:基于大量的数据统计,网球是一种很好的预测类体育项目。数据科学家根据历史数据和玩家信息来构建预测模型,并将结果与博彩公司的评估进行比较。目标是找出机器学习模型与博彩公司评估之间的差距,从而有机会获胜。这是一个很好的实际数据科学项目。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:https://www.jianshu.com/p/56c......

    Julylovin 评论0 收藏0
  • 机器学习项目:构建垃圾邮件分类

    摘要:几乎所有大型电子邮箱服务提供商都内置了垃圾邮件检测系统,能够自动将此类邮件分类为垃圾邮件。大多数机器学习算法都要求传入的输入是数字数据,而电子邮件信息通常都是文本。 我们的任务 垃圾邮件检测是机器学习在现今互联网领域的主要应用之一。几乎所有大型电子邮箱服务提供商都内置了垃圾邮件检测系统,能够自动将此类邮件分类为垃圾邮件。 在此项目中,我们将使用朴素贝叶斯算法创建一个模型,该模型会通过...

    xcc3641 评论0 收藏0

发表评论

0条评论

fantix

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<