案例:电子邮件垃圾过滤
1、如何从文本文档中构建自己的词列表。使用正则表达式切分句子,并将字符串全部转换为小写。
####################################
# 功能:切分文本
# 输入变量:大字符串 big_string
# 输出变量:字符串列表
####################################
def text_parse(big_string):
list_of_tokens = re.split(r'\W*', big_string)
return [tok.lower() for tok in list_of_tokens if len(tok) > 2]
2、对贝叶斯垃圾邮件分类器自动化处理。本例中共有50封电子邮件,其中的10封电子邮件被随机选择为测试集,剩余部分作为训练集。通过多次迭代求出平均错误率来衡量分类器的性能。
####################################
# 功能:垃圾邮件测试
# 输入变量:空
# 输出变量:错误率
####################################
def spam_test():
doc_list = []
class_list = []
for i in xrange(1, 26):
word_list = text_parse(open('email/spam/%d.txt' % i).read())
doc_list.append(word_list)
class_list.append(1)
word_list = text_parse(open('email/ham/%d.txt' % i).read())
doc_list.append(word_list)
class_list.append(0)
vocab_list = create_vocab_list(doc_list)
training_set = range(50)
test_set = []
# 从50封邮件中随机选择10封做为测试集,相应的在训练集中剔除这10封邮件
for i in xrange(10):
rand_index = int(random.uniform(0, len(training_set)))
test_set.append(training_set[rand_index])
del(training_set[rand_index])
train_mat = []
train_classes = []
for doc_index in training_set:
train_mat.append(set_of_words2vec(vocab_list, doc_list[doc_index]))
train_classes.append(class_list[doc_index])
p0v, p1v, p_spam = train_nb0(array(train_mat), array(train_classes))
error_count = 0
# 遍历测试集,对其中的每封邮件进行分类
for doc_index in test_set:
word_vector = set_of_words2vec(vocab_list, doc_list[doc_index])
if classify_nb(array(word_vector), p0v, p1v, p_spam) != class_list[doc_index]:
error_count += 1
print 'classification error ', doc_list[doc_index]
print 'the error rate is: ', float(error_count)/len(test_set)
3、代码测试
def main():
spam_test()
if __name__ == '__main__':
main()