【實(shí)現(xiàn)】利用樸素貝葉斯進(jìn)行郵件分類

利用基于概率論的貝葉斯分類器酪惭,對收取的郵件【英文】進(jìn)行分類氯哮。【簡易版】

文本分類待續(xù)

1. 收集數(shù)據(jù)

收集的數(shù)據(jù)包含兩類:垃圾郵件和正常郵件躏敢。每類中有25個(gè)樣本闷愤。

數(shù)據(jù)集分類


郵件內(nèi)容

2. 數(shù)據(jù)處理

1)要從文本中獲取特征,需要拆分文本件余,分成詞條讥脐。

2)獲取數(shù)據(jù)字典

3)向量化處理,方便進(jìn)行特征提取啼器。

2.1 分詞

def textParse(bigString):

? ? import re

? ? listOfTokens = re.split(r'\W*',bigString)

? ? return [tok.lower() for tok in listOfTokens if len(tok)>2]#取出掉長度過短的單詞

\W: 非單詞字符

2.2 獲取數(shù)據(jù)字典

def createVocabList(dataSet):

? ? vocabSet = set()

? ? for doc in dataSet:

? ? ? ? vocabSet = vocabSet | set(doc)

? ? return list(vocabSet)

vocabSet | set(doc):相當(dāng)于概率論中集合之間的并運(yùn)算旬渠。

集合特點(diǎn):無序;唯一镀首。

2.3 向量化處理

向量化處理又分為兩種情況:

1)詞集模型:詞集坟漱,顧名思義,就是一個(gè)集合更哄。只關(guān)注token是否出現(xiàn)芋齿,并不關(guān)注出現(xiàn)的次數(shù)。

2)詞袋模型:關(guān)注token的出現(xiàn)次數(shù)成翩,有較好的處理結(jié)果觅捆。

詞集模型:

def setOfWords2Vec(vocabList, inputSet):

? ? returnVec = [0]*len(vocabList)

? ? for word in inputSet:

? ? ? ? if word in vocabList:

? ? ? ? ? ? returnVec[vocabList.index(word)] = 1

? ? return returnVec

詞袋模型:

def bagOfWords2VecMN(vocabList, inputList):

? ? returnVec = [0]*len(vocabList)

? ? for word in inputList:

? ? ? ? if word in vocabList:

? ? ? ? ? ? returnVec[vocabList.index(word)] += 1

? ? return returnVec

3. 訓(xùn)練模型

樸素貝葉斯是基于概率的分類器,其訓(xùn)練過程就是計(jì)算各個(gè)概率的過程麻敌。

def trainNB0(trainMatrix, trainCategory):

? ? numTrainDocs = len(trainMatrix)

? ? numWords = len(trainMatrix[0])

? ? pAbusive = sum(trainCategory)/float(len(trainCategory))

? ? p0Sum = ones(numWords); p1Sum = ones(numWords)#0概率處理

? ? p0Denom = 2.0; p1Denom = 2.0

? ? for i in range(numTrainDocs):

? ? ? ? if trainCategory[i] == 1:

? ? ? ? ? ? p1Sum += trainMatrix[i]

? ? ? ? ? ? p1Denom += sum(trainMatrix[i])#sum(trainMatrix[i]):文章i的詞匯數(shù)

? ? ? ? else:

? ? ? ? ? ? p0Sum += trainMatrix[i]

? ? ? ? ? ? p0Denom += sum(trainMatrix[i])

? ? p1Vec = log(p1Sum/float(p1Denom))#下溢出處理

? ??p0Vec = log(p0Sum/float(p0Denom))? ?

????return p1Vec, p0Vec, pAbusive

使用numpy.array來計(jì)算栅炒,方便、快捷术羔。

4.測試分類器

基本分類器:

def classifyNB(vec2Classify, p1Vec, p0Vec, pAbusive):

? ? p1 = sum(vec2Classify * p1Vec) + log(pAbusive)

? ? p0 = sum(vec2Classify * p0Vec) + log(1-pAbusive)

? ? if p1 > p0:

? ? ? ? return 1

? ? else:

? ? ? ? return 0

垃圾郵件測試程序:

def spamTest():

? ? docList = []; classList = []

? ? for i in range(1,26):

? ? ? ? bigString = open('email/spam/%d.txt' % i).read()#讀取郵件內(nèi)容

? ? ? ? wordList = textParse(bigString)

? ? ? ? docList.append(wordList)

? ? ? ? classList.append(1)

? ? ? ? bigString = open('email/ham/%d.txt' %i).read()

? ? ? ? wordList = textParse(bigString)

? ? ? ? docList.append(wordList)

? ? ? ? classList.append(0)

? ? vocabList = createVocabList(docList)

? ? #劃分訓(xùn)練集和測試集

? ? trainSet = range(50); testSet = []#存儲下標(biāo)

? ? for i in range(10):

? ? ? ? randIndex = int(random.uniform(0,len(trainSet)))#產(chǎn)生一個(gè)隨機(jī)數(shù)

? ? ? ? testSet.append(trainSet[randIndex])

? ? ? ? del trainSet[randIndex]

? ? trainMat = []; trainClasses = []

? ? for docIndex in trainSet:

? ? ? ? trainMat.append(setOfWords2Vec(vocabList,docList[docIndex]))

? ? ? ? trainClasses.append(classList[docIndex])

? ? p1Vec, p0Vec, pSpam = trainNB0(trainMat,trainClasses)

? ? errorCount = 0

? ? for docIndex in testSet:

? ? ? ? wordVec = setOfWords2Vec(vocabList,docList[docIndex])

? ? ? ? predict = classifyNB(wordVec,p1Vec,p0Vec,pSpam)

? ? ? ? if predict != classList[docIndex]:

? ? ? ? ? ? errorCount += 1

? ? errorRate = float(errorCount)/len(testSet)

? ? print ("the error rate is %f" % errorRate)

? ? return errorRate

使用誤分率作為衡量分類器的數(shù)據(jù)指標(biāo)赢赊。

由于測試集的生成是隨機(jī)的,所以分類器誤分率每次運(yùn)行結(jié)果不一致级历。通過運(yùn)行10次的平均值作為分類器的分類效果释移。

運(yùn)行結(jié)果

5. 小結(jié)

1)貝葉斯概率及貝葉斯 準(zhǔn)則提供了一種利用已知值來估計(jì)位置概率的有效方法;

2)樸素貝葉斯假設(shè):數(shù)據(jù)特征之間相互獨(dú)立寥殖。雖然該假設(shè)一般情況下玩讳,并不滿足涩蜘。但是!盡管不滿足熏纯,使用樸素貝葉斯進(jìn)行分類同诫,仍然取得了很好的效果!U晾健(很氣......)

3)優(yōu)點(diǎn):在數(shù)據(jù)較少的情況下仍然有效误窖,可以處理多類別問題;

4)缺點(diǎn):對輸入數(shù)據(jù)的準(zhǔn)備方式較為敏感往扔;

5)使用數(shù)據(jù)類型:標(biāo)稱型數(shù)據(jù)(就是名詞性數(shù)據(jù))

6)中文文本分類:之前做過一個(gè)大作業(yè)贩猎,就是關(guān)于中文文本分類,100萬新聞?wù)Z料萍膛,10個(gè)類別吭服。

To Be Continued!!!

下午玩去:看看聞名已久的回音壁。

天壇
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝗罗,一起剝皮案震驚了整個(gè)濱河市艇棕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌串塑,老刑警劉巖沼琉,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異桩匪,居然都是意外死亡打瘪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門傻昙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闺骚,“玉大人,你說我怎么就攤上這事妆档∑” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵贾惦,是天一觀的道長胸梆。 經(jīng)常有香客問我,道長须板,這世上最難降的妖魔是什么碰镜? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮习瑰,結(jié)果婚禮上绪颖,老公的妹妹穿的比我還像新娘。我一直安慰自己杰刽,他們只是感情好菠发,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贺嫂,像睡著了一般滓鸠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上第喳,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天糜俗,我揣著相機(jī)與錄音,去河邊找鬼曲饱。 笑死悠抹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扩淀。 我是一名探鬼主播楔敌,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驻谆!你這毒婦竟也來了卵凑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤胜臊,失蹤者是張志新(化名)和其女友劉穎勺卢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體象对,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黑忱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勒魔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甫煞。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沥邻,靈堂內(nèi)的尸體忽然破棺而出危虱,到底是詐尸還是另有隱情,我是刑警寧澤唐全,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布埃跷,位于F島的核電站,受9級特大地震影響邮利,放射性物質(zhì)發(fā)生泄漏弥雹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一延届、第九天 我趴在偏房一處隱蔽的房頂上張望剪勿。 院中可真熱鬧,春花似錦方庭、人聲如沸厕吉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽头朱。三九已至运悲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間项钮,已是汗流浹背班眯。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烁巫,地道東北人署隘。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像亚隙,于是被迫代替她去往敵國和親磁餐。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容