资源简介

简单的邮件分类,使用bayes分类器,100行正常邮件和100行垃圾邮件。

资源截图

代码片段和文件信息

from numpy import *

def textParse(bigString):
    import re
    listOfTokens = re.split(r‘\W*‘ bigString)
    return [tok for tok in listOfTokens if len(tok) > 2]

def createVocabList(dataSet):
    vocabSet = set([])
    for docment in dataSet:
        vocabSet = vocabSet | set(docment)
    return list(vocabSet)

def bagOfWord2Vec(vocabListinputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] += 1
    return returnVec

def trainNB(trainMattrainGategory):##trainMat为所有邮件的矩阵表示,trainCategory为表示邮件类别的向量
    numTrain = len(trainMat) #邮件总数量
    numWords = len(trainMat[0]) #词典长度
    pAbusive = sum(trainGategory)/float(numTrain) #统计垃圾邮件的总个数,然后除以总文档个数(先验概率)
    p0Num = ones(numWords) #将向量初始化为1,表示每个词至少出现1次
    p1Num = ones(numWords)
    p0Denom = 2.0#分母初始化为2
    p1Denom = 2.0
    for i in range(numTrain):
        if trainGategory[i] == 1: #如果是垃圾邮件
            p1Num += trainMat[i] #把属于同一类的文本向量相加,实质是统计某个词条在该类文本中出现频率
            p1Denom += sum(trainMat[i]) #把垃圾邮件向量的所有元素加起来,表示垃圾邮件中的所有词汇
        else:
            p0Num += trainMat[i]
            p0Denom += sum(trainMat[i])
    p1Vec = log(p1Num/p1Denom)  #统计词典中所有词条在垃圾邮件中出现的概率
    p0Vec = log(p0Num/p0Denom) #统计词典中所有词条在正常文邮件中出现的概率
    return p0Vec p1Vec pAbusive
# classfy funtion
def classfy(vec2classfy p0Vec p1Vec pClass1):
    p1 = sum(vec2classfy*p1Vec)+log(pClass1)
    p0 = sum(vec2classfy*p0Vec)+log(1-pClass1)
    if p1 > p0:
        return 1
    else:
        return 0

def testmain():
    docList = [];classList = []
    res = open(‘spam_100.utf8‘ ‘rb‘)
    res1 = open(‘ham_100.utf8‘ ‘rb‘)
    for i in range(100):
        wordList = textParse(res.readline().decode(‘utf-8‘))
        docList.append(wordList)
        classList.append(1)
        wordList = textParse(res1.readline().decode(‘utf-8‘))
        docList.append(wordList)
        classList.append(0)
    vocabList = createVocabList(docList)
# select test data
    tdocList = [];tclassList = []
    res2 = open(‘test.utf8‘ ‘rb‘)
    for i in range(50):
        twordList = textParse(res2.readline().decode(‘utf-8‘))
        tdocList.append(twordList)
        tclassList.append(0)
    for i in range(50):
        twordList = textParse(res2.readline().decode(‘utf-8‘))
        tdocList.append(twordList)
        tclassList.append(1)
    trainMat = [];trainClass = []
    trainSet = range(200);testSet = range(100)
    for docIndex in trainSet:
        trainMat.append(bagOfWord2Vec(vocabList docList[docIndex]))
        trainClass.append(classList[docIndex])
    p0 p1 pSpam=trainNB(array(trainMat) array(trainClass))
    errCount=0
    for docIndex in testSet:
        wordVec = bagOfWord2Vec(vocabList tdocList[docIndex])
        if classfy(array(wordVec) p0 p1 pSpam) != tclassList[docIndex]:
            errCount += 1
            print(“classcification error:“ tdocList[docIndex])

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        740  2018-05-13 20:14  bayes\.idea\bayes.iml

     文件       1053  2018-05-13 19:00  bayes\.idea\modules.xml

     文件      32174  2018-05-13 20:22  bayes\.idea\workspace.xml

     文件       3491  2018-05-02 14:31  bayes\bayes.py

     文件      59489  2018-04-22 20:15  bayes\ham_100.utf8

     文件      44997  2018-04-22 20:15  bayes\spam_100.utf8

     文件      38749  2018-04-22 20:15  bayes\test.utf8

     目录          0  2018-05-13 20:22  bayes\.idea

     目录          0  2018-05-02 14:31  bayes

----------- ---------  ---------- -----  ----

               180693                    9


评论

共有 条评论