樸素貝葉斯 垃圾郵件的識別過濾

2022-03-22 23:48:29 字數 4229 閱讀 7209

#

建立單詞表

defcreatevocablist(dataset):

vocabset = set() #

建立乙個空的集合

for document in

dataset:

vocabset = vocabset | set(document) #

union of the two sets

return

list(vocabset)

deftrainnb0(trainmatrix,traincategory):

numtraindocs = len(trainmatrix) #

訓練矩陣的行數

numwords = len(trainmatrix[0])#

字母表的維度,即訓練矩陣的列數

pabusive = sum(traincategory)/float(numtraindocs) #

先驗資訊

p0num = ones(numwords); p1num = ones(numwords) #

改為 ones()

p0denom = 2.0; p1denom = 2.0 #

改成 2.0

for i in

range(numtraindocs):

if traincategory[i] == 1:

p1num +=trainmatrix[i]

p1denom +=sum(trainmatrix[i])

else

: p0num +=trainmatrix[i]

p0denom +=sum(trainmatrix[i])

p1vect = log(p1num/p1denom) #

改為 log()

p0vect = log(p0num/p0denom) #

改為 log()

return

p0vect,p1vect,pabusive

#返回先驗資訊pabusive,返回確定分類的條件下的每個單詞出現的概率(此時概率為頻率)

defclassifynb(vec2classify, p0vec, p1vec, pclass1):

p1 = sum(vec2classify * p1vec) + log(pclass1) #

此時p1vec為對原始陣列分別取對數之後的矩陣了,利用log(a*b)=sum(log(a)+log(b))再sum求和

#pclass1為先驗概率,此時p1就是最終的概率值。同理p0,根據後驗概率最大準則,判別

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

if p1 >p0:

return 1

else

:

return0#

定義詞袋模型,詞出現幾次算幾次

defbagofwords2vecmn(vocablist, inputset):

returnvec = [0]*len(vocablist) #

初始化矩陣

for word in

inputset:

if word in

vocablist:

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

return

returnvec

def textparse(bigstring): #

input is big string, #output is word list

import

re listoftokens = re.split(r'

\w*'

, bigstring)

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

defspamtest():

""""

文字矩陣化,構建文字矩陣和分類矩陣;

注意:由於有個文字的編碼解碼有問題,我給直接過濾掉了,所以最後矩陣有49行而不是50行

"""doclist=;classlist=;fulltext=

spam_name_lists=["

email/spam/{}.txt

".format(i) for i in range(1,26)]

ham_name_lists=["

email/ham/{}.txt

".format(i) for i in range(1,26)]

for spam_name_list in

spam_name_lists:

with open(spam_name_list) as f:

try:

a=textparse(f.read())

fulltext.extend(doclist)

except

exception as e:

print

(e)

pass

for ham_name_list in

ham_name_lists:

with open(ham_name_list) as f:

try:

a=textparse(f.read())

fulltext.extend(doclist)

except

exception as e:

print

(e)

pass

vocablist = createvocablist(doclist) #

建立詞彙表

trainingset=list(range(49));testset= #

隨機的構建測試集和訓練集,留存交叉驗證的方法

for i in range(10): #

測試集大小為10,訓練集大小為49-10=39

randindex=int(random.uniform(0,len(trainingset)))

trainingset.pop(randindex)

trainmat=; trainclasses =

for docindex in

trainingset:

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

errorcount =0

for docindex in testset: #

classify the remaining items

wordvector =bagofwords2vecmn(vocablist, doclist[docindex])

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__':

spamtest()

待處理的資料為放在兩個資料夾中的各25個txt文字,文字資訊為電子郵件內容,資料夾spam中的25個郵件都是正常郵件;ham中的25個郵件是垃圾郵件;

利用樸素貝葉斯演算法,訓練分類器,採取交叉驗證的方式,結果證明,分類器能夠很好的識別垃圾郵件;

整個示意流程如下:

(1)文字處理(讀取文字,分詞)——>

(2)根據分好詞的文字資料建立詞彙表(函式createvocablist【引數為文字資料】),矩陣化(函式bagofwords2vecmn,【引數為詞彙表、待處理的「文字資料」】)——>

(3)拆分資料為訓練集、測試集——>

(4)訓練分類器——>

(5)測試分類器——>end

02 樸素貝葉斯 垃圾郵件分類

需求說明 chinesespam.xlsx為郵件資料集,stopwords.txt為停用詞資料集 根據現有資料集,採用jieba進行分詞切分,並通過sklearn進行特徵處理 由於樣本特徵是二元離散值或者很稀疏的多元離散值,採用先驗為伯努利分布的樸素貝葉斯進行分類 one host編碼,將所有的詞轉...

樸素貝葉斯演算法在垃圾郵件過濾中的應用

由於最近在寫一篇關於大資料分類的 吐槽一下 導師天天催 所以在圖書館借了幾本有關大資料的書籍。今天看 new internet 大資料探勘 感興趣的可以看一下 中提到垃圾郵件過濾,讓我聯想到昨天在1280社群看到一道名企面試題,在遊戲實時交流中,怎麼過濾那些廣告?當時想到的是關鍵詞過濾,也沒細想。其...

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

一 步驟 1 收集資料 提供文字檔案。2 準備資料 將文字檔案解析成詞條向量。3 分析資料 檢查詞條確保解析的正確性。4 訓練演算法 使用我們之前建立的trainnb0 函式。5 測試演算法 使用classifynb 並且構建乙個新的測試函式來計算文件集的錯誤率。6 使用演算法 構建乙個完整的程式對...