文章目录
- 1.读取文件
- 2.数据预处理
- 3.模型训练预测
- 3.1 KNN
- 3.2 SVM
- 3.3 Decision Tree
- 3.4 Random forest
- 3.5 GBDT
- 3.6 Bayes
- 4.算法模型对比
- 5.总结
1.读取文件
import os
def read_index_file(file_path):
type_dict = {"spam": "1", "ham": "0"}
index_file = open(file_path)
index_dict = {}
try:
for line in index_file:
arr = line.split(" ")
if len(arr) == 2:
key, value = arr
value = value.replace("../data", "").replace("\n", "")
index_dict[value] = type_dict[key.lower()]
finally:
index_file.close()
return index_dict
def read_file(file_path):
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:"):
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:
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
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')
list0-215 = os.listdir('./data/trec06c/data-0-215')
for l1 in list0-215:
l1_path = './data/trec06c/data-0-215'+"/" + l1
print('开始处理文件夹' + l1_path)
list1 = os.listdir(l1_path)
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)
content_str += "," + index_dict[index_key] + "\n"
writer.writelines(content_str)
with open('./data/result_process01', "w", encoding='utf-8') as writer:
for l1 in list0-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
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']))
df['to_address'] = pd.Series(map(lambda str: extract_email_server_address(str), df['to']))
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()
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:
week = "Sep"
hour = "01"
time_quantum = "3"
pass
elif str_len == 21:
week ="Wed"
hour = "17"
time_quantum = "1"
pass
else:
rex = r"([A-Za-z]+\d?[A-Za-z]*) .*?(\d{2}):\d{2}:\d{2}.*"
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<(8月27-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<(8月27-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']))
df2 = df.groupby(['content_length_type', 'label'])['label'].agg(['count']).reset_index()
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)
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.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.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
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 =',')
df.dropna(axis = 0, how ='any', inplace = True)
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('开始训练集的特征工程:')
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)
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))
data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
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'])
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 =',')
df.dropna(axis = 0, how ='any', inplace = True)
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('开始训练集的特征工程-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)
data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
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'])
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 =',')
df.dropna(axis = 0, how ='any', inplace = True)
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('开始训练集的特征工程-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)
data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
print('开始决策树模型训练:')
start_time = time.time()
tree = DecisionTreeClassifier(criterion='gini', max_depth = 5, random_state = 0)
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'])
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 =',')
df.dropna(axis = 0, how ='any', inplace = True)
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('开始训练集的特征工程-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)
data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
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
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 =',')
df.dropna(axis = 0, how ='any', inplace = True)
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('开始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)
data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
gbdt = GradientBoostingClassifier(learning_rate=0.01, n_estimators =100, max_depth=3,\
min_samples_split = 50, loss = 'deviance', random_state = 0)
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'])
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 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
df = pd.read_csv('./data/result_process02', sep =',')
df.dropna(axis = 0, how ='any', inplace = True)
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('开始训练集的特征工程-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)
data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
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('开始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.总结
- 垃圾邮件过滤一般常用的算法有Bayes、KNN、LR等。一般最常用的算法选择Bayes算法。
- 垃圾邮件过滤系统中一般采用算法过滤+其它过滤统计结合的方式来进行垃圾邮件过滤。
- 在垃圾邮件过滤中主要是需要进行分词操作,中文邮件一般可以选择使用jieba(python)、ANSJ( java)等工具进行分词处理。
- 在垃圾邮件过滤中一般注意召回率,也就是说一般情况下,需要尽可能的提高垃圾邮件过滤的成功率。