python樸素貝葉斯電子郵件分類例項

2021-09-12 11:47:29 字數 4760 閱讀 4907

一、步驟

(1)收集資料:提供文字檔案。

(2)準備資料:將文字檔案解析成詞條向量。

(3)分析資料:檢查詞條確保解析的正確性。

(4)訓練演算法:使用我們之前建立的trainnb0()函式。

(5)測試演算法:使用classifynb(),並且構建乙個新的測試函式來計算文件集的錯誤率。

(6)使用演算法:構建乙個完整的程式對一組文件進行分類,將錯分的文件輸出到螢幕上。

二、例項+注釋

# coding: utf-8

from numpy import *

import sys

def loaddataset():

postinglist = [[ 'my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],

['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],

['my', 'dalmation', 'is', 'so', 'cute', 't', 'love', 'him'],

['stop', 'posting', 'stupid', 'worthless', 'garbage'],

['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],

['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]

classvec = [0, 1, 0, 1, 0, 1] # 1代表侮辱性文字 0代表正常言論

return postinglist, classvec

def createvocablist( dataset ):

vocabset = set()

for document in dataset:

vocabset = vocabset | set(document)

return list(vocabset)

def setofwordsvec( vocablist, inputset ):

# 建立乙個其中所含元素都為0的向量

returnvec = [0] * len( vocablist )

for word in inputset:

if word in vocablist:

returnvec[ vocablist.index(word) ] = 1

else:

print "the word: %s is not in my vocabulary!" % word

return returnvec

def bagofwords2vecmn( vocablist, inputset ):

''' 準備資料: 文件詞袋模型 '''

returnvec = [0] * len( vocablist )

for word in inputset:

if word in inputset:

returnvec[ vocablist.index(word) ] += 1

return returnvec

def trainnb0( trainmatrix, traincategory ):

''' 訓練演算法 分類器訓練函式 '''

''' 得到vec型別的 侮辱性詞彙概率 訓練矩陣,訓練型別標籤 '''

numtraindocs = len( trainmatrix ) # 多少行訓練文件 6

numwords = len( trainmatrix[0] ) # 一行文件有多少詞條數量 32

# 有多少個文件裡面包含了侮辱性詞彙

pabusive = sum( traincategory ) / float( numtraindocs )

p0num = ones( numwords ) # 初始化為1 防止相乘後為0

p1num = ones( numwords )

p0denom = 2.0

p1denom = 2.0 # 分母

for i in range( numtraindocs ):

if traincategory[i] == 1: # 該行有侮辱性詞彙

p1num += trainmatrix[i] # 兩個 narray 相加

p1denom += sum( trainmatrix[i] )

else:

p0num += trainmatrix[i]

p0denom += sum( trainmatrix[i] )

p1vect = log(p1num / p1denom) # 得到vec型別的 侮辱性詞彙概率

p0vect = log(p0num / p0denom) # 得到vec型別的 正常性詞彙概率

return p0vect, p1vect, pabusive

def classifynb( vec2classify, p0vec, p1vec, pclass1 ):

''' 測試演算法:分類函式 '''

p1 = sum( vec2classify * p1vec ) + log( pclass1 ) # 加法即乘法,log(ab) = log(a) + log(b)

p0 = sum( vec2classify * p0vec ) + log( 1.0 - pclass1 )

if p1 > p0:

return 1

else:

return 0

def textparse( bigstring ):

''' 資料準備 '''

import re

listoftokens = re.split(r'\w*', bigstring)

return [ tok.lower() for tok in listoftokens if len(tok) > 0 ]

def spamtest():

doclist = ; classlist = ; fulltext =

for i in range(1, 26):

wordlist = textparse( open('email/spam/%d.txt' % i).read() )

fulltext.extend( wordlist )

wordlist = textparse( open('email/ham/%d.txt' % i).read() )

fulltext.extend( wordlist )

vocablist = createvocablist( doclist ) # 詞集

trainingset = range(50) # 初始化乙個長度為50 的訓練列表

testset =

# 隨機構建訓練集

for i in range(10):

randindex = int( random.uniform(0, len(trainingset)) ) # 隨機10個下標

del( trainingset[randindex] ) # 將這些下標資料從訓練列表中刪除

trainmat = ; trainclasses =

for docindex in trainingset:

p0v, p1v, pspam = trainnb0( array(trainmat), array(trainclasses) )

errorcount = 0

for docindex in testset:

wordvector = setofwordsvec( vocablist, doclist[docindex] )

if classifynb( array(wordvector), p0v, p1v, pspam ) != classlist[docindex]:

errorcount += 1

print 'the error rate is: ', float(errorcount) / len(testset)

def testingnb():

listoposts, listclasses = loaddataset()

myvocablist = createvocablist( listoposts ) # 所有不重複詞條列表

trainmat =

for postingdoc in listoposts:

# 先需要得到 侮辱性詞彙概率等資料 p0v, p1v, pab

p0v, p1v, pab = trainnb0( array(trainmat), array(listclasses) )

# 要考慮到對應位置的概率

testentry = [ 'love', 'my', 'dalmation' ]

thisdoc = array( setofwordsvec( myvocablist, testentry ) )

print testentry, 'classified as : ', classifynb( thisdoc, p0v, p1v, pab )

testentry = [ 'stupid', 'garbage' ]

thisdoc = array( setofwordsvec(myvocablist, testentry) )

print testentry, 'classified as : ', classifynb( thisdoc, p0v, p1v, pab )

if __name__=="__main__":

spamtest()

樸素貝葉斯

樸素貝葉斯演算法是一種基於概率統計的分類方法,它主要利用貝葉斯公式對樣本事件求概率,通過概率進行分類。以下先對貝葉斯公式做個了解。對於事件a b,若p b 0,則事件a在事件b發生的條件下發生的概率為 p a b p a b p b 將條件概率稍作轉化即可得到貝葉斯公式如下 p a b p b a ...

樸素貝葉斯

1.準備資料 從文字中構建詞向量 2.訓練演算法 從詞向量計算概率 3.測試演算法 儲存為 bayes.py 檔案 參考 coding utf 8 from numpy import 文字轉化為詞向量 def loaddataset postinglist my dog has flea probl...

樸素貝葉斯

機器學習是將資料轉化為決策面的過程 scikit learn縮寫為sklearn 訓練乙個分類器,學習之後 其處理的準確性 def nbaccuracy features train,labels train,features test,labels test from sklearn.bayes ...