王敏 羅婧雯 劉軍 劉沛澤
【摘要】? ? 貝葉斯學(xué)習(xí)是機(jī)器學(xué)習(xí)理論中的重要研究方向。本文主要實(shí)現(xiàn)基于樸素貝葉斯的機(jī)器學(xué)習(xí)實(shí)驗(yàn)教學(xué)設(shè)計(jì),貝葉斯學(xué)習(xí)以貝葉斯法則為基礎(chǔ),通過已了解的數(shù)據(jù)分布的先驗(yàn)知識(shí),結(jié)合樣本訓(xùn)練數(shù)據(jù)來估算出整體數(shù)據(jù)的數(shù)學(xué)模型。貝葉斯學(xué)習(xí)的結(jié)果是獲得一組變量的聯(lián)合概率分布。貝葉斯學(xué)習(xí)由于其用概率的形式來表示不確定知識(shí),故對(duì)不確定形式的問題它有獨(dú)特的描述和計(jì)算優(yōu)勢。而樸素貝葉斯是在屬性獨(dú)立性假設(shè)的條件下進(jìn)行計(jì)算,可以大大減小計(jì)算的復(fù)雜程度。實(shí)驗(yàn)設(shè)計(jì)目的是根據(jù)樸素貝葉斯公式實(shí)現(xiàn)對(duì)文檔的分類,給學(xué)生提供一種實(shí)驗(yàn)教學(xué)案例。
【關(guān)鍵詞】? ? 樸素貝葉斯? ? 實(shí)驗(yàn)教學(xué)設(shè)計(jì)? ? 文本分類
一、實(shí)驗(yàn)研究背景與目的
本實(shí)驗(yàn)設(shè)計(jì)主要基于樸素貝葉斯理論,目前是為學(xué)生提供基于貝葉斯理論的實(shí)驗(yàn)項(xiàng)目,讓學(xué)生更好地理解該理論解決實(shí)際問題。 隨著互聯(lián)網(wǎng)的飛速發(fā)展, 海量數(shù)據(jù)注入到通訊設(shè)備中。如此大量的信息就讓信息檢索和數(shù)據(jù)挖掘的重要性更加突出。文本分類作為數(shù)據(jù)挖掘的一部分也逐漸被人們重視起來。其中文本分類的主要內(nèi)容是在預(yù)先給定的類標(biāo)簽的集下, 根據(jù)文章內(nèi)容, 確定它的類別。我們接下來將要通過三個(gè)方面來介紹:文本表示, 分類器構(gòu)造和分類器評(píng)估。
二、實(shí)驗(yàn)設(shè)計(jì)思路
本實(shí)驗(yàn)的思路是把一部分含有女性、體育、文學(xué)出版、校園的話題用網(wǎng)絡(luò)爬蟲爬下來存在特定的文檔中,然后通過樸素貝葉斯分類算法實(shí)現(xiàn)貝葉斯分類。
三、方案設(shè)計(jì)
系統(tǒng)設(shè)計(jì)流程框圖如下。
四、具體算法描述
除去噪聲,如格式轉(zhuǎn)換,去掉符號(hào),整體規(guī)范化;遍歷的讀取一個(gè)文件下的每個(gè)文本。操作如下。
def readFile(path):
with open(path, 'r', errors='ignore') as file:
content = file.read()
return content
def saveFile(path, result):
with open(path, 'w', errors='ignore') as file:
file.write(result)
4.1 jieba分詞
1)首先利用import調(diào)用jieba模塊、TF-IDF分詞模塊、樸素貝葉斯算法模塊;
import jieba
2)jieba分詞算法的基本原理是:1.基于前綴詞典實(shí)現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無環(huán)圖(DAG); 2.采用動(dòng)態(tài)規(guī)劃查找最大概率路徑,找出基于詞頻的最大切分組合; 3.對(duì)于未登錄詞,采用了基于漢字成詞能力的HMM模型,使用了Viterbi算法;
代碼如下:
def segText(inputPath, resultPath):
fatherLists = os.listdir(inputPath)
for eachDir in fatherLists:
eachPath = inputPath + eachDir + "/"? ? ? ? ? each_resultPath = resultPath + eachDir + "/"
if not os.path.exists(each_resultPath):
os.makedirs(each_resultPath)
childLists = os.listdir(eachPath)
for eachFile in childLists:
eachPathFile = eachPath + eachFile
#? print(eachFile)
content = readFile(eachPathFile)
# content = str(content)
result = (str(content)).replace("\r\n", "").strip()
# result = content.replace("\r\n","").strip()
cutResult = jieba.cut(result)
saveFile(each_resultPath + eachFile, " ".join(cutResult))
4.2 TF-IDF逆文本頻率指數(shù)
1)首先調(diào)用TF-IDF向量轉(zhuǎn)換類和向量生成類。
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
2)TF-IDF逆文本頻率指數(shù)是一種用于信息檢索與數(shù)據(jù)挖掘的常用加權(quán)技術(shù)。是一種統(tǒng)計(jì)方法,用以評(píng)估一個(gè)詞對(duì)于一個(gè)語料庫中一份文件的重要程度。詞的重要性隨著在文件中出現(xiàn)的次數(shù)正比增加,同時(shí)隨著它在語料庫其他文件中出現(xiàn)的頻率反比下降。
3)TF-IDF詞頻算法實(shí)現(xiàn)。一個(gè)詞在某一文檔中出現(xiàn)次數(shù)比較多,其他文檔沒有出現(xiàn),說明該詞對(duì)該文檔分類很重要。然而如果其他文檔也出現(xiàn)比較多,說明該詞的區(qū)分性不大,就用IDF來降低該詞的權(quán)重。
TF-IDF=TF×IDF
其中,詞頻:TF=詞在文檔中出現(xiàn)的次數(shù)/文檔中總詞數(shù);
逆文本頻率:IDF=log(語料庫中文檔總數(shù)/包含該詞的文檔數(shù)+1)。
def getTFIDFMat(inputPath, stopWordList, outputPath):
bunch = readBunch(inputPath)
tfidfspace = Bunch(target_name=bunch.target_name,label=bunch.label, filenames=bunch.filenames, tdm=[],
vocabulary={})
vectorizer = TfidfVectorizer(stop_words=stopWordList, sublinear_tf=True, max_df=0.5)
transformer = TfidfTransformer()
tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)
tfidfspace.vocabulary = vectorizer.vocabulary_
writeBunch(outputPath, tfidfspace)
4.3樸素貝葉斯分類法
1)首先調(diào)用貝葉斯分類法算法模塊,這個(gè)模塊是調(diào)用已有的別人寫好的算法,下面會(huì)詳細(xì)介紹原理過程。
from sklearn.naive_bayes import MultinomialNB
2)樸素貝葉斯原理
樸素貝葉斯分類器采用了“屬性條件獨(dú)立性假設(shè)” 對(duì)已知類別假設(shè)所有屬性相互獨(dú)立。換言之,假設(shè)每個(gè)屬性獨(dú)立地對(duì)分類結(jié)果發(fā)生影響。故貝葉斯公式可以重寫為
因?yàn)榻o定樣本P(x)為已知的,故貝葉斯準(zhǔn)則就可以轉(zhuǎn)化為
顯然,樸素貝葉斯分類器的訓(xùn)練過程就是基于訓(xùn)練集 D 來估計(jì)類先驗(yàn)概率P(c),并為每個(gè)屬性估計(jì)條件概率。
令Dc表示訓(xùn)練集D中第c類樣本組成的集合,若有充足的獨(dú)立同分布樣本則可容易地估計(jì)出類先驗(yàn)概率。
對(duì)離散屬性而言,令表示Dc中在第i個(gè)屬性上取值為的樣本組成的集合,則條件概率可估計(jì)為
程序如下:
def bayesAlgorithm(trainPath, testPath):
trainSet = readBunch(trainPath)
testSet = readBunch(testPath)
clf = MultinomialNB(alpha=0.001).fit(trainSet.tdm, trainSet.label)
#alpha:0.001 alpha 越小,迭代次數(shù)越多,精度越高
#print(shape(trainSet.tdm))? #輸出單詞矩陣的類型
#print(shape(testSet.tdm))
predicted = clf.predict(testSet.tdm)
total = len(predicted)
rate = 0
for flabel, fileName, expct_cate in zip(testSet.label, testSet.filenames, predicted):
if flabel != expct_cate:
rate += 1
print(fileName, ":實(shí)際類別:", flabel, "-->預(yù)測類別:", expct_cate)
print("erroe rate:", float(rate) * 100 / float(total), "%")
五、系統(tǒng)測試情況
下圖中data文件夾中是原始數(shù)據(jù),result文件夾是jieba分詞結(jié)果,stop是文本預(yù)處理篩掉的的停用詞。test是測試數(shù)據(jù),test_segResult是測試結(jié)果。
其中測試數(shù)據(jù)集:女性話題有38個(gè),體育話題115個(gè),文學(xué)出版話題31個(gè),校園話題16個(gè),以下是測試出錯(cuò)的結(jié)果。其中校園話題出錯(cuò)的概率最大。
六、小結(jié)
此程序簡單易懂,是在貝葉斯的基礎(chǔ)上進(jìn)一步了解了樸素貝葉斯公式的原理及其運(yùn)用,介紹了jieba分詞和TF-IDF逆文本頻率指數(shù)及其應(yīng)用,在實(shí)際案例中錯(cuò)誤率僅為0.570,準(zhǔn)確率較高,可以在實(shí)驗(yàn)課程教學(xué)中使用。
參? 考? 文? 獻(xiàn)
[1]蘇金樹, 張博鋒, 徐昕.基于機(jī)器學(xué)習(xí)的文本分類技術(shù)研究進(jìn)展[J].軟件學(xué)報(bào), 2006, 17 (09) :1848-1859.
[2]李學(xué)明, 李海瑞, 薛亮, 何光軍.基于信息增益與信息熵的TFIDF算法[J].計(jì)算機(jī)工程, 2012, 38 (08) :37-40.
[3]Tom M.Mitchell著;曾華軍等譯,機(jī)器學(xué)習(xí)[M]. 機(jī)械工業(yè)出版社,2003.
[4]陳葉旺,余金山. 一種改進(jìn)的樸素貝葉斯文本分類方法[J].? 華僑大學(xué)學(xué)報(bào)(自然科學(xué)版). 2011(04).