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

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-0-215/116
开始处理文件夹./data/trec06c/data-0-215/117
开始处理文件夹./data/trec06c/data-0-215/118
开始处理文件夹./data/trec06c/data-0-215/119
开始处理文件夹./data/trec06c/data-0-215/120
开始处理文件夹./data/trec06c/data-0-215/121
开始处理文件夹./data/trec06c/data-0-215/122
开始处理文件夹./data/trec06c/data-0-215/123
开始处理文件夹./data/trec06c/data-0-215/124
开始处理文件夹./data/trec06c/data-0-215/125
开始处理文件夹./data/trec06c/data-0-215/126
开始处理文件夹./data/trec06c/data-0-215/127
开始处理文件夹./data/trec06c/data-0-215/128
开始处理文件夹./data/trec06c/data-0-215/129
开始处理文件夹./data/trec06c/data-0-215/130
开始处理文件夹./data/trec06c/data-0-215/131
开始处理文件夹./data/trec06c/data-0-215/132
开始处理文件夹./data/trec06c/data-0-215/133
开始处理文件夹./data/trec06c/data-0-215/134
开始处理文件夹./data/trec06c/data-0-215/135
开始处理文件夹./data/trec06c/data-0-215/136
开始处理文件夹./data/trec06c/data-0-215/137
开始处理文件夹./data/trec06c/data-0-215/138
开始处理文件夹./data/trec06c/data-0-215/139
开始处理文件夹./data/trec06c/data-0-215/140
开始处理文件夹./data/trec06c/data-0-215/141
开始处理文件夹./data/trec06c/data-0-215/142
开始处理文件夹./data/trec06c/data-0-215/143
开始处理文件夹./data/trec06c/data-0-215/144
开始处理文件夹./data/trec06c/data-0-215/145
开始处理文件夹./data/trec06c/data-0-215/146
开始处理文件夹./data/trec06c/data-0-215/147
开始处理文件夹./data/trec06c/data-0-215/148
开始处理文件夹./data/trec06c/data-0-215/149
开始处理文件夹./data/trec06c/data-0-215/150
开始处理文件夹./data/trec06c/data-0-215/151
开始处理文件夹./data/trec06c/data-0-215/152
开始处理文件夹./data/trec06c/data-0-215/153
开始处理文件夹./data/trec06c/data-0-215/154
开始处理文件夹./data/trec06c/data-0-215/155
开始处理文件夹./data/trec06c/data-0-215/156
开始处理文件夹./data/trec06c/data-0-215/157
开始处理文件夹./data/trec06c/data-0-215/158
开始处理文件夹./data/trec06c/data-0-215/159
开始处理文件夹./data/trec06c/data-0-215/160
开始处理文件夹./data/trec06c/data-0-215/161
开始处理文件夹./data/trec06c/data-0-215/162
开始处理文件夹./data/trec06c/data-0-215/163
开始处理文件夹./data/trec06c/data-0-215/164
开始处理文件夹./data/trec06c/data-0-215/165
开始处理文件夹./data/trec06c/data-0-215/166
开始处理文件夹./data/trec06c/data-0-215/167
开始处理文件夹./data/trec06c/data-0-215/168
开始处理文件夹./data/trec06c/data-0-215/169
开始处理文件夹./data/trec06c/data-0-215/170
开始处理文件夹./data/trec06c/data-0-215/171
开始处理文件夹./data/trec06c/data-0-215/172
开始处理文件夹./data/trec06c/data-0-215/173
开始处理文件夹./data/trec06c/data-0-215/174
开始处理文件夹./data/trec06c/data-0-215/175
开始处理文件夹./data/trec06c/data-0-215/176
开始处理文件夹./data/trec06c/data-0-215/177
开始处理文件夹./data/trec06c/data-0-215/178
开始处理文件夹./data/trec06c/data-0-215/179
开始处理文件夹./data/trec06c/data-0-215/180
开始处理文件夹./data/trec06c/data-0-215/181
开始处理文件夹./data/trec06c/data-0-215/182
开始处理文件夹./data/trec06c/data-0-215/183
开始处理文件夹./data/trec06c/data-0-215/184
开始处理文件夹./data/trec06c/data-0-215/185
开始处理文件夹./data/trec06c/data-0-215/186
开始处理文件夹./data/trec06c/data-0-215/187
开始处理文件夹./data/trec06c/data-0-215/188
开始处理文件夹./data/trec06c/data-0-215/189
开始处理文件夹./data/trec06c/data-0-215/190
开始处理文件夹./data/trec06c/data-0-215/191
开始处理文件夹./data/trec06c/data-0-215/192
开始处理文件夹./data/trec06c/data-0-215/193
开始处理文件夹./data/trec06c/data-0-215/194
开始处理文件夹./data/trec06c/data-0-215/195
开始处理文件夹./data/trec06c/data-0-215/196
开始处理文件夹./data/trec06c/data-0-215/197
开始处理文件夹./data/trec06c/data-0-215/198
开始处理文件夹./data/trec06c/data-0-215/199
开始处理文件夹./data/trec06c/data-0-215/200
开始处理文件夹./data/trec06c/data-0-215/201
开始处理文件夹./data/trec06c/data-0-215/202
开始处理文件夹./data/trec06c/data-0-215/203
开始处理文件夹./data/trec06c/data-0-215/204
开始处理文件夹./data/trec06c/data-0-215/205
开始处理文件夹./data/trec06c/data-0-215/206
开始处理文件夹./data/trec06c/data-0-215/207
开始处理文件夹./data/trec06c/data-0-215/208
开始处理文件夹./data/trec06c/data-0-215/209
开始处理文件夹./data/trec06c/data-0-215/210
开始处理文件夹./data/trec06c/data-0-215/211
开始处理文件夹./data/trec06c/data-0-215/212
开始处理文件夹./data/trec06c/data-0-215/213
开始处理文件夹./data/trec06c/data-0-215/214
开始处理文件夹./data/trec06c/data-0-215/215
开始合并文件:./data/process01_000
开始合并文件:./data/process01_001
开始合并文件:./data/process01_002
开始合并文件:./data/process01_003
开始合并文件:./data/process01_004
开始合并文件:./data/process01_005
开始合并文件:./data/process01_006
开始合并文件:./data/process01_007
开始合并文件:./data/process01_008
开始合并文件:./data/process01_009
开始合并文件:./data/process01_010
开始合并文件:./data/process01_011
开始合并文件:./data/process01_012
开始合并文件:./data/process01_013
开始合并文件:./data/process01_014
开始合并文件:./data/process01_015
开始合并文件:./data/process01_016
开始合并文件:./data/process01_017
开始合并文件:./data/process01_018
开始合并文件:./data/process01_019
开始合并文件:./data/process01_020
开始合并文件:./data/process01_021
开始合并文件:./data/process01_022
开始合并文件:./data/process01_023
开始合并文件:./data/process01_024
开始合并文件:./data/process01_025
开始合并文件:./data/process01_026
开始合并文件:./data/process01_027
开始合并文件:./data/process01_028
开始合并文件:./data/process01_029
开始合并文件:./data/process01_030
开始合并文件:./data/process01_031
开始合并文件:./data/process01_032
开始合并文件:./data/process01_033
开始合并文件:./data/process01_034
开始合并文件:./data/process01_035
开始合并文件:./data/process01_036
开始合并文件:./data/process01_037
开始合并文件:./data/process01_038
开始合并文件:./data/process01_039
开始合并文件:./data/process01_040
开始合并文件:./data/process01_041
开始合并文件:./data/process01_042
开始合并文件:./data/process01_043
开始合并文件:./data/process01_044
开始合并文件:./data/process01_045
开始合并文件:./data/process01_046
开始合并文件:./data/process01_047
开始合并文件:./data/process01_048
开始合并文件:./data/process01_049
开始合并文件:./data/process01_050
开始合并文件:./data/process01_051
开始合并文件:./data/process01_052
开始合并文件:./data/process01_053
开始合并文件:./data/process01_054
开始合并文件:./data/process01_055
开始合并文件:./data/process01_056
开始合并文件:./data/process01_057
开始合并文件:./data/process01_058
开始合并文件:./data/process01_059
开始合并文件:./data/process01_060
开始合并文件:./data/process01_061
开始合并文件:./data/process01_062
开始合并文件:./data/process01_063
开始合并文件:./data/process01_064
开始合并文件:./data/process01_065
开始合并文件:./data/process01_066
开始合并文件:./data/process01_067
开始合并文件:./data/process01_068
开始合并文件:./data/process01_069
开始合并文件:./data/process01_070
开始合并文件:./data/process01_071
开始合并文件:./data/process01_072
开始合并文件:./data/process01_073
开始合并文件:./data/process01_074
开始合并文件:./data/process01_075
开始合并文件:./data/process01_076
开始合并文件:./data/process01_077
开始合并文件:./data/process01_078
开始合并文件:./data/process01_079
开始合并文件:./data/process01_080
开始合并文件:./data/process01_081
开始合并文件:./data/process01_082
开始合并文件:./data/process01_083
开始合并文件:./data/process01_084
开始合并文件:./data/process01_085
开始合并文件:./data/process01_086
开始合并文件:./data/process01_087
开始合并文件:./data/process01_088
开始合并文件:./data/process01_089
开始合并文件:./data/process01_090
开始合并文件:./data/process01_091
开始合并文件:./data/process01_092
开始合并文件:./data/process01_093
开始合并文件:./data/process01_094
开始合并文件:./data/process01_095
开始合并文件:./data/process01_096
开始合并文件:./data/process01_097
开始合并文件:./data/process01_098
开始合并文件:./data/process01_099
开始合并文件:./data/process01_100
开始合并文件:./data/process01_101
开始合并文件:./data/process01_102
开始合并文件:./data/process01_103
开始合并文件:./data/process01_104
开始合并文件:./data/process01_105
开始合并文件:./data/process01_106
开始合并文件:./data/process01_107
开始合并文件:./data/process01_108
开始合并文件:./data/process01_109
开始合并文件:./data/process01_110
开始合并文件:./data/process01_111
开始合并文件:./data/process01_112
开始合并文件:./data/process01_113
开始合并文件:./data/process01_114
开始合并文件:./data/process01_115
开始合并文件:./data/process01_116
开始合并文件:./data/process01_117
开始合并文件:./data/process01_118
开始合并文件:./data/process01_119
开始合并文件:./data/process01_120
开始合并文件:./data/process01_121
开始合并文件:./data/process01_122
开始合并文件:./data/process01_123
开始合并文件:./data/process01_124
开始合并文件:./data/process01_125
开始合并文件:./data/process01_126
开始合并文件:./data/process01_127
开始合并文件:./data/process01_128
开始合并文件:./data/process01_129
开始合并文件:./data/process01_130
开始合并文件:./data/process01_131
开始合并文件:./data/process01_132
开始合并文件:./data/process01_133
开始合并文件:./data/process01_134
开始合并文件:./data/process01_135
开始合并文件:./data/process01_136
开始合并文件:./data/process01_137
开始合并文件:./data/process01_138
开始合并文件:./data/process01_139
开始合并文件:./data/process01_140
开始合并文件:./data/process01_141
开始合并文件:./data/process01_142
开始合并文件:./data/process01_143
开始合并文件:./data/process01_144
开始合并文件:./data/process01_145
开始合并文件:./data/process01_146
开始合并文件:./data/process01_147
开始合并文件:./data/process01_148
开始合并文件:./data/process01_149
开始合并文件:./data/process01_150
开始合并文件:./data/process01_151
开始合并文件:./data/process01_152
开始合并文件:./data/process01_153
开始合并文件:./data/process01_154
开始合并文件:./data/process01_155
开始合并文件:./data/process01_156
开始合并文件:./data/process01_157
开始合并文件:./data/process01_158
开始合并文件:./data/process01_159
开始合并文件:./data/process01_160
开始合并文件:./data/process01_161
开始合并文件:./data/process01_162
开始合并文件:./data/process01_163
开始合并文件:./data/process01_164
开始合并文件:./data/process01_165
开始合并文件:./data/process01_166
开始合并文件:./data/process01_167
开始合并文件:./data/process01_168
开始合并文件:./data/process01_169
开始合并文件:./data/process01_170
开始合并文件:./data/process01_171
开始合并文件:./data/process01_172
开始合并文件:./data/process01_173
开始合并文件:./data/process01_174
开始合并文件:./data/process01_175
开始合并文件:./data/process01_176
开始合并文件:./data/process01_177
开始合并文件:./data/process01_178
开始合并文件:./data/process01_179
开始合并文件:./data/process01_180
开始合并文件:./data/process01_181
开始合并文件:./data/process01_182
开始合并文件:./data/process01_183
开始合并文件:./data/process01_184
开始合并文件:./data/process01_185
开始合并文件:./data/process01_186
开始合并文件:./data/process01_187
开始合并文件:./data/process01_188
开始合并文件:./data/process01_189
开始合并文件:./data/process01_190
开始合并文件:./data/process01_191
开始合并文件:./data/process01_192
开始合并文件:./data/process01_193
开始合并文件:./data/process01_194
开始合并文件:./data/process01_195
开始合并文件:./data/process01_196
开始合并文件:./data/process01_197
开始合并文件:./data/process01_198
开始合并文件:./data/process01_199
开始合并文件:./data/process01_200
开始合并文件:./data/process01_201
开始合并文件:./data/process01_202
开始合并文件:./data/process01_203
开始合并文件:./data/process01_204
开始合并文件:./data/process01_205
开始合并文件:./data/process01_206
开始合并文件:./data/process01_207
开始合并文件:./data/process01_208
开始合并文件:./data/process01_209
开始合并文件:./data/process01_210
开始合并文件:./data/process01_211
开始合并文件:./data/process01_212
开始合并文件:./data/process01_213
开始合并文件:./data/process01_214
开始合并文件:./data/process01_215
<_io.TextIOWrapper name='./data/result_process01' mode='w' encoding='utf-8'>

Process finished with exit code 0

2.数据预处理

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import re
import time
import jieba

# mpl.rcParams['font.sans-serif'] = [u'simHei']#ָ改为指定字体“黑体”
# mpl.rcParams['axes.unicode_minus'] = False #使得坐标轴保存负号变更为方块,用来正常显示负号
# plt.title(u'我是中文')
# get_ipython().magic(u'matplotlib tk')

df = pd.read_csv('./data/result_process01', sep = ',', header = None, names= ['from','to', 'date', 'content','label'])
print(df.head(10))

在这里插入图片描述

def extract_email_server_address(strl):#发送接收地址提取
    it = re.findall(r"@([A-Za-z0-9]*\.[A-Za-z0-9\.]+)", str(strl))#正则匹配
    result = ''
    if len(it)>0:
        result = it[0]
    else:
        result = 'unknown'
    return result

df['from_address'] = pd.Series(map(lambda str : extract_email_server_address(str), df['from']))#map映射并添加
df['to_address'] = pd.Series(map(lambda str: extract_email_server_address(str), df['to']))

# print(df.head(10))
# print("========to address=======================")
print("="*10 + 'to address' + "="*20)#也可以这样写
print(df.to_address.value_counts().head(5))#
print("总邮件接受服务器类别数量为:" + str(df.to_address.unique().shape))
print("="*10 + 'from address' + "= "*20)
print(df.from_address.value_counts().head(5))
print("邮件发送服务器类别数量为:" + str(df.from_address.unique().shape))
from_address_df = df.from_address.value_counts().to_frame()#转为结构化的输出,输出带索引
# print(from_address_df)
len_less_10_from_address_count = from_address_df[from_address_df.from_address<=10].shape
print("发送邮件数量小于10封的服务器数量为:" + str(len_less_10_from_address_count))
总邮件接受服务器类别数量为:(12,)
==========from address= = = = = = = = = = = = = = = = = = = = 
163.com                  7500
mail.tsinghua.edu.cn     6498
126.com                  5822
tom.com                  4075
mails.tsinghua.edu.cn    3205
Name: from_address, dtype: int64
邮件发送服务器类别数量为:(3567,)
np.unique(list(map(lambda t: len(str(t).strip()), df['date'])))#根据长度去特征
print(np.unique(list(map(lambda t: len(str(t).strip()), df['date']))))
np.unique(list(filter(lambda t: len(str(t).strip())==30, df['date'])))
print(np.unique(list(filter(lambda t: len(str(t).strip())==31, df['date']))))
def extract_email_date(str1):
    if not isinstance(str1, str):
        str1 = str(str1)
         
    str_len = len(str1)
    week = ""
    hour = ""
    time_quantum = ""      
    if str_len < 10:
        week = "unknown"
        hour = "unknown"
        time_quantum = "unknown"
        pass
    elif str_len == 16:
        rex = r"(\d{2}):\d{2}"#只取冒号前面的
        it = re.findall(rex, str1)
        if len(it) == 1:
            hour = it[0]
        else:
            hour = "unknown"
        week = "Fri"
        time_quantum = "0"
        pass
    elif str_len == 19: #['Sep 23 2005 1:04 AM']
        week = "Sep"
        hour = "01"
        time_quantum = "3"
        pass
    elif str_len == 21: #['August 24 2005 5:00pm'
        week ="Wed"
        hour = "17"
        time_quantum = "1"
        pass
    else:               #'Fri 2 Sep 2005 08:17:50'  Wed 31 Aug 2005 15:06:36 
        rex = r"([A-Za-z]+\d?[A-Za-z]*) .*?(\d{2}):\d{2}:\d{2}.*"# 加问号保险些# 'Fri 23 Sep 2005 09:39:39 +0800 X-Priority: 3 X-Mailer: FoxMail'
        it = re.findall(rex, str1)
        if len(it) == 1 and len(it[0]) ==2:
            week = it[0][0][-3:]
            hour = it[0][1]
            int_hour = int(hour)
            if int_hour <8:
                time_quantum = "3"
            elif int_hour <13:
                time_quantum = "0"
            elif int_hour <19:
                time_quantum = "1"
            else:
                time_quantum = "2"
            pass
        else:
            week = "unknown"
            hour = "unknown"
            time_quantum = 'unknown'
     
    week = week.lower()
    hour = hour.lower()
    time_quantum = time_quantum.lower()
    return(week, hour, time_quantum)
#数据转换
date_time_extract_result = list(map(lambda st: extract_email_date(st), df['date']))
df['date_week'] = pd.Series(map(lambda t: t[0], date_time_extract_result))
df['date_hour'] = pd.Series(map(lambda t: t[1], date_time_extract_result))
df['date_time_quantum'] = pd.Series(map(lambda t: t[2], date_time_extract_result))
print(df.head(4))
 
print("======星期属性字段的描述==========")
print(df.date_week.value_counts().head(3))
print(df[['date_week', 'label']].groupby(['date_week', 'label'])['label'].count())
 
print("======小时属性字段的描述==========")
print(df.date_hour.value_counts().head(3))
print(df[['date_hour', 'label']].groupby(['date_hour', 'label'])['label'].count())
 
print("======时间段属性字段的描述==========")
print(df.date_hour.value_counts().head(3))
print(df[['date_time_quantum', 'label']].groupby(['date_time_quantum', 'label'])['label'].count())            
                 
df['has_date'] = df.apply(lambda c: 0 if c['date_week'] == 'unknown' else 1, axis=1)
print(df.head(4))
#===========================开始分词==============================================
print('='*30 + '现在开始分词,请耐心等待5分钟。。。' + '='*20)
df['content'] = df['content'].astype('str')
df['jieba_cut_content'] = list(map(lambda st: "  ".join(jieba.cut(st)), df['content']))
df.head(4)

                                     from                 to  \
0                    yan<(827-28上海)培训课程>    lu@ccert.edu.cn   
1                     pan <pan@jdl.ac.cn>   shi@ccert.edu.cn   
2    =?GB2312?B?1cW6o8TP?= <jian@163.con>  xing@ccert.edu.cn   
3  =?GB2312?B?tPq/qreixrE=?= <pan@12.com>  ling@ccert.edu.cn   

                             date  \
0  Tue 30 Aug 2005 10:08:15 +0800   
1  Sun 14 Aug 2005 10:16:47 +0800   
2  Sun 14 Aug 2005 10:17:57 +0800   
3  Sun 14 Aug 2005 10:19:02 +0800   

                                             content  label from_address  \
0  非财务纠淼牟莆窆芾-(沙盘模拟)------如何运用财务岳硖岣吖芾砑ㄐ[课 程 背 景]每一...    1.0      unknown   
1  讲的是孔子后人的故事。一个老领导回到家乡,跟儿子感情不和,跟贪财的孙子孔为本和睦。老领导的弟...    0.0    jdl.ac.cn   
2  尊敬的贵公司(财务/经理)负责人您好!我是深圳金海实业有限公司(广州。东莞)等省市有分公司。...    1.0      163.con   
3  贵公司负责人(经理/财务)您好:深圳市华龙公司受多家公司委托向外低点代开部分增值税电脑发票(...    1.0       12.com   

     to_address date_week date_hour date_time_quantum  
0  ccert.edu.cn       tue        10                 0  
1  ccert.edu.cn       sun        10                 0  
2  ccert.edu.cn       sun        10                 0  
3  ccert.edu.cn       sun        10                 0 
print("======星期属性字段的描述==========")
print(df.date_week.value_counts().head(3))
print(df[['date_week', 'label']].groupby(['date_week', 'label'])['label'].count())
 
print("======小时属性字段的描述==========")
print(df.date_hour.value_counts().head(3))
print(df[['date_hour', 'label']].groupby(['date_hour', 'label'])['label'].count())
 
print("======时间段属性字段的描述==========")
print(df.date_hour.value_counts().head(3))
print(df[['date_time_quantum', 'label']].groupby(['date_time_quantum', 'label'])['label'].count())            
                 
df['has_date'] = df.apply(lambda c: 0 if c['date_week'] == 'unknown' else 1, axis=1)
print(df.head(4))
======星期属性字段的描述==========
fri    10859
sat    10316
thu     9780
Name: date_week, dtype: int64
date_week  label
fri        0.0      3884
           1.0      6975
mon        0.0      2568
           1.0      5491
sat        0.0      3681
           1.0      6635
sep        0.0         1
sun        0.0      2785
           1.0      5724
thu        0.0      3330
           1.0      6450
tue        0.0      2733
           1.0      5399
unknown    1.0       553
wed        0.0      2784
           1.0      5626
Name: label, dtype: int64
======小时属性字段的描述==========
19    2835
16    2772
15    2750
Name: date_hour, dtype: int64
date_hour  label
00         0.0       904
           1.0      1716
01         0.0       925
           1.0      1791
02         0.0       868
           1.0      1736
03         0.0       839
           1.0      1682
04         0.0       824
           1.0      1771
05         0.0       822
           1.0      1791
06         0.0       758
           1.0      1748
07         0.0       863
           1.0      1775
08         0.0       801
           1.0      1732
09         0.0       896
           1.0      1795
10         0.0       874
           1.0      1847
11         0.0       889
           1.0      1779
12         0.0       936
           1.0      1740
13         0.0       909
           1.0      1712
14         0.0       945
           1.0      1757
15         0.0       979
           1.0      1771
16         0.0       988
           1.0      1784
17         0.0       940
           1.0      1802
18         0.0       995
           1.0      1744
19         0.0       986
           1.0      1849
20         0.0      1002
           1.0      1744
21         0.0       909
           1.0      1723
22         0.0       979
           1.0      1747
23         0.0       935
           1.0      1763
24         1.0         1
unknown    1.0       553
Name: label, dtype: int64
======时间段属性字段的描述==========
19    2835
16    2772
15    2750
Name: date_hour, dtype: int64
date_time_quantum  label
0                  0.0       4396
                   1.0       8893
1                  0.0       5756
                   1.0      10570
2                  0.0       4811
                   1.0       8827
3                  0.0       6803
                   1.0      14010
unknown            1.0        553
Name: label, dtype: int64
                                     from                 to  \
0                    yan<(827-28上海)培训课程>    lu@ccert.edu.cn   
1                     pan <pan@jdl.ac.cn>   shi@ccert.edu.cn   
2    =?GB2312?B?1cW6o8TP?= <jian@163.con>  xing@ccert.edu.cn   
3  =?GB2312?B?tPq/qreixrE=?= <pan@12.com>  ling@ccert.edu.cn   

                             date  \
0  Tue 30 Aug 2005 10:08:15 +0800   
1  Sun 14 Aug 2005 10:16:47 +0800   
2  Sun 14 Aug 2005 10:17:57 +0800   
3  Sun 14 Aug 2005 10:19:02 +0800   

                                             content  label from_address  \
0  非财务纠淼牟莆窆芾-(沙盘模拟)------如何运用财务岳硖岣吖芾砑ㄐ[课 程 背 景]每一...    1.0      unknown   
1  讲的是孔子后人的故事。一个老领导回到家乡,跟儿子感情不和,跟贪财的孙子孔为本和睦。老领导的弟...    0.0    jdl.ac.cn   
2  尊敬的贵公司(财务/经理)负责人您好!我是深圳金海实业有限公司(广州。东莞)等省市有分公司。...    1.0      163.con   
3  贵公司负责人(经理/财务)您好:深圳市华龙公司受多家公司委托向外低点代开部分增值税电脑发票(...    1.0       12.com   

     to_address date_week date_hour date_time_quantum  has_date  
0  ccert.edu.cn       tue        10                 0         1  
1  ccert.edu.cn       sun        10                 0         1  
2  ccert.edu.cn       sun        10                 0         1  
3  ccert.edu.cn       sun        10                 0         1  
#===========================开始分词==============================================
print('='*30 + '现在开始分词,请耐心等待5分钟。。。' + '='*20)
df['content'] = df['content'].astype('str')
df['jieba_cut_content'] = list(map(lambda st: "  ".join(jieba.cut(st)), df['content']))
df.head(4)

在这里插入图片描述

#特征工程之四 长度提取  
def precess_content_length(lg):
    if lg <= 10:
        return 0
    elif lg <= 100:
        return 1
    elif lg <= 500:
        return 2
    elif lg <= 1000:
        return 3
    elif lg <= 1500:
        return 4
    elif lg <= 2000:
        return 5
    elif lg <= 2500:
        return 6
    elif lg <=  3000:
        return 7
    elif lg <= 4000:
        return 8
    elif lg <= 5000:
        return 9
    elif lg <= 10000:
        return 10
    elif lg <= 20000:
        return 11
    elif lg <= 30000:
        return 12
    elif lg <= 50000:
        return 13
    else:
        return 14
 
df['content_length'] = pd.Series(map(lambda st:len(st), df['content']))
df['content_length_type'] = pd.Series(map(lambda st: precess_content_length(st), df['content_length']))
# print(df.head(10))  #如果不count就按照自然顺序排      
df2 = df.groupby(['content_length_type', 'label'])['label'].agg(['count']).reset_index()#agg 计算并且添加count用于后续计算
df3 = df2[df2.label == 1][['content_length_type', 'count']].rename(columns = {'count' : 'c1'})
df4 = df2[df2.label == 0][['content_length_type', 'count']].rename(columns = {'count' : 'c2'})
df5 = pd.merge(df3, df4)#注意pandas中merge与concat的区别
df5['c1_rage'] = df5.apply(lambda r: r['c1'] / (r['c1'] + r['c2']), axis = 1)
df5['c2_rage'] = df5.apply(lambda r: r['c2'] / (r['c1'] + r['c2']), axis = 1)
print(df5) 
#画图出来观测为信号添加做准备
plt.plot(df5['content_length_type'], df5['c1_rage'], label = u'垃圾邮件比例')
plt.plot(df5['content_length_type'], df5['c2_rage'], label = u'正常邮件比例')
plt.grid(True)
plt.legend(loc = 0)#加入图例
plt.show()

在这里插入图片描述

#添加信号量,数值分析模拟回归方程
 
def process_content_sema(x):
    if x > 10000:
        return 0.5 / np.exp(np.log10(x) - np.log10(500)) + np.log(abs(x - 500) + 1) - np.log(abs(x - 10000)) + 1
    else:
        return 0.5 / np.exp(np.log10(x) - np.log10(500)) + np.log(abs(x - 500) + 1)
a = np.arange(1, 20000)
plt.plot(a, list(map(lambda t: process_content_sema(t) ,a)), label = u'信息量')
# plt.plot(df['content_length'], list(map(lambda t: process_content_sema(t) ,df['content_length'])), label = u'信息量')
plt.grid(True)
plt.legend(loc = 0)
plt.show()

在这里插入图片描述

df['content_length_sema'] = list(map(lambda st: process_content_sema(st), df['content_length'])) 
# print(df.head(10))         
  
print(df.dtypes) #可以查看每一列的数据类型,也可以查看每一列的名称
from                    object
to                      object
date                    object
content                 object
label                  float64
from_address            object
to_address              object
date_week               object
date_hour               object
date_time_quantum       object
has_date                 int64
jieba_cut_content       object
content_length           int64
content_length_type      int64
content_length_sema    float64
dtype: object
df.drop(['from', 'to', 'date', 'from_address', 'to_address', \
         'date_week','date_hour', 'date_time_quantum', 'content', \
         'content_length', 'content_length_type'], 1, inplace=True) 
print(df.info())
print(df.head(10)) 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 64620 entries, 0 to 64619
Data columns (total 4 columns):
label                  64619 non-null float64
has_date               64620 non-null int64
jieba_cut_content      64620 non-null object
content_length_sema    64620 non-null float64
dtypes: float64(2), int64(1), object(1)
memory usage: 2.0+ MB
None
   label  has_date                                  jieba_cut_content  \
0    1.0         1  非  财务  纠淼  牟  莆  窆  芾  -  (  沙盘  模拟  )  ------...   
1    0.0         1  讲  的  是  孔子  后人  的  故事  。  一个  老  领导  回到  家乡  ...   
2    1.0         1  尊敬  的  贵  公司  (  财务  /  经理  )  负责人  您好  !  我  ...   
3    1.0         1  贵  公司  负责人  (  经理  /  财务  )  您好  :  深圳市  华龙  公...   
4    1.0         1  这是  一封  HTML  格式  信件  !  ---------------------...   
5    1.0         1  TO  :  贵  公司  经理  、  财务  您好  !  深圳市  春洋  贸易  有...   
6    0.0         1  那  他  为什么  不  愿意  起诉  ,  既然  这样  了  !  起诉  后  ...   
7    1.0         1  尊敬  的  负责人  (  经理  /  财务  )  :  您好  !  我  是  深...   
8    1.0         1  您好     以下  是  特别  为  阁下  发  的  香港  信息  (  图片  ...   
9    0.0         1  我  觉得  ,  负债  不要紧  ,  最  重要  的  是  能  负得起  这个 ...   

   content_length_sema  
0             7.456151  
1             6.486084  
2             6.175171  
3             6.565682  
4             2.063409  
5             6.143747  
6             3.807568  
7             5.593684  
8             6.611074  
9             6.041340 
df.to_csv('./data/result_process02', encoding='utf-8', index = False)
df.to_csv('./data/result_process02.csv', encoding='utf-8', index = False)

在这里插入图片描述

3.模型训练预测

3.1 KNN

#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np
import jieba
import time
 
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score
from sklearn.ensemble.tests.test_forest import check_min_samples_leaf

df = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True)
# print(df.head(5))
# print(df.info())

x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\
                                                        'content_length_sema']],df['label'],\
                                                    test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
# #================================================================================================
print('开始训练集的特征工程:')
start_time_train = time.time()
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)#Tf-idf
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
end_time_train = time.time()
print('Running train_svd time: %.2s second(s)'%(end_time_train-start_time_train))
# print(data.head(10))
# print(data.info())
#
data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())
#
print('开始KNN模型训练:')
knn = KNeighborsClassifier(n_neighbors=5)
model = knn.fit(data, y_train)
#测试集处理
jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())
start_time_KNN = time.time()
y_predict = model.predict(data_test)
#
precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)

print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)
end_time_KNN = time.time()
print('Running KNN_model time: %.2s second(s)'%(end_time_KNN-start_time_KNN))

C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/k_nearest_neighbor.py
训练集大小51427
测试集大小12857
开始训练集的特征工程:
Running train_svd time: 22 second(s)
开始KNN模型训练:
精确率为:0.98029
召回率为:0.98654
F1均值为:0.98340
Running KNN_model time: 1. second(s)

Process finished with exit code 0

3.2 SVM


import pandas as pd
import numpy as np
import jieba
import time
 
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score
from sklearn.ensemble.tests.test_forest import check_min_samples_leaf

df = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True)
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)

x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\
                                                        'content_length_sema']],df['label'],\
                                                    test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
#================================================================================================
print('开始训练集的特征工程-TF-IDF+SVD:')
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())

data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())
print('开始SVM模型训练:')
start_time = time.time()
svm = SVC(C = 1, kernel='rbf', degree = 3, gamma = 0.001)
model = svm.fit(data, y_train)

jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())

y_predict = model.predict(data_test)

precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)

print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)

end_time= time.time()
print('Running SVM model time: %.2s second(s)'%(end_time-start_time))


C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/support_vector_machine.py
训练集大小: (64284, 4)
训练集大小51427
测试集大小12857
开始训练集的特征工程:
开始SVM模型训练:
精确率为:0.87746
召回率为:0.98583
F1均值为:0.92849
Running svm model time: 99 second(s)

Process finished with exit code 0

3.3 Decision Tree

import pandas as pd
import numpy as np
import jieba
import time
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score

df = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True) 
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)

x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\
                                                        'content_length_sema']],df['label'],\
                                                    test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
#================================================================================================
print('开始训练集的特征工程-TF-IDF+SVD:')
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())

data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())

print('开始决策树模型训练:')
start_time = time.time()

tree = DecisionTreeClassifier(criterion='gini', max_depth = 5, random_state = 0)#'entropy'
model = tree.fit(data, y_train)

jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())

y_predict = model.predict(data_test)

precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)

print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)

end_time= time.time()
print('Running DT model time: %.2s second(s)'%(end_time-start_time))

C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/decision_tree.py
训练集大小: (64284, 4)
训练集大小51427
测试集大小12857
开始训练集的特征工程-TF-IDF+SVD:
开始决策树模型训练:
精确率为:0.96956
召回率为:0.98146
F1均值为:0.97547
Running DT model time: 2. second(s)

Process finished with exit code 0

3.4 Random forest

import time
import pandas as pd
import numpy as np
import jieba
 
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score
from sklearn.ensemble.tests.test_forest import check_min_samples_leaf

df = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True)
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)

x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\
                                                        'content_length_sema']],df['label'],\
                                                    test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
#================================================================================================
print('开始训练集的特征工程-TF-IDF+SVD:')
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())

data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())

print('开始RF模型训练:')
start_time = time.time()

forest = RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=3, random_state=0)
model = forest.fit(data, y_train)

jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
print(data_test.head(10))
print(data_test.info())

y_predict = model.predict(data_test)

precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)

print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)

end_time= time.time()
print('Running RF model time: %.2s second(s)'%(end_time-start_time))

C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/random_forest.py
训练集大小: (64284, 4)
训练集大小51427
测试集大小12857
开始训练集的特征工程-TF-IDF+SVD:
开始RF模型训练:
精确率为:0.94293
召回率为:0.98914
F1均值为:0.96548
Running RF model time: 5. second(s)

Process finished with exit code 0

3.5 GBDT


#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np
import jieba
import time
 
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score
from sklearn.ensemble.tests.test_forest import check_min_samples_leaf

df = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True)
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)

x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\
                                                        'content_length_sema']],df['label'],\
                                                    test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
#================================================================================================
print('开始GBDT模型训练:')
start_time = time.time()
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())

data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())

gbdt = GradientBoostingClassifier(learning_rate=0.01, n_estimators =100, max_depth=3,\
                                  min_samples_split = 50, loss = 'deviance', random_state = 0)
                                  #对数似然损失函数   指数损失函数exponential
model = gbdt.fit(data, y_train)

jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())

y_predict = model.predict(data_test)

precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)

print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)

end_time= time.time()
print('Running GBDT model time: %.2s second(s)'%(end_time-start_time))

C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/gradient_boost_decision_tree.py
训练集大小: (64284, 4)
训练集大小51427
测试集大小12857
开始GBDT模型训练:
精确率为:0.95038
召回率为:0.98831
F1均值为:0.96897
Running GBDT model time: 32 second(s)

Process finished with exit code 0

3.6 Bayes

import pandas as pd
import numpy as np
# import matplotlib as mpl
# import matplotlib.pyplot as plt
import jieba
import time
 
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.naive_bayes import BernoulliNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score

# mpl.rcParams['font.sans-serif'] = [u'simHei']
# mpl.rcParams['axes.unicode_minus'] = False

df = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True) #按行删除Nan
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)
x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\
                                                        'content_length_sema']],df['label'],\
                                                    test_size = 0.2, random_state = 0)

print("训练数据集大小:%d" % x_train.shape[0])
print("测试集数据大小:%d" % x_test.shape[0])
# print(x_train.head(10))
# print(x_test.head(10)) #注意前面索引
#================================================================================================
print('开始训练集的特征工程-TF-IDF+SVD:')
start1 = time.time()
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)#逆向文件频率
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())
  
data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())

end1 = time.time()
print('结束特征工程耗时: %.2s second(s)'%(end1-start1))
jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())

print('开始Bayes模型训练:')
start_time = time.time()

nb = BernoulliNB(alpha = 1.0, binarize = 0.0005)#二值转换阈值
model = nb.fit(data, y_train)
  

#开始预测
y_predict = model.predict(data_test)
  
precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)
 
print('精确率为:%0.5f' % precision)
print('召回率:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)

end_time= time.time()
print('Running Bayes model time: %.2s second(s)'%(end_time-start_time))

C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/bayes.py
训练集大小: (64284, 4)
训练数据集大小:51427
测试集数据大小:12857
开始训练集的特征工程-TF-IDF+SVD:
结束特征工程耗时: 22 second(s)
开始Bayes模型训练:
精确率为:0.94664
召回率:0.98878
F1均值为:0.96725
Running Bayes model time: 0.06 second(s)

Process finished with exit code 0

4.算法模型对比

不同机器跑出来差异不大,就上以前的表格了,可以再做个LR
在这里插入图片描述

5.总结

  1. 垃圾邮件过滤一般常用的算法有Bayes、KNN、LR等。一般最常用的算法选择Bayes算法。
  2. 垃圾邮件过滤系统中一般采用算法过滤+其它过滤统计结合的方式来进行垃圾邮件过滤。
  3. 在垃圾邮件过滤中主要是需要进行分词操作,中文邮件一般可以选择使用jieba(python)、ANSJ( java)等工具进行分词处理。
  4. 在垃圾邮件过滤中一般注意召回率,也就是说一般情况下,需要尽可能的提高垃圾邮件过滤的成功率。
  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值