机器学习项目-垃圾邮件分类-KNN-SVM-DT-RF-GBDT-Bayes

本文对比分析了多种垃圾邮件过滤算法,包括KNN、SVM、决策树、随机森林、GBDT和贝叶斯,详细介绍了每种算法的训练过程、性能评估指标,并最终讨论了在垃圾邮件过滤场景下各算法的表现。

1.读取文件

#-*-coding:utf-8 -*-
import os

#读取文件索引,把spam ../data/000/000 改为 000/000  1
def read_index_file(file_path):
    type_dict = {
   
   "spam": "1", "ham": "0"}
    index_file = open(file_path) #../date/full/index
    index_dict = {
   
   }
    try:
        for line in index_file:
            arr = line.split(" ")#spam ../data/000/000
            if len(arr) == 2:
                key, value = arr
            # 添加到字段中
            value = value.replace("../data", "").replace("\n", "")
            index_dict[value] = type_dict[key.lower()]  #000/000  1, 000/001  0
    finally:
        index_file.close()

    return index_dict

# 邮件的文件内容数据读取,return content_dict,From:xxxxxxTo:xxxxxxxDate:xxxxxxxContent:xxxxxxx
def read_file(file_path):
    file = open(file_path, "r", encoding="gb2312", errors='ignore')
    content_dict = {
   
   }

    try:
        is_content = False#初始化为False后,在循环之外
        for line in file:
            line = line.strip()
            if line.startswith("From:"):
                content_dict['from'] = line[5:]  # From: "pan" <pan@jdl.ac.cn>
            elif line.startswith("To:"):
                content_dict['to'] = line[3:]  #To: shi@ccert.edu.cn
            elif line.startswith("Date:"):
                content_dict['date'] = line[5:]  #Date: Sun, 14 Aug 2005 10:16:47 +0800
            elif not line:
                is_content = True

            # 处理邮件内容
            if is_content:
                if 'content' in content_dict:
                    content_dict['content'] += line
                else:
                    content_dict['content'] = line
    finally:
        file.close()
        
    return content_dict

# 邮件数据处理,return result_str,"yan"<(8月27-28上海)培训课程>,lu@ccert.edu.cn,Tue 30 Aug 2005 10:08:15 +0800,非财务。。。
def process_file(file_path):
    content_dict = read_file(file_path)

    # 进行处理
    result_str = content_dict.get('from', 'unkown').replace(',', '').strip() + ","
    result_str += content_dict.get('to', 'unknown').replace(',', '').strip() + ","
    result_str += content_dict.get('date', 'unknown').replace(',', '').strip() + ","
    result_str += content_dict.get('content', 'unknown').replace(',', ' ').strip()
    return result_str
    
#使用函数开始数据处理
index_dict = read_index_file('./data/trec06c/full/index')
# print(index_dict)
list0-215 = os.listdir('./data/trec06c/data-0-215')#list[000,001,002....215]文件夹 D:\hjz-py\Project\垃圾邮件过滤课件及数据\Spam-sorting\data\trec06c\data-0-215

# 第一步,首先把每个文件夹中的邮件内容写入一个csv文件,得到 215个文件
#开始把N个文件夹中的file写入N*n个wiriter,'./data/process01_XXX'
for l1 in list0-215: #开始把N个文件夹中的file写入N*n个wiriter
    l1_path = './data/trec06c/data-0-215'+"/" + l1  #000单个文件夹
    print('开始处理文件夹' + l1_path)
    list1 = os.listdir(l1_path)
     
    # write_file_path = './data/process01_' + l1
    write_file_path = './data/process01_' + l1
     
    with open(write_file_path, "w", encoding= 'utf-8') as writer:
        for l2 in list1:
            l2_path = l1_path + "/" + l2#得到要处理文件的具体路径
             
            index_key = "/" + l1 + "/" + l2
             
            if index_key in index_dict:
                content_str = process_file(l2_path)#遍历调用process_file(),得到1)	From:xxxxxxTo:xxxxxxxDate:xxxxxxxContent: xxxxxxx
                content_str += "," + index_dict[index_key] + "\n"#加上目标标签特征,	From:xxxxxxTo:xxxxxxxDate:xxxxxxxContent: xxxxxxx  1/0
                writer.writelines(content_str)
             
#第二步:把215个文件再合并写入1个csv文件
with open('./data/result_process01', "w", encoding='utf-8') as writer:
    for l1 in list0-215:  #000-215
        file_path= './data/process01_' + l1
        print("开始合并文件:" + file_path)
            
        with open(file_path, encoding = 'utf-8') as file:
            for line in file:
                writer.writelines(line)           
            
            
print(writer)

    
        
C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/dataProcess.py
开始处理文件夹./data/trec06c/data-0-215/000
开始处理文件夹./data/trec06c/data-0-215/001
开始处理文件夹./data/trec06c/data-0-215/002
开始处理文件夹./data/trec06c/data-0-215/003
开始处理文件夹./data/trec06c/data-0-215/004
开始处理文件夹./data/trec06c/data-0-215/005
开始处理文件夹./data/trec06c/data-0-215/006
开始处理文件夹./data/trec06c/data-0-215/007
开始处理文件夹./data/trec06c/data-0-215/008
开始处理文件夹./data/trec06c/data-0-215/009
开始处理文件夹./data/trec06c/data-0-215/010
开始处理文件夹./data/trec06c/data-0-215/011
开始处理文件夹./data/trec06c/data-0-215/012
开始处理文件夹./data/trec06c/data-0-215/013
开始处理文件夹./data/trec06c/data-0-215/014
开始处理文件夹./data/trec06c/data-0-215/015
开始处理文件夹./data/trec06c/data-0-215/016
开始处理文件夹./data/trec06c/data-0-215/017
开始处理文件夹./data/trec06c/data-0-215/018
开始处理文件夹./data/trec06c/data-0-215/019
开始处理文件夹./data/trec06c/data-0-215/020
开始处理文件夹./data/trec06c/data-0-215/021
开始处理文件夹./data/trec06c/data-0-215/022
开始处理文件夹./data/trec06c/data-0-215/023
开始处理文件夹./data/trec06c/data-0-215/024
开始处理文件夹./data/trec06c/data-0-215/025
开始处理文件夹./data/trec06c/data-0-215/026
开始处理文件夹./data/trec06c/data-0-215/027
开始处理文件夹./data/trec06c/data-0-215/028
开始处理文件夹./data/trec06c/data-0-215/029
开始处理文件夹./data/trec06c/data-0-215/030
开始处理文件夹./data/trec06c/data-0-215/031
开始处理文件夹./data/trec06c/data-0-215/032
开始处理文件夹./data/trec06c/data-0-215/033
开始处理文件夹./data/trec06c/data-0-215/034
开始处理文件夹./data/trec06c/data-0-215/035
开始处理文件夹./data/trec06c/data-0-215/036
开始处理文件夹./data/trec06c/data-0-215/037
开始处理文件夹./data/trec06c/data-0-215/038
开始处理文件夹./data/trec06c/data-0-215/039
开始处理文件夹./data/trec06c/data-0-215/040
开始处理文件夹./data/trec06c/data-0-215/041
开始处理文件夹./data/trec06c/data-0-215/042
开始处理文件夹./data/trec06c/data-0-215/043
开始处理文件夹./data/trec06c/data-0-215/044
开始处理文件夹./data/trec06c/data-0-215/045
开始处理文件夹./data/trec06c/data-0-215/046
开始处理文件夹./data/trec06c/data-0-215/047
开始处理文件夹./data/trec06c/data-0-215/048
开始处理文件夹./data/trec06c/data-0-215/049
开始处理文件夹./data/trec06c/data-0-215/050
开始处理文件夹./data/trec06c/data-0-215/051
开始处理文件夹./data/trec06c/data-0-215/052
开始处理文件夹./data/trec06c/data-0-215/053
开始处理文件夹./data/trec06c/data-0-215/054
开始处理文件夹./data/trec06c/data-0-215/055
开始处理文件夹./data/trec06c/data-0-215/056
开始处理文件夹./data/trec06c/data-0-215/057
开始处理文件夹./data/trec06c/data-0-215/058
开始处理文件夹./data/trec06c/data-0-215/059
开始处理文件夹./data/trec06c/data-0-215/060
开始处理文件夹./data/trec06c/data-0-215/061
开始处理文件夹./data/trec06c/data-0-215/062
开始处理文件夹./data/trec06c/data-0-215/063
开始处理文件夹./data/trec06c/data-0-215/064
开始处理文件夹./data/trec06c/data-0-215/065
开始处理文件夹./data/trec06c/data-0-215/066
开始处理文件夹./data/trec06c/data-0-215/067
开始处理文件夹./data/trec06c/data-0-215/068
开始处理文件夹./data/trec06c/data-0-215/069
开始处理文件夹./data/trec06c/data-0-215/070
开始处理文件夹./data/trec06c/data-0-215/071
开始处理文件夹./data/trec06c/data-0-215/072
开始处理文件夹./data/trec06c/data-0-215/073
开始处理文件夹./data/trec06c/data-0-215/074
开始处理文件夹./data/trec06c/data-0-215/075
开始处理文件夹./data/trec06c/data-0-215/076
开始处理文件夹./data/trec06c/data-0-215/077
开始处理文件夹./data/trec06c/data-0-215/078
开始处理文件夹./data/trec06c/data-0-215/079
开始处理文件夹./data/trec06c/data-0-215/080
开始处理文件夹./data/trec06c/data-0-215/081
开始处理文件夹./data/trec06c/data-0-215/082
开始处理文件夹./data/trec06c/data-0-215/083
开始处理文件夹./data/trec06c/data-0-215/084
开始处理文件夹./data/trec06c/data-0-215/085
开始处理文件夹./data/trec06c/data-0-215/086
开始处理文件夹./data/trec06c/data-0-215/087
开始处理文件夹./data/trec06c/data-0-215/088
开始处理文件夹./data/trec06c/data-0-215/089
开始处理文件夹./data/trec06c/data-0-215/090
开始处理文件夹./data/trec06c/data-0-215/091
开始处理文件夹./data/trec06c/data-0-215/092
开始处理文件夹./data/trec06c/data-0-215/093
开始处理文件夹./data/trec06c/data-0-215/094
开始处理文件夹./data/trec06c/data-0-215/095
开始处理文件夹./data/trec06c/data-0-215/096
开始处理文件夹./data/trec06c/data-0-215/097
开始处理文件夹./data/trec06c/data-0-215/098
开始处理文件夹./data/trec06c/data-0-215/099
开始处理文件夹./data/trec06c/data-0-215/100
开始处理文件夹./data/trec06c/data-0-215/101
开始处理文件夹./data/trec06c/data-0-215/102
开始处理文件夹./data/trec06c/data-0-215/103
开始处理文件夹./data/trec06c/data-0-215/104
开始处理文件夹./data/trec06c/data-0-215/105
开始处理文件夹./data/trec06c/data-0-215/106
开始处理文件夹./data/trec06c/data-0-215/107
开始处理文件夹./data/trec06c/data-0-215/108
开始处理文件夹./data/trec06c/data-0-215/109
开始处理文件夹./data/trec06c/data-0-215/110
开始处理文件夹./data/trec06c/data-0-215/111
开始处理文件夹./data/trec06c/data-0-215/112
开始处理文件夹./data/trec06c/data-0-215/113
开始处理文件夹./data/trec06c/data-0-215/114
开始处理文件夹./data/trec06c/data-0-215/115
开始处理文件夹./data/trec06c/data
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值