脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - 朴素贝叶斯Python实例及解析

朴素贝叶斯Python实例及解析

2021-04-21 00:12qq_36047182 Python

这篇文章主要为大家详细介绍了朴素贝叶斯Python算法实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Python朴素贝叶斯实例代码,供大家参考,具体内容如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
#-*- coding: utf-8 -*- #添加中文注释
from numpy import *
 
#过滤网站的恶意留言
#样本数据 
def loadDataSet():
  postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
         ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
         ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
         ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
         ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
         ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
  #类别标签:1侮辱性文字,0正常言论
  classVec = [0,1,0,1,0,1]  
  #返回文档向量,类别向量
  return postingList,classVec
 
#创建词汇表
#输入:dataSet已经经过切分处理
#输出:包含所有文档中出现的不重复词的列表            
def createVocabList(dataSet):
  #构建set集合,会返回不重复词表
  vocabSet = set([])
  #遍历每篇文档向量,扫描所有文档的单词
  for document in dataSet:
    #通过set(document),获取document中不重复词列表
    vocabSet = vocabSet | set(document) #求并集
  return list(vocabSet)
 
#***词集模型:只考虑单词是否出现
#vocabList:词汇表
#inputSet :某个文档向量
def setOfWords2Vec(vocabList, inputSet):
  #创建所含元素全为0的向量
  returnVec = [0]*len(vocabList)
  #依次取出文档中的单词与词汇表进行对照,若在词汇表中出现则为1
  for word in inputSet:
    if word in vocabList:
    #单词在词汇表中出现,则记为1
      returnVec[vocabList.index(word)] = 1 #词集模型
    #若测试文档的单词,不在词汇表中,显示提示信息,该单词出现次数用0表示
    else: print "the word: %s is not in my Vocabulary!" % word
  return returnVec
 
#====训练分类器,原始的朴素贝叶斯,没有优化=====
#输入trainMatrix:词向量数据集
#输入trainCategory:数据集对应的类别标签
#输出p0Vect:词汇表中各个单词在正常言论中的类条件概率密度
#输出p1Vect:词汇表中各个单词在侮辱性言论中的类条件概率密度
#输出pAbusive:侮辱性言论在整个数据集中的比例
def trainNB00(trainMatrix,trainCategory):
  #numTrainDocs训练集总条数
  numTrainDocs = len(trainMatrix)
  #训练集中所有不重复单词总数
  numWords = len(trainMatrix[0])
  #侮辱类的概率(侮辱类占总训练数据的比例)
  pAbusive = sum(trainCategory)/float(numTrainDocs)
  #*正常言论的类条件概率密度 p(某单词|正常言论)=p0Num/p0Denom
  p0Num = zeros(numWords); #初始化分子为0
  #*侮辱性言论的类条件概率密度 p(某单词|侮辱性言论)=p1Num/p1Denom 
  p1Num = zeros(numWords) #初始化分子为0
  #初始化分母置为0 
  p0Denom = 0;
  p1Denom = 0       
  #遍历训练集数据 
  for i in range(numTrainDocs):
    #若为侮辱类
    if trainCategory[i] == 1:
      #统计侮辱类所有文档中的各个单词总数
      p1Num += trainMatrix[i]
      #p1Denom侮辱类总单词数
      p1Denom += sum(trainMatrix[i])
 
    #若为正常类
    else:
      #统计正常类所有文档中的各个单词总数
      p0Num += trainMatrix[i]
      #p0Denom正常类总单词数
      p0Denom += sum(trainMatrix[i]) 
  #词汇表中的单词在侮辱性言论文档中的类条件概率 
  p1Vect = p1Num/p1Denom   
  #词汇表中的单词在正常性言论文档中的类条件概率
  p0Vect = p0Num/p0Denom
  return p0Vect,p1Vect,pAbusive
 
 
#=====训练分类器,优化处理=====
#输入trainMatrix:词向量数据集
#输入trainCategory:数据集对应的类别标签
#输出p0Vect:词汇表中各个单词在正常言论中的类条件概率密度
#输出p1Vect:词汇表中各个单词在侮辱性言论中的类条件概率密度
#输出pAbusive:侮辱性言论在整个数据集中的比例
def trainNB0(trainMatrix,trainCategory):
  #训练集总条数:行数
  numTrainDocs = len(trainMatrix)
  #训练集中所有单词总数:词向量维度
  numWords = len(trainMatrix[0])
  #侮辱类的概率(侮辱类占总训练数据的比例)
  pAbusive = sum(trainCategory)/float(numTrainDocs) 
  #*拉普拉斯平滑防止类条件概率为0,初始化分子为1,分母为2
  #正常类向量置为1
  p0Num = ones(numWords); #初始化分子为1
  #侮辱类向量置为1 
  p1Num = ones(numWords) #初始化分子为1
  #初始化分母置为2 
  p0Denom = 2.0;
  p1Denom = 2.0       
  #遍历训练集每个样本 
  for i in range(numTrainDocs):
    #若为侮辱类
    if trainCategory[i] == 1:
      #统计侮辱类所有文档中的各个单词总数
      p1Num += trainMatrix[i] #向量
      #p1Denom侮辱类总单词数
      p1Denom += sum(trainMatrix[i])
 
    #若为正常类
    else:
      #统计正常类所有文档中的各个单词总数
      p0Num += trainMatrix[i]
      #p0Denom正常类总单词数
      p0Denom += sum(trainMatrix[i]) 
  #数据取log,即单个单词的p(x1|c1)取log,防止下溢出   
  p1Vect = log(p1Num/p1Denom)    
  p0Vect = log(p0Num/p0Denom)
  return p0Vect,p1Vect,pAbusive
 
#vec2Classify:待分类文档
#p0Vect:词汇表中每个单词在训练样本的正常言论中的类条件概率密度
#p1Vect:词汇表中每个单词在训练样本的侮辱性言论中的类条件概率密度
#pClass1:侮辱性言论在训练集中所占的比例
def classifyNB(vec2Classify, p0Vect, p1Vect, pClass1):
  #在对数空间中进行计算,属于哪一类的概率比较大就判为哪一类
  #print'0p1=',sum(vec2Classify * p0Vect) #查看结果
  #print'0p0=',sum(vec2Classify * p0Vect)
  p1 = sum(vec2Classify * p1Vect) + log(pClass1) 
  p0 = sum(vec2Classify * p0Vect) + log(1.0 - pClass1)
  #print'p1=',p1
  #print'p0=',p0
  if p1 > p0:
    return 1
  else:
    return 0
 
def testingNB():
  #获得训练数据,类别标签
  listOPosts,listClasses = loadDataSet()
  #创建词汇表
  myVocabList = createVocabList(listOPosts)
  #构建矩阵,存放训练数据
  trainMat=[]
 
  #遍历原始数据,转换为词向量,构成数据训练矩阵
  for postinDoc in listOPosts:
    #数据转换后存入数据训练矩阵trainMat中
    trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
  #训练分类器
  p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
 
  #===测试数据(1)
  testEntry = ['love', 'my', 'dalmation']
  #测试数据转为词向量
  thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
  #输出分类结果
  print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
 
  #===测试数据(2)
  testEntry = ['stupid', 'garbage']
  #测试数据转为词向量
  thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
  #输出分类结果
  print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb) 
 
 
 
#***词袋模型:考虑单词出现的次数
#vocabList:词汇表
#inputSet :某个文档向量
def bagOfWords2VecMN(vocabList, inputSet):
  #创建所含元素全为0的向量
  returnVec = [0]*len(vocabList)
  #依次取出文档中的单词与词汇表进行对照,统计单词在文档中出现的次数
  for word in inputSet:
    if word in vocabList:
      #单词在文档中出现的次数
      returnVec[vocabList.index(word)] += 1
    #若测试文档的单词,不在词汇表中,显示提示信息,该单词出现次数用0表示
    else: print "the word: %s is not in my Vocabulary!" % word
  return returnVec
 
 
#准备数据,按空格切分出词
#单词长度小于或等于2的全部丢弃
def textParse(bigString): 
  import re
  listOfTokens = re.split(r'\W*', bigString)
  #tok.lower() 将整个词转换为小写
  return [tok.lower() for tok in listOfTokens if len(tok) > 2]
 
def spamTest():
  #文章按篇存放
  docList=[];
  #存放文章类别
  classList = [];
  #存放所有文章内容 
  fullText =[]
  for i in range(1,26):
    #读取垃圾邮件
    #wordList = textParse(open('D:/work/python/email/spam/%d.txt' % i).read()) 
    wordList = textParse(open('D:/machine learning/python/bayes/email/spam/%d.txt' % i).read()) 
    #docList按篇存放文章
    docList.append(wordList)
    #fullText邮件内容存放到一起
    fullText.extend(wordList)
    #垃圾邮件类别标记为1
    classList.append(1)
 
    #读取正常邮件
    #wordList = textParse(open('D:/work/python/email/ham/%d.txt' % i).read())
    wordList = textParse(open('D:/machine learning/python/bayes/email/ham/%d.txt' % i).read())
    docList.append(wordList)
    fullText.extend(wordList)
    #正常邮件类别标记为0
    classList.append(0)
 
  #创建词典 
  vocabList = createVocabList(docList)
  #训练集共50篇文章
  trainingSet = range(50);
  #创建测试集
  testSet=[]
  #随机选取10篇文章为测试集,测试集中文章从训练集中删除 
  for i in range(10):
    #0-50间产生一个随机数
    randIndex = int(random.uniform(0,len(trainingSet)))
    #从训练集中找到对应文章,加入测试集中
    testSet.append(trainingSet[randIndex])
    #删除对应文章
    del(trainingSet[randIndex])
 
  #准备数据,用于训练分类器 
  trainMat=[]; #训练数据
  trainClasses = [] #类别标签
 
  #遍历训练集中文章数据
  for docIndex in trainingSet:
    #每篇文章转为词袋向量模型,存入trainMat数据矩阵中
    trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
    #trainClasses存放每篇文章的类别
    trainClasses.append(classList[docIndex])
  #训练分类器
  p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses))
 
  #errorCount记录测试数据出错次数
  errorCount = 0
  #遍历测试数据集,每条数据相当于一条文本
  for docIndex in testSet:
    #文本转换为词向量模型 
    wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
    #模型给出的分类结果与本身类别不一致时,说明模型出错,errorCount数加1
    if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
      errorCount += 1
      #输出出错的文章
      print "classification error",docList[docIndex]
 
  #输出错误率,即出错次数/总测试次数
  print 'the error rate is: ',float(errorCount)/len(testSet)
 
 
  #return vocabList,fullText
 
if __name__ == "__main__":
 
###**********************留言板数据:观察参数值start
###  #获取数据
  listOPosts,listClasses = loadDataSet()
#  #构建词汇表
  myVocabList = createVocabList(listOPosts)
  print 'myVocabList=',myVocabList
  print 'result=',setOfWords2Vec(myVocabList, listOPosts[0])
  trainMat = []
  for postinDoc in listOPosts:
    #构建训练矩阵
    trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
  p0Vect,p1Vect,pAbusive = trainNB0(trainMat, listClasses)
  print 'p0Vect='
  print p0Vect
  print 'p1Vect='
  print p1Vect
  print 'pAbusive='
  print pAbusive
  print 'trainMatrix='
  print trainMat
  print 'listClasses=',listClasses
###**********************留言板数据:观察参数值end 
 
##  #测试留言板文档
  print'==================================='
  testingNB()
 
#***********************垃圾邮件 
##  #垃圾邮件分类
  print'=======spam filtering============='
  spamTest()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_36047182/article/details/79753395

延伸 · 阅读

精彩推荐