《机器学习实战》-朴素贝叶斯(2)

朴素贝叶斯

通过上次的模型建立,已经可以进行简单的分类,下面将进行另外一个示例的学习—–使用朴素贝叶斯过滤垃圾邮件

1.准备数据:切分文本

1)string.split() 根据空格切分
2)regEx=re.compile(‘\w*’) regEx.split(string) 分隔符为除字母数字以外的任意字符串
3)利用判定字符串长度大于零,去除掉空字符串
4)利用string.lower() 将字符串全部转化成小写

2.测试算法:使用朴素贝叶斯进行交叉验证

def textparse(bigstring):
    listoftokens=re.split(r'\w',bigstring)
    return [tok.lower() for tok in listoftokens if len(tok) > 2]

def spamtest():
    doclist=[];fulltext=[];classlist=[]
    for i in range(1,26):
        wordlist=textparse(open('email/spam/%d.txt' % i).read())
        doclist.append(wordlist)
        # fulltext.attend(wordlist)
        classlist.append(1)
        wordlist = textparse(open('email/ham/%d.txt' % i).read())
        doclist.append(wordlist)
        # fulltext.attend(wordlist)
        classlist.append(0)
    vocablist = createvocablist(doclist)
    trainingset=list(range(50))
    testset=[]
    for i in range(10):
        randindex=int(random.uniform(0,len(trainingset)))
        testset.append(trainingset[randindex])
        del(trainingset[randindex])
    trainmat=[];trainclasses=[]
    for docindex in trainingset:
        trainmat.append(setofwords2vec(vocablist,doclist[docindex]))
        trainclasses.append(classlist[docindex])
        p0v,p1v,pspam=trainNB0(array(trainmat),array(trainclasses))
    error=0
    for docindex in testset:
        wordvector = setofwords2vec(vocablist,doclist[docindex])
        if classifyNB(array(wordvector),p0v,p1v,pspam) != classlist[docindex]:
            error += 1
    print('the erro rate is :',float(error)/len(testset))
最上面函数就是处理文本信息的函数了,也可以被称为文本解析。
spamtest函数就是进行此例的主函数
第一个for循环就是读取数据,将处理后的单词信息放入doclist,类放入classlist,并根据单词
信息生成词汇表
第二个fou循环是建立训练集和测试集的索引号列表,方式为随机抽取10组测试集,剩下为训练集
第三个for循环是根据索引号,逐个将训练集中的数据进行词汇表向量转化,并按顺序建立类向量,
并训练数据
第四个for循环使用测试集进行数据测试,并计算错误率输出。

你可能感兴趣的:(机器学习实战)