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

那样的思路可以是:对某类文章单独构建类内的词汇表再进行选择。最后对类间词汇表叠加就ok了。
答:词汇表有个缺点就是,不能很好的适应新词

改进思路呢
答:我给你一个改进思路:你只提取每个文本中的名词、动词、形容词、地名,用这些词的作为文本的特征来训练试一试,用文本分类用主题模型(LDA)来向量化文本,再训练模型试一试。如果效果还是不够好,再将文本向量用PCA进行一次特征降维,然后再训练模型试一试,按常理来说,效果应该会有提高

还有我之前个人写的程序分类效果不理想,后来改用sklearn内置BN运行依旧不理想。适当改进了特征提取,还是不理想。估计每类10篇文章的训练数据太少了
答:文本本身特征提取就相对难一些,再加上训练数据少,训练出来的模型效果可想而已,正常的

sklearn:朴素贝叶斯分类调用 数据准备和数据预处理

加载文档数据集和分类集

数据准备和数据预处理上文已经介绍了,本节增加了一个全局变量存储词汇表,目的是写入到本地文本里,本地读取词汇集,避免每次都做特征向量时加载训练集,提高运行时间。

myVocabList = [] # 设置词汇表的全局变量 '''创建数据集和类标签''' 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) # print(len(docList),len(classList),len(fullText)) global myVocabList myVocabList = createVocabList(docList) # 创建单词集合 return docList,classList,myVocabList ''' 利用jieba对文本进行分词,返回切词后的list ''' def textParse(str_doc): #与上文方法一致 ''' 去掉一些停用词、数字、特殊符号 ''' def rm_tokens(words, stwlist): #与上文方法一致

文档数据集和分类集在本地读写操作

# 本地存储数据集和标签 def storedata(): # 3. 计算单词是否出现并创建数据矩阵 # trainMat =[[0,1,2,3],[2,3,1,5],[0,1,4,2]] # 训练集 # classList = [0,1,2] #类标签 docList,classList,myVocabList = loadDataSet() # 计算单词是否出现并创建数据矩阵 trainMat = [] for postinDoc in docList: trainMat.append(bagOfWords2VecMN(myVocabList, postinDoc)) res = "" for i in range(len(trainMat)): res +=' '.join([str(x) for x in trainMat[i]])+' '+str(classList[i])+'\n' # print(res[:-1]) # 删除最后一个换行符 with open('./word-bag.txt','w') as fw: fw.write(res[:-1]) with open('./wordset.txt','w') as fw: fw.write(' '.join([str(v) for v in myVocabList])) # 读取本地数据集和标签 def grabdata(): f = open('./word-bag.txt') # 读取本地文件 arrayLines = f.readlines() # 行向量 tzsize = len(arrayLines[0].split(' '))-1 # 列向量,特征个数减1即数据集 returnMat = zeros((len(arrayLines),tzsize)) # 0矩阵数据集 classLabelVactor = [] # 标签集,特征最后一列 index = 0 for line in arrayLines: # 逐行读取 listFromLine = line.strip().split(' ') # 分析数据,空格处理 # print(listFromLine) returnMat[index,:] = listFromLine[0:tzsize] # 数据集 classLabelVactor.append(int(listFromLine[-1])) # 类别标签集 index +=1 # print(returnMat,classLabelVactor) myVocabList=writewordset() return returnMat,classLabelVactor,myVocabList def writewordset(): f1 = open('./wordset.txt') myVocabList =f1.readline().split(' ') for w in myVocabList: if w=='': myVocabList.remove(w) return myVocabList

获取文档集合和构建词袋模型

'''获取所有文档单词的集合''' 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 高斯朴素贝叶斯

GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法。特征的可能性(即概率)假设为高斯分布:

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

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