朴素贝叶斯文本分类代码(详解)

简介:    1 from numpy import zeros,array 2 from math import log 3 4 def loadDataSet(): 5 #词条切分后的文档集合,列表每一行代表一个email 6 postingList=[['yo...
 

  

  1 from numpy import zeros,array
  2 from math import log
  3 
  4 def loadDataSet():
  5 #词条切分后的文档集合,列表每一行代表一个email 
  6     postingList=[['your','mobile','number','is','award','bonus','prize'],
  7                  ['new','car','and','house','for','my','parents'],
  8                  ['my','dalmation','is','so','cute','I','love','him'],  
  9                  ['today','voda','number','prize', 'receive','award'],
 10                  ['get','new','job','in','company','how','to','get','that'],
 11                  ['free','prize','buy','winner','receive','cash']]
 12     #由人工标注的每篇文档的类标签
 13     classVec=[1,0,0,1,0,1] #1-spam, 0-ham
 14     return postingList,classVec
 15 postingList,classVec = loadDataSet()
 16 
 17 
 18 #统计所有文档中出现的词条列表    
 19 def createVocabList(dataSet): 
 20     vocabSet=set([])
 21     #遍历文档集合中的每一篇文档
 22     for document in dataSet: 
 23         vocabSet=vocabSet|set(document) 
 24     return list(vocabSet)
 25 vocabSet = createVocabList(postingList)
 26 
 27 
 28 #根据词条列表中的词条是否在文档中出现(出现1,未出现0),将文档转化为词条向量    
 29 def setOfWords2Vec(vocabSet,inputSet):
 30     #新建一个长度为vocabSet的列表,并且各维度元素初始化为0
 31     returnVec=[0]*len(vocabSet)
 32     #遍历文档中的每一个词条
 33     for word in inputSet:
 34         #如果词条在词条列表中出现
 35         if word in vocabSet:
 36             #通过列表获取当前word的索引(下标)
 37             #将词条向量中的对应下标的项由0改为1
 38             returnVec[vocabSet.index(word)]=1
 39         else: print('the word: %s is not in my vocabulary! '%'word')
 40     #返回inputet转化后的词条向量
 41     return returnVec
 42  
 43 trainMatrix = [setOfWords2Vec(vocabSet,inputSet) for inputSet in postingList] 
 44 
 45 
 46 #训练算法,从词向量计算概率p(w0|ci)...及p(ci)
 47 #@trainMatrix:由每篇文档的词条向量组成的文档矩阵
 48 #@trainCategory:每篇文档的类标签组成的向量
 49 def trainNB0(trainMatrix,trainCategory):
 50     #获取文档矩阵中文档的数目
 51     numTrainDocs=len(trainMatrix)
 52     #获取词条向量的长度
 53     numWords=len(trainMatrix[0])
 54     #所有文档中属于类1所占的比例p(c=1)
 55     pAbusive=sum(trainCategory)/float(numTrainDocs)
 56     #创建一个长度为词条向量等长的列表
 57     p0Num=zeros(numWords) #ham
 58     p1Num=zeros(numWords) #spam
 59     p0Denom=0.0
 60     p1Denom=0.0
 61     #遍历每一篇文档的词条向量
 62     for i in range(numTrainDocs):
 63         #如果该词条向量对应的标签为1
 64         if trainCategory[i]==1:
 65             #统计所有类别为1的词条向量中各个词条出现的次数
 66             p1Num+=trainMatrix[i]
 67             #统计类别为1的词条向量中出现的所有词条的总数
 68             #即统计类1所有文档中出现单词的数目
 69             p1Denom+=sum(trainMatrix[i])
 70         else:
 71             #统计所有类别为0的词条向量中各个词条出现的次数
 72             p0Num+=trainMatrix[i]
 73             #统计类别为0的词条向量中出现的所有词条的总数
 74             #即统计类0所有文档中出现单词的数目
 75             p0Denom+=sum(trainMatrix[i])
 76     print(p1Num, p1Denom, p0Num,p0Denom )
 77     #利用NumPy数组计算p(wi|c1)
 78     p1Vect=p1Num/p1Denom  #为避免下溢出问题,需要改为log()
 79     #利用NumPy数组计算p(wi|c0)
 80     p0Vect=p0Num/p0Denom  #为避免下溢出问题,需要改为log()
 81     return p0Vect,p1Vect,pAbusive
 82  
 83 p0Vect,p1Vect,pAbusive=  trainNB0(trainMatrix,classVec)
 84 
 85 
 86 #朴素贝叶斯分类函数
 87 #@vec2Classify:待测试分类的词条向量
 88 #@p0Vec:类别0所有文档中各个词条出现的频数p(wi|c0)
 89 #@p0Vec:类别1所有文档中各个词条出现的频数p(wi|c1)
 90 #@pClass1:类别为1的文档占文档总数比例
 91 def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
 92     #根据朴素贝叶斯分类函数分别计算待分类文档属于类1和类0的概率
 93     p1=sum(vec2Classify*p1Vec)+log(pClass1)
 94     p0=sum(vec2Classify*p0Vec)+log(1.0-pClass1)
 95     if p1>p0:
 96         return 'spam'
 97     else:
 98         return 'not spam'
 99 
100 
101 
102 testEntry=['love','my','job']
103 thisDoc=array(setOfWords2Vec(vocabSet,testEntry))
104 print(testEntry,'classified as:',classifyNB(thisDoc,p0Vect,p1Vect,pAbusive))

 

目录
相关文章
|
域名解析 缓存 网络协议
解决宝塔报错提示:您的请求在Web服务器中没有找到对应的站点
解决宝塔报错提示:您的请求在Web服务器中没有找到对应的站点
解决宝塔报错提示:您的请求在Web服务器中没有找到对应的站点
|
7月前
|
传感器 存储 人工智能
2026年企业级网络监控选型指南
2026年十大IT监控工具深度解析:从OpManager的全能均衡,到Zabbix的极致灵活,再到Datadog的云原生领先,覆盖混合云、AIOps与成本控制。无论你是中小企业求稳,还是大型企业追优,亦或技术极客自研,都能找到适配之选。选型不再盲从,洞察趋势方能致远。
553 0
|
8月前
|
机器学习/深度学习 监控 TensorFlow
蜜蜂数据的采集与处理方法-蜜蜂目标检测数据集(7000张图片已标注划分)
随着人工智能和计算机视觉技术的不断发展,目标检测任务在多个领域中都得到了广泛的应用。尤其是在农业和生态研究领域,自动化目标检测技术逐渐成为提高生产效率、保障生态环境的重要工具。蜜蜂作为生态系统中的关键物种,其活动的监控和分析对农业、生态环境保护及科学研究都具有重要意义。
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型
大模型正重塑数字世界,以千亿级参数和深度学习技术驱动AI革命。它赋能内容生成、智能交互与知识服务,同时带来伦理、隐私与能耗挑战。未来需走向高效、可信、向善的可持续发展之路。
|
编解码 测试技术 文件存储
阿里云无影云手机怎么用?非常简单,云手机创建、价格及连接使用图文教程
阿里云无影云手机是一种虚拟化手机服务,适用于仿真测试、云游戏、数字人直播等场景。支持包年包月与按量付费两种模式,配置从轻量型到性能型价格不一。使用方法简单:首先创建实例组(选择地域、规格、镜像等),然后安装应用,最后通过管理控制台、无影客户端或ADB连接云手机。详细教程与价格表见文内说明,助您快速上手!
2002 2
|
人工智能 IDE 程序员
通义灵码 2.0 AI 程序员下载安装
通义灵码2.0 AI程序员支持JetBrains IDEs、Visual Studio Code及远程开发场景,暂不支持Visual Studio。用户可通过插件市场搜索“TONGYI Lingma”安装,确保版本升级至2.0以上。安装后登录阿里云账号即可使用,个人版和企业版均免费。新手可参考官方指南进行IDE安装配置。
2913 11
|
12月前
|
Java 测试技术 API
自动化测试框架深度解析与选择指南
Apache JMeter是Apache组织基于Java开发的一款压力测试工具,旨在测试软件的性能承受能力。它支持多种协议测试及功能测试,提供灵活的断言创建能力,如同创建带断言的脚本来验证程序是否返回预期结果。
|
人工智能 自然语言处理 安全
已解决:国内如何使用Claude 3.5 Sonnet \ claude官网中文入口
已解决:国内如何使用Claude 3.5 Sonnet \ claude官网中文入口
3280 20
|
前端开发 Linux C#
一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia
一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia
1805 10
|
XML 存储 Java
maven的入门使用
maven的入门使用
268 0