【数据挖掘】文档分类之朴素贝叶斯算法

来源:互联网 发布:dreamweaver做淘宝分类 编辑:程序博客网 时间:2024/04/30 07:17
#!/usr/bin/pythonimport reimport mathdef getwords(doc):    splitter=re.compile('\\W*')      # Split the words by non-alpha characters    words=[s.lower() for s in splitter.split(doc) if len(s)>2 and len(s)<20]    return dict([(w,1) for w in words])#分类器使用demo,训练分类器,其中Nobody owns the water为features,good为catdef sampletrain(cl):    cl.train('Nobody owns the water.','good')    cl.train('the quick rabbit jumps fences','good')    cl.train('buy pharmaceuticals now','bad')    cl.train('make quick money at the online casino','bad')    cl.train('the quick brown fox jumps','good')#构建分类器需要能识别item的特征。class classifier:    def __init__(self,getfeatrues,filename=None):        #存储不同特征在不同分类中的次数        self.fc={}        #每个分类被使用多少次的字典        self.cc={}        self.getfeatures=getfeatures    #增加特征在分类中出现的次数    def incf(self,f,cat):        self.fc.setdefault(f,{})        self.fc[f].setdefault(cat,0)        self.fc[f][cat]+=1    #增加分类使用的次数    def incc(self,cat):        self.cc.setdefault(cat,0)        self.cc[cat]+=1    #返回特增出现次数    def fcount(self,f,cat):        if f in self.fc and cat in self.fc[f]:            return float(self.fc[f][cat])        return 0.0    #返回category出现的次数    def catcount(self,cat):        if cat in self.cc:            return float(self.cc[cat])        return 0.0    #item出现次数之和    def totalcount(self):        return sum(self.cc.values())    #返回所有category    def categories(self):        return self.cc.keys()    #本例的feature就是字符串中的单词,cat是对feature的评判    def train(self,item,cat):        features= self.getfeatrues(item)        for f in features:            self.incf(f,cat)        self.incc(cat)    #条件概率        def fprob(self,f,cat):        if self.catcount[cat] == 0:            return 0        return self.fcount(f,cat)/self.catcount(cat)    #带权重的概率计算    #(weight*assumedprob + count*fprob)/(count+weight)    def wieghtprob(self,f,cat,weight=1,ap=0.5,prf):        basicprob=prf(f,cat)        totals=sum(self.fcount(f,c) for c in self.categories())        bp=((weight*ap)+(totals*basicprob))/(weight+totals)        return bp    

#朴素贝叶斯算法class naivebayes(classifier):    #计算整个文档的概率,由独立性,整个文档的概率:所有item的乘积    def docprob(self,item,cat):        features=self.getfeatures(item)        p=1        for f in features: p*=self.weightedprob(f,cat,self.fprob)        return p    def prob(self,item,cat):        catprob = self.catcount(cat)/self.totalcount()        docprob=self.docprob(item,cat)        return catprob*docprob

总结:

    1)基于sample训练分类器

    2)计算item的条件概率

    3)基于贝叶斯理论,计算doc的条件概率