import random
import sys
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import redef textParse(bigString):listOfTokens = re.split(r'\W*', bigString)  # 返回列表return [tok.lower() for tok in listOfTokens if len(tok) > 0]def createVocabList(dataSet):vocabSet = set([])for docment in dataSet:vocabSet = vocabSet | set(docment)  # 将docment中vocabSet所没有的单词加到vocabSet中return list(vocabSet)  # 返回单词列表# vocablist是词汇表,inputSet为输入的邮件
def bagOfWords2Vec(vocabList, inputSet):returnVec = [0] * len(vocabList)  # returnVec的大小与词汇表相同,用来记录输入邮件中有多少单词在词汇表中存在,并记录单词的出现次数for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] += 1else:print("the word: %s is not in my Vocabulary!" % word)return returnVec  # 返回词向量# trainMat是训练样本的总的词向量,是一个矩阵,每一行都是一个邮件的词向量
# trainGategory为与trainMat对应的类别,值为0,1表示正常,垃圾
def train(trainMat, trainGategory):numTrain = len(trainMat)  # numTrain为训练样本邮件的个数numwords = len(trainMat[0])  # numwords为第一封邮件的单词个数pAbusive = sum(trainGategory) / float(numTrain)  # pAbusive为垃圾邮件占整个训练样本的比例p0Num = np.ones(numwords)  # p0Num为一个shape为(numwords,)的全为1的ndarray数组,其作用是统计所有正常邮件中每个单词的个数p1Num = np.ones(numwords)  # p1Num为一个shape为(numwords,)的全为1的ndarray数组,其作用是统计所有垃圾邮件中每个单词的个数p0Denom = 2.0p1Denom = 2.0for i in range(numTrain):  # 遍历所有的邮件if trainGategory[i] == 1:  # 若这封邮件为垃圾邮件p1Num += trainMat[i]  # 矩阵加法,统计类1中每个单词的个数,将其加至p1Num中p1Denom += sum(trainMat[i])  # plDenom加上类1的单词总数else:p0Num += trainMat[i]p0Denom += sum(trainMat[i])p1Vec = np.log(p1Num / p1Denom)  # 自然对数运算,计算垃圾邮件中每个单词的概率,p1仍为ndarray矩阵,记录每个单词在垃圾邮件情况下出现的概率p0Vec = np.log(p0Num / p0Denom)  # 正常邮件中每个单词的概率return p0Vec, p1Vec, pAbusivedef classfy(vec2classfy, p0Vec, p1Vec, pClass1):p1 = sum(vec2classfy * p1Vec) + np.log(pClass1)p0 = sum(vec2classfy * p0Vec) + np.log(1 - pClass1)if p1 > p0:return 1else:return 0def spamTest():# fullTest = []docList = []classList = []# for i in range(1, 26):  # 每一类只有25封邮件#     print(i)#     wordList = textParse(open('email/spam/%d.txt' % i,encoding='utf8').read())#     docList.append(wordList)#     fullTest.append(wordList)#     classList.append(1)#     wordList = textParse(open('email/ham/%d.txt' % i, encoding="utf-8").read())#     docList.append(wordList)#     fullTest.append(wordList)#     classList.append(0)# 3.读入数据集df = pd.read_csv('./email/SMSSpamCollection.txt', delimiter='\t', header=None)  # 用\t分割,没有文件头# 生成label和x输入y, X_train = df[0], df[1]for text in X_train[y == "spam"]:wordList = textParse(text)docList.append(wordList)# fullTest.append(wordList)classList.append(1)for text in X_train[y == "ham"]:wordList = textParse(text)docList.append(wordList)# fullTest.append(wordList)classList.append(0)vocabList = createVocabList(docList)  # 创建词汇表trainSet = list(range(5572))  # 训练样本集testSet = []# 随机抽取10个样本当作测试数据for i in range(int(5572 / 10)):randIndex = int(random.uniform(0, len(trainSet)))testSet.append(trainSet[randIndex])  # 将选出的样本添加到测试样本集del (trainSet[randIndex])  # 将选出的样本从训练样本集中删除trainMat = []trainClass = []for docIndex in trainSet:trainMat.append(bagOfWords2Vec(vocabList, docList[docIndex]))  # trainMat为训练样本的词向量矩阵trainClass.append(classList[docIndex])  # trainClass按顺序保存训练样本的分类p0, p1, pSpam = train(np.array(trainMat), np.array(trainClass))"""p0为训练样本的正常邮件中每个单词出现的概率p1为训练样本的垃圾邮件中每个单词出现的概率pSpam为训练样本中垃圾邮件所占的比例"""errcount = 0# 用测试样本进行测试for docIndex in testSet:wordVec = bagOfWords2Vec(vocabList, docList[docIndex])if classfy(np.array(wordVec), p0, p1, pSpam) != classList[docIndex]:errcount += 1print('classfication error'), docList[docIndex]print("The error rate is ", float(errcount) / len(testSet))print("正确率为:", 1 - float(errcount) / len(testSet))test_file = textParse(open('email/spam/2.txt', encoding='utf8').read())wordVec = bagOfWords2Vec(vocabList, test_file)print(classfy(np.array(wordVec), p0, p1, pSpam))if __name__ == '__main__':spamTest()

代码中用到的SMSSpamCollection.txt可查看我的资源获取

参考文章:

《机器学习实战》——人民邮电出版社
《统计学习方法》——李航

《机器学习实战》基于朴素贝叶斯算法实现垃圾邮件分类相关推荐

  1. python:基于朴素贝叶斯算法的垃圾邮件过滤分类

    目录 一.朴素贝叶斯算法 1.概述 2.推导过程 二.实现垃圾邮件过滤分类 1.垃圾邮件问题背景 2.朴素贝叶斯算法实现垃圾邮件分类的步骤 3.python实现 参考学习网址:https://blog ...

  2. 基于朴素贝叶斯+Python实现垃圾邮件分类和结果分析

    基于朴素贝叶斯+Python实现垃圾邮件分类 朴素贝叶斯原理 请参考: 贝叶斯推断及其互联网应用(二):过滤垃圾邮件 Python实现 源代码主干来自: python实现贝叶斯推断--垃圾邮件分类 我 ...

  3. 【机器学习实战】朴素贝叶斯应用之垃圾邮件过滤

    1.什么是朴素贝叶斯 2.贝叶斯公式 3.朴素贝叶斯常用的三个模型 4.朴素贝叶斯实现垃圾邮件过滤的步骤 5.垃圾邮件过滤实验: (一).准备收集好的数据集,并下载到本地文件夹 (二).朴素贝叶斯分类 ...

  4. 机器学习——朴素贝叶斯算法(垃圾邮件分类)

    朴素贝叶斯算法介绍以及垃圾邮件分类实现 1.一些数学知识 2.贝叶斯公式 3.朴素贝叶斯算法 (1)介绍 (2)核心思想 (3)朴素贝叶斯算法 (4)拉普拉斯修正 (5)防溢出策略 (6)一般过程 ( ...

  5. 机器学习:朴素贝叶斯算法与垃圾邮件过滤

    简介 贝叶斯算法是由英国数学家托马斯·贝叶斯提出的,这个算法的提出是为了解决"逆向概率"的问题.首先我们先来解释下正向概率与逆向概率的含义: 正向概率:假设一个箱子里有5个黄色球和 ...

  6. 朴素贝叶斯算法实现垃圾邮件过滤(Python3实现)

    目录 1.朴素贝叶斯实现垃圾邮件分类的步骤 2.邮件数据 3.代码实现 4.朴素贝叶斯的优点和缺点 1.朴素贝叶斯实现垃圾邮件分类的步骤 (1)收集数据:提供文本文件. (2)准备数据:将文本文件解析 ...

  7. 朴素贝叶斯算法:实现邮件分类

    朴素贝叶斯算法:实现邮件分类 注:代码和数据已上传:https://download.csdn.net/download/j__max/10705454 一.实验准备 1.实验内容和目的 使用5000 ...

  8. 朴素贝叶斯算法实现垃圾邮件过滤

    朴素贝叶斯算法实现垃圾邮件过滤 1.1 题目的主要研究内容 (1)贝叶斯垃圾邮件过滤技术是一种电子邮件过滤的统计学技术,它使用贝叶斯分类来进行垃圾邮件的判别. (2)贝叶斯分类的运作是借着使用标记(一 ...

  9. 基于朴素贝叶斯算法对肿瘤类别分类

    目录 朴素贝叶斯算法​编辑 朴素贝叶斯的三种方式 实战--肿瘤类别的分类 朴素贝叶斯算法  贝叶斯定理 贝叶斯定理(Bayes Theorem)也称贝叶斯公式,是关于随机 事件的条件概率的定理 定理内 ...

最新文章

  1. 深圳网络推广公司介绍几点新网站优化守则!
  2. oracle和mysql登录方式_使用普通方式和连接池方式获取Oracle和Mysql链接
  3. python switch_从邮箱验证小项目说python字符串判断与if判断那些事儿
  4. 【译】Tutorials ---- Hello, World
  5. 5.1.7 INSERT新增数据
  6. 字典按照值或键进行排序
  7. java 的 provider_Java Provider.Service getProvider()用法及代码示例
  8. linux命令dh f,linux 下 find 命令的高级用法
  9. C++ map()和pair()用法
  10. (HDU)1089 --A+B for Input-Output Practice (I)(输入输出练习(I))
  11. MyCat分片规则之字符串hash解析算法分片
  12. 铁路售票系统_城轨交通地高铁车站自动售检票(AFC)实训系统解决方案
  13. 小程序文档整理之 -- API(调试接口)
  14. ubuntu安装系分区,挂载磁盘
  15. VBA实现批量图片格式转换
  16. 有意思的互联网创业公司(Timehop/Redbeacon )
  17. HiPER 840负责均衡问题
  18. 5G时代来临,欢迎进入《头号玩家》的科幻世界
  19. CVPR2021 | 2D目标检测论文解读
  20. 90G图片分享图片批量压缩zip和解压unzip

热门文章

  1. 高中计算机学业水平测试知识点总结,高中化学学业水平测试知识点总结
  2. Git指令,Git常用命令及详细用法
  3. 又收到一只瑞星寄来的卡卡狮……汗!
  4. stc单片机 读写flash_3.看懂单片机上的标号
  5. moss 备忘 网站复制
  6. 秦韵FPGA 转载或原创(十四) 高云FPGAGW2A18C
  7. 【笔记】高级运动营养学
  8. Software In 云端
  9. php app 社交 开源,开源app
  10. 光线传感器工具类,和仿微信扫一扫预览条码放大和光线检测