深度 | 朴素贝叶斯模型算法研究与实例分析

深度 | 朴素贝叶斯模型算法研究与实例分析 (白宁超   2018年9月4日14:18:14)

导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果。所以很受欢迎,对于朴素贝叶斯的学习,本文首先介绍理论知识即朴素贝叶斯相关概念和公式推导,为了加深理解,采用一个维基百科上面性别分类例子进行形式化描述。然后通过编程实现朴素贝叶斯分类算法,并在屏蔽社区言论、垃圾邮件、个人广告中获取区域倾向等几个方面进行应用,包括创建数据集、数据预处理、词集模型和词袋模型、朴素贝叶斯模型训练和优化等。然后结合复旦大学新闻语料进行朴素贝叶斯的应用。最后,大家熟悉其原理和实现之后,采用机器学习sklearn包进行实现和优化。由于篇幅较长,采用理论理解、案例实现、sklearn优化三个部分进行学习。(本文原创,转载必须注明出处: 朴素贝叶斯模型算法研究与实例分析)

目录 复旦新闻语料:朴素贝叶斯中文文本分类 项目概述

本节介绍朴素贝叶斯分类算法模型在中文领域中的应用。我们对新闻语料进行多文本分类操作,本文选择艺术、文学、教育、哲学、历史五个类别的训练文本,然后采用新的测试语料进行分类预测。

收集数据

数据集是从复旦新闻语料库中抽取出来的,考虑学习使用,样本选择并不大。主要抽选艺术、文学、教育、哲学、历史五个类别各10篇文章。全部数据文档50篇。具体情况不同对收集数据要求不同,你也可以选择网络爬取,数据库导出等。这文档读取时候可能会遇到gbk,utf-8等格式共存的情况,这里建议采用BatUTF8Conv.exe(点击下载)工具,进行utf-8格式批量转化。

准备数据

创建数据集代码如下:

'''创建数据集和类标签''' def loadDataSet(): docList = [];classList = [] # 文档列表、类别列表 dirlist = ['C3-Art','C4-Literature','C5-Education','C6-Philosophy','C7-History'] for j in range(5): for i in range(1, 11): # 总共10个文档 # 切分,解析数据,并归类为 1 类别 wordList = textParse(open('./fudan/%s/%d.txt' % (dirlist[j],i),encoding='UTF-8').read()) docList.append(wordList) classList.append(j) # print(i,'\t','./fudan/%s/%d.txt' % (dirlist[j],i),'\t',j) return docList,classList ''' 利用jieba对文本进行分词,返回切词后的list ''' def textParse(str_doc): # 正则过滤掉特殊符号、标点、英文、数字等。 import re r1 = '[a-zA-Z0-9’!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\\]^_`{|}~]+' str_doc=re.sub(r1, '', str_doc) # 创建停用词列表 stwlist = set([line.strip() for line in open('./stopwords.txt', 'r', encoding='utf-8').readlines()]) sent_list = str_doc.split('\n') # word_2dlist = [rm_tokens(jieba.cut(part), stwlist) for part in sent_list] # 分词并去停用词 word_2dlist = [rm_tokens([word+"http://www.likecs.com/"+flag+" " for word, flag in pseg.cut(part) if flag in ['n','v','a','ns','nr','nt']], stwlist) for part in sent_list] # 带词性分词并去停用词 word_list = list(itertools.chain(*word_2dlist)) # 合并列表 return word_list ''' 去掉一些停用词、数字、特殊符号 ''' def rm_tokens(words, stwlist): words_list = list(words) for i in range(words_list.__len__())[::-1]: word = words_list[i] if word in stwlist: # 去除停用词 words_list.pop(i) elif len(word) == 1: # 去除单个字符 words_list.pop(i) elif word == " ": # 去除空字符 words_list.pop(i) return words_list

代码分析:loadDataSet()方法是遍历读取文件夹,并对每篇文档进行处理,最后返回全部文档集的列表和类标签。textParse()方法是对每篇文档字符串进行数据预处理,我们首选使用正则方法保留文本数据,然后进行带有词性的中文分词和词性选择,rm_tokens()是去掉一些停用词、数字、特殊符号。最终返回相对干净的数据集和标签集。

分析数据

前面两篇文章都介绍了,我们需要把文档进行向量化表示,首先构建全部文章的单词集合,实现代码如下:

'''获取所有文档单词的集合''' def createVocabList(dataSet): vocabSet = set([]) for document in dataSet: vocabSet = vocabSet | set(document) # 操作符 | 用于求两个集合的并集 # print(len(vocabSet),len(set(vocabSet))) return list(vocabSet)

基于文档模型的基础上,我们将特征向量转化为数据矩阵向量,这里使用的词袋模型,构造与实现方法如下:

'''文档词袋模型,创建矩阵数据''' def bagOfWords2VecMN(vocabList, inputSet): returnVec = [0] * len(vocabList) for word in inputSet: if word in vocabList: returnVec[vocabList.index(word)] += 1 return returnVec

对矩阵数据可以采用可视化分析方法或者结合NLTK进行数据分析,检查数据分布情况和特征向量构成情况及其特征选择作为参考。

训练算法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdysg.html