• 数据分析、数据挖掘之文档过滤、垃圾邮件


    总结:
     模型:  {
                good:{
                        word1:count1,word2:count2,word3:count3,...,wordN:countN
                   }
              }
              二维表good word1 word2 ... wordN
     
    数据的处理:过滤掉stop词,选取长度在3-20间的,不能选取10%-50%间的热门词
    算法的思想
                   贝叶斯分类(各个词之间是相互独立的):在列的维度上,根据(某个分类出现word的文档数)/(某个分类的文档数)来计算概率P(Word|Category),然后对文章中词的P(Word|Category)相乘求得Pr(Document|Category),由贝叶斯公式得Pr(Catetory|Document)=Pr(Document|Category)*P(Category)/P(Document)而P(Document)固定,所以Pr(Catetory|Document)=Pr(Document|Category)*P(Category),其中P(Category)是所有文档中出现此分类的概率
                   费舍尔方法:根据(某个分类出现word的文档数)/(出现word的文档数)来计算概率P(Category|Word),如果假设在未来收到的各种分类文档是相当的,则效果会更好,因为他能够用更有效的利用每个特征;但是当分类不均匀时,效果较差。
                             然后进行归一化处理,用P(Word|Category1)/(P(Word|Category1)+...+P(Word|CategoryN))来计算P(Word|Category1);同时一篇文章中的各个word不是相互独立的(这么做的好处在于可以复用前面计算P(Word|Category)的方法,因为分子的分母和分母的分母是一样的,最后化简得到P(Word&Category)/P(Word in all Category)
                             然后将文档中的热门词的P(Category|Word)相乘,对乘积取对数,然后乘以(-2),当概率相互独立且随机分布时,将满足对数卡方分布(chi-squared distribution),将得到的数传给倒置对数卡方函数,求得P(Category|Document)
     
    解决在训练集特别小时,出现次数少词的敏感问题:
              在当前特征极为有限时,根据假设来做出判断,推荐值为0.5,同时还需给定一个权重,权重为2代表此权重与2个单词相当,在遇到一个新的词时,其条件概率为(1*1+2*0.5)/(1+2)
     
    过滤的阀值:
              为了更好的对结果进行筛选,定义一个阀值,当概率超过阀值时才将其归为某一类
     
    程序中的结构:
              两个结构:dict{f,{c,num}} dict{c,num}
     
    对数卡方函数:
              
    def invchi2(chi,df) #chi为对数*-2,df为文档中word的总数
      m=chi/2.0
      sum=term=math.exp(-m)
      for i in range(1, df//2)
        term *= m/i
        sum += term
      return min(sum,1.0)
     

    1.应用:垃圾邮件过滤

     
    2.数据准备(文档和单词):
         分类器需要根据某些特征对不同的内容进行分类,这里的内容即是文档,特征就是单词
         特征必须具备足够的普遍性,即时常出现,但又没有普遍性,理论上整篇文章的单词可以作为特征,但是除非我们收到内容相同的邮件,否则这样做是没有意义的,简单的提取做法:a.分割文章,取长度在3-20间的词,b.搜集所有在a中的词
     
    3.模型构建(对分类器进行训练):
         i.对已经分组的文档机器特征单词,计算每个单词在Good,bad分类中出现的次数cf,每个分类出现的总次数cc
     
         ii.计算概率:
              根据一个单词在一个分类中出现的总次数/分类包含内容项的总次数,计算Pr(word|classfication),即给定一个分类,某个单词的出现概率
     
              问题:如果训练集特别小,那些极少出现的单词会变得异常敏感
              解决方案:在当前特征极为有限时,根据假设来做出判断,推荐值为0.5,同时还需给定一个权重,权重为2代表此权重与2个单词相当,在遇到一个新的词时,其条件概率为(1*1+2*0.5)/(1+2)
     
         iii.朴素贝叶斯分类器:一旦得到单词在一篇属于某个分类的文档中出现的概率后,就需要对各个单词的概率进行组合:
              i.定义:假设将要被组合的各个概率是彼此独立的,一个单词在属于某一指定分类的文档中出现的概率,与其他单词在属于某一指定分类的文档中出现的概率是不相关的
              ii.公式:则整篇文章的概率为其特征单词,在某一指定分类文档中出现概率的乘积,得到Pr(Document|Category),由Pr(Document|Category)计算Pr(Catetory|Document)=Pr(Document|Category)*P(Category)/P(Document)
              公式中P(Document)对于一篇文章来说是固定的,所以可以简化去掉最后得到Pr(Catetory|Document)=Pr(Document|Category)*P(Category),其中P(Category)是所有文档中出现此分类的概率
     
              iii.分类的选择:
                   为了避免将普通邮件当成垃圾邮件被处理掉,可以为每个分类定义一个阀值,对于即将划入某一分类的邮件而言,其概率与针对其他所有分类的概率相比,必须大于某一指定的倍数阀值才行
             
    4.模型改进(费舍尔方法:针对特征的分类概率):
         i.根据贝叶斯分类器,将所有的Pr(feature|category)组合起来,可以得到当一篇文档中出现某个特证时,该文档属于某个分类的可能性
              Pr(category|feature)=(具有指定特征的属于某分类的文档数)/具有指定特征的文档总数
         
         如果假设”未来将会收到的文档在各个分类中的数量是相当的“,方法将会有更好的表现:
              进行归一化处理:
                   a.属于某个分类的概率
                   b.属于所有分类的概率之和
                   c.a/b得到的值作为Pr(category|feature)
     
         ii.组合特征概率:
         费舍尔方法:所有概率相乘,然后取自然对数,在将结果乘以-2
     
         iii.对内容项进行分类
         通过指定一种分类的下限来为费舍尔方法返回值分类,如bad为0.6,则低于此值且在bad分类中的邮件划分到”未知“类中
     
    5.对特征监测的改进:
         
  • 相关阅读:
    for,while循环嵌套二次练习
    break语句;continue语句
    实际运用for、while循环嵌套
    for,while循环嵌套
    while循环
    if语法分支
    js读取cookie,并利用encrypt和decrypt加密和解密方法
    instance of的java用法
    objectmapper使用
    日志组件slf4j介绍及配置详解
  • 原文地址:https://www.cnblogs.com/uttu/p/6258784.html
Copyright © 2020-2023  润新知