#待處理的資料為放在兩個資料夾中的各25個txt文字,文字資訊為電子郵件內容,資料夾spam中的25個郵件都是正常郵件;ham中的25個郵件是垃圾郵件;建立單詞表
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:
(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:
(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()
利用樸素貝葉斯演算法,訓練分類器,採取交叉驗證的方式,結果證明,分類器能夠很好的識別垃圾郵件;
整個示意流程如下:
(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 使用演算法 構建乙個完整的程式對...