文章目录

  • 朴素贝叶斯实现书籍分类
  • 一、数据集
  • 二、实现方法
  • 二、代码
  • 实验结果

朴素贝叶斯实现书籍分类

朴素贝叶斯是生成方法,直接找出特征输出Y和特征X的联合分布P(X,Y)P(X,Y),然后用P(Y|X)=P(X,Y)/P(X)P(Y|X)=P(X,Y)/P(X)得出。

一、数据集

数据集链接:https://wss1.cn/f/73l1yh2yjny
数据格式说明:
X.Y
X表示书籍
Y表示该书籍下不同章节

目的:判断文本出自哪个书籍
自行划分训练和测试集

二、实现方法

1. 数据预处理
(1) 将原始数据的80%作为训练集,20%作为测试集

(2) 将训练集和测试集的数据去除所有数字、字符和多余的空格,并建立字典,将段落对应的书籍号作为索引,段落内容作为值。

2.朴素贝叶斯实现
(1) 创建词汇表

(2) 计算先验概率

(3) 计算条件概率

二、代码

naive_bayes_text_classifier.py

import numpy as np
import re
def loadDataSet(filepath):f = open(filepath, "r").readlines()raw_data = []print("去除所有符号数字...")for i in range(0, len(f), 2):temp = dict()temp["class"] = int(f[i].strip().split(".")[0])#去除所有符号和数字mid = re.sub("[1-9,!?,.:\"();&\t]", " ", f[i + 1].strip(), count=0, flags=0)#去除多余的空格temp["abstract"] = re.sub(" +", " ", mid, count=0, flags=0).strip()if temp["abstract"] != "":raw_data.append(temp)postingList=[i["abstract"].split() for i in raw_data]classVec = [i["class"] for i in raw_data]    #1 is abusive, 0 notreturn postingList, classVec
# 集合结构内元素的唯一性,创建一个包含所有词汇的词表。
def createVocabList(dataSet):vocabSet = set([])  # 建立一个空列表for document in dataSet:vocabSet = vocabSet | set(document) # 合并两个集合return list(vocabSet)def setOfWords2Vec(vocabList, inputSet):returnVec = [0]*len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] = 1else:continueprint("the word: %s is not in my Vocabulary!" % word)return returnVec# 进行训练, 这里就是计算: 条件概率 和 先验概率
def trainNB0(trainMatrix, trainCategory):numTrainDocs = len(trainMatrix)  # 计算总的样本数量# 计算样本向量化后的长度, 这里等于词典长度。numWords = len(trainMatrix[0])# 计算先验概率p0 = np.sum(trainCategory == 0)  / float(numTrainDocs)p1 = np.sum(trainCategory == 1) / float(numTrainDocs)p2 = np.sum(trainCategory == 2) / float(numTrainDocs)p3 = np.sum(trainCategory == 3) / float(numTrainDocs)p4 = np.sum(trainCategory == 4) / float(numTrainDocs)p5 = np.sum(trainCategory == 5) / float(numTrainDocs)p6 = np.sum(trainCategory == 6) / float(numTrainDocs)#print(p0,p1,p2,p3,p4,p5,p6)# 进行初始化, 用于向量化后的样本 累加, 为什么初始化1不是全0, 防止概率值为0.p0Num = np.ones(numWords)p1Num = np.ones(numWords)p2Num = np.ones(numWords)p3Num = np.ones(numWords)p4Num = np.ones(numWords)p5Num = np.ones(numWords)p6Num = np.ones(numWords) #change to ones()# 初始化求条件概率的分母为2, 防止出现0,无法计算的情况。p0Denom = 2.0p1Denom = 2.0p2Denom = 2.0p3Denom = 2.0p4Denom = 2.0p5Denom = 2.0p6Denom = 2.0 #change to 2.0# 遍历所有向量化后的样本, 并且每个向量化后的长度相等, 等于词典长度。for i in range(numTrainDocs):# 统计标签为1的样本: 向量化后的样本的累加, 样本中1总数的求和, 最后相除取log就是条件概率。if trainCategory[i] == 0:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])# 统计标签为0的样本: 向量化后的样本累加, 样本中1总数的求和, 最后相除取log就是条件概率。elif trainCategory[i] == 1:p1Num += trainMatrix[i]p1Denom += sum(trainMatrix[i])elif trainCategory[i] == 2:p2Num += trainMatrix[i]p2Denom += sum(trainMatrix[i])elif trainCategory[i] == 3:p3Num += trainMatrix[i]p3Denom += sum(trainMatrix[i])elif trainCategory[i] == 4:p4Num += trainMatrix[i]p4Denom += sum(trainMatrix[i])elif trainCategory[i] == 5:p5Num += trainMatrix[i]p5Denom += sum(trainMatrix[i])elif trainCategory[i] == 6:p6Num += trainMatrix[i]p6Denom += sum(trainMatrix[i])# 求条件概率。p0Vect = np.log(p0Num / p0Denom)p1Vect = np.log(p1Num / p1Denom)    # 改为 log() 防止出现0p2Vect = np.log(p2Num / p2Denom)p3Vect = np.log(p3Num / p3Denom)p4Vect = np.log(p4Num / p4Denom)p5Vect = np.log(p5Num / p5Denom)p6Vect = np.log(p6Num / p6Denom)# 返回条件概率 和 先验概率return p0Vect, p1Vect, p2Vect, p3Vect, p4Vect, p5Vect, p6Vect, p0,p1,p2,p3,p4,p5,p6def classifyNB(vec2Classify, p0Vec, p1Vec,p2Vec, p3Vec,p4Vec, p5Vec,p6Vec, p0,p1,p2,p3,p4,p5,p6):# 向量化后的样本 分别 与 各类别的条件概率相乘 加上先验概率取log,之后进行大小比较, 输出类别。p0 = sum(vec2Classify * p0Vec) + np.log(p0)p1 = sum(vec2Classify * p1Vec) + np.log(p1)    #element-wise multp2 = sum(vec2Classify * p2Vec) + np.log(p2)p3 = sum(vec2Classify * p3Vec) + np.log(p3)p4 = sum(vec2Classify * p4Vec) + np.log(p4)p5 = sum(vec2Classify * p5Vec) + np.log(p5)p6 = sum(vec2Classify * p6Vec) + np.log(p6)res=[p0,p1,p2,p3,p4,p5,p6]return res.index(max(res))
if __name__ == '__main__':# 生成训练样本 和 标签print("获取训练数据...")listOPosts, listClasses = loadDataSet("bys_data_train.txt")print("训练数据集大小:",len(listOPosts))# 创建词典print("建立词典...")myVocabList = createVocabList(listOPosts)# 用于保存样本转向量之后的trainMat=[]# 遍历每一个样本, 转向量后, 保存到列表中。for postinDoc in listOPosts:trainMat.append(setOfWords2Vec(myVocabList, postinDoc))# 计算 条件概率 和 先验概率print("训练...")p0V,p1V,p2V,p3V,p4V,p5V,p6V,p0,p1,p2,p3,p4,p5,p6 = trainNB0(np.array(trainMat), np.array(listClasses))# 给定测试样本 进行测试print("获取测试数据...")listOPosts, listClasses = loadDataSet("bys_data_test.txt")print("测试数据集大小:", len(listOPosts))f=open("output.txt","w")total=0true=0for i,j in zip(listOPosts,listClasses):testEntry = ithisDoc = np.array(setOfWords2Vec(myVocabList, testEntry))result=classifyNB(thisDoc, p0V,p1V,p2V,p3V,p4V,p5V,p6V,p0,p1,p2,p3,p4,p5,p6)print(" ".join(testEntry))print('分类结果为: ', result,' 答案结果为: ',j)f.write(" ".join(testEntry)+"\n")f.write('分类结果为: '+ str(result)+' 答案结果为: '+str(j)+ "\n")total+=1if result==j:true+=1print("total acc: ",true/total)f.write("total acc: "+str(true/total))f.close()

preprocess.py

from sklearn.model_selection import train_test_splitf=open("AsianReligionsData .txt","r",encoding='gb18030',errors="ignore").readlines()
raw_data=[]
for i in range(0,len(f),2):raw_data.append(f[i]+f[i+1])train, test = train_test_split(raw_data, train_size=0.8, test_size=0.2,random_state=42)
print(len(train))
print(len(test))f=open("bys_data_train.txt","w")
for i in train:f.write(i)
f.close()
f=open("bys_data_test.txt","w")
for i in test:f.write(i)
f.close()

实验结果

(1) 预测结果和真实结果比较

(2) 准确率计算

朴素贝叶斯实现书籍分类相关推荐

  1. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说

    Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报  分类: 机器学习(19)  听说朴 ...

  2. 七、朴素贝叶斯中文文本分类

    1.朴素贝叶斯中文文本分类 中文分词 停用词 朴素贝叶斯中文分类举例:新闻文档分类 朴素贝叶斯中文分类的具体过程:加载停用词.中文分词.文本向量化.模型训练和保存.模型的加载和预测. 2 中文分词 2 ...

  3. 朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战

    基于朴素贝叶斯的文本分类方法 一.朴素贝叶斯原理的介绍 二.朴素贝叶斯分类器的代码实现 分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同时会给出这个猜测的概率估计值.朴素贝叶 ...

  4. 基于朴素贝叶斯实现文本分类

    基于朴素贝叶斯实现文本分类 数据集介绍 数据集为网上公开的新闻数据,其中数据集包含10个类别. 模型选择 贝叶斯分类 贝叶斯公式 朴素贝叶斯 拉普拉斯平滑引入 某个属性的条件概率为0,则会导致整体概率 ...

  5. 朴素贝叶斯、费舍尔分类方法

    朴素贝叶斯.费舍尔分类法 案例:有一批图书分类样本数据,用朴素贝叶斯.费舍尔分类法对样本数据学习进行分类. 数据清洗 这里我们不讨论数据的获取和清洗,而是聚焦在使用朴素贝叶斯.费舍尔分类法上.假设我们 ...

  6. 机器学习(六)--------python实现朴素贝叶斯对email分类

    贝叶斯分类 4.1 贝叶斯定理 计算条件概率 4.2 朴素贝叶斯分类 朴素:特征条件独立 贝叶斯:基于贝叶斯定理 该方法受限于当特征属性有条件独立或基本独立. 4.3 贝叶斯网络 贝叶斯网络也成为信念 ...

  7. python朴素贝叶斯的文本分类_自给自足,完全手写一个朴素贝叶斯分类器,完成文本分类...

    Part 1: 本文解决的问题: 我在有这样的一个数据集,里面存放了人们对近期播放电影的评价,当然评价也就分成两部分,好评和差评.我们想利用这些数据训练一个模型,然后可以自动的对影评做出判断,到底是好 ...

  8. k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优

    k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优 k近邻算法 k近邻算法概述 k近邻算法代码实现 k近邻算法的评价 朴素贝叶斯算法 朴素贝叶斯算法概述 朴素贝叶斯代码实现 朴素贝叶斯的评价 分类模型 ...

  9. 基于朴素贝叶斯的文本分类算法

    基于朴素贝叶斯的文本分类算法 摘要:常用的文本分类方法有支持向量机.K-近邻算法和朴素贝叶斯.其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用.本文详细介绍了朴素贝叶斯的基本原理,讨论多项式模 ...

最新文章

  1. Spring从菜鸟到高手(四)(上)使用JdbcTemplate类实现用户登陆验证、批量更新
  2. 大型网站核心架构要素--扩展性
  3. 011_Redis的快照持久化
  4. 关于对php-fpm的压力测试
  5. 我的世界网易怎么下载java材质包_我的世界中国版材质包怎么用 材质包设置
  6. html全局浮窗,Html 实现浮动窗口
  7. ae正在发生崩溃_AE错误:正在发生崩溃的解决方法,原创问题解决方案
  8. c++时间片轮转rr进程调度算法_「学习笔记」时间片轮转(RR)调度算法(详解版)...
  9. python自己制作视频_你还在为看电影发愁?Python制作全网视频播放工具!
  10. python 热度图_python可视化(七)绘制詹姆斯、杜兰特、伦纳德生涯数据热度图...
  11. Matlab获取线粒体序列及核苷酸初步分析
  12. maven profile <filtering>true</filtering>的作用
  13. linux 误删文件恢复
  14. 苹果6性能测试软件,5款iPhone升级iOS13.6性能测试:运行速度有所提升?
  15. 计算机基础学习-什么是并行传输、串行传输、异步传输?
  16. 苹果6s plus信号显示无服务器,苹果iPhone 6Splus手机一直无服务如何解决
  17. 未定义标识符ULONG_PTR,BOOL等错误解决方法
  18. 联想小新padpro和华为matepad10.4哪个好有什么区别 详细性能配置对比
  19. 攻防世界 Misc高手进阶区 7分题 流量分析
  20. 2022年注册会计师财务管理历年真题易错题详解第一章

热门文章

  1. 20行python代码的入门级小游戏
  2. “链引擎”入驻案例 | 每天超过35万条存证上链,长安链支撑链上价值流动
  3. Linux 下刷 TWRP
  4. 路面附着系数估计_无迹 扩展卡尔曼滤波(UKF/EKF) 采用无迹/扩展卡尔曼滤波UKF进行路面附着系数估计,可实现“不变路面,对接路面和对开路面”等工况的路面附着系数估计
  5. 服务器共享文档密码,电脑共享 服务器密码是多少
  6. 【分享】查询分析器显示了完整的字段信息
  7. 2004.09.18,Sat - 国耻日
  8. Multi-task Pre-training Language Model for Semantic Network Completion
  9. oracle lmd0,用strace跟踪分析oracle 10.2.0.1 rac lmd进程系列二
  10. QML 中播放PPT文件