精华内容
下载资源
问答
  • 贝叶斯文本分类

    2018-04-20 10:40:35
    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类 而朴素朴素贝叶斯分类贝叶斯分类中最简单,也是常见的一种分类方法 分类问题综述 对于分类问题,其实谁都不会陌生,...

     

                                                         朴素贝叶斯分类

     

    贝叶斯分类

    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类
    
    而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法
    

    分类问题综述

    对于分类问题,其实谁都不会陌生,日常生活中我们每天都进行着分类过程。
    
    例如,当你看到一个人,你的脑子下意识判断他是学生还是社会上的人;
    
    你可能经常会走在路上对身旁的朋友说“这个人一看就很有钱”之类的话,其实这就是一种分类操作
    

    分类的描述

    从数学角度来说,分类问题可做如下定义:已知集合和,C= y1,y2...yn 和I=x1,x2...xn
    
    确定映射规则y = f(x),使得任意xi有且仅有一个yi,使得成立 y=f(x)成立
    
    其中C叫做类别集合,其中每一个元素是一个类别,而I叫做项集合(特征集合),其中每一个元
    
    素是一个待分类项,f叫做分类器。分类算法的任务就是构造分类器f。
    
    分类算法的内容是要求给定特征,让我们得出类别,这也是所有分类问题的关键
    

    朴素贝叶斯分类

    贝叶斯公式

    换个表达形式

    我们要解决的问题是: 在特定特征条件下属于某个类别的概率有多少

    例题分析

    给定的数据如下:

    现在给我们的问题是,如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?

    转为数学问题就是比较p(嫁|(不帅、性格不好、身高矮、不上进))与p(不嫁|(不帅、性格不好、身高矮、不上进))的概率,谁的概率大,我就能给出嫁或者不嫁的答案!

    套用朴素贝叶斯公式


    朴素贝叶斯算法的朴素一词解释

    那么我只要求得
    
    p(不帅、性格不好、身高矮、不上进|嫁)
    
    p(不帅、性格不好、身高矮、不上进)
    
    p(嫁)
    
    下面我分别求出这几个概率,就得到最终结果。
    
    假设 p(不帅、性格不好、身高矮、不上进|嫁) 
    
       = p(不帅|嫁)*p(性格不好|嫁)*p(身高矮|嫁)*p(不上进|嫁)
    
    
    这也就是为什么朴素贝叶斯分类有朴素一词的来源,朴素贝叶斯算法是假设各个特征之间相互独
    
    立,那么这个等式就成立了!
    
    这一假设使得朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。
    
    
    我们将上面公式整理一下如下:
    


    我们的任务是要求出特定特征下是嫁|不嫁 那个概率更大,对比两个公式分母相同,那只需要计算两个情况的分子

    p(嫁)=?

    首先我们整理训练数据中,嫁的样本数如下:

    则 p(嫁) = 6/12(总样本数) = 1/2

    p(性格不好|嫁)= ?统计满足样本数如下:

    p(性格不好|嫁)=1/6

    p(矮|嫁) = ?统计满足样本数如下:

    则p(矮|嫁) = 1/6

    p(不上进|嫁) = ?统计满足样本数如下:

    则p(不上进|嫁) = 1/6

    = (1/2)(1/6)(1/6)(1/6)(1/2)/分母相同

    同样原理 计算下p(不嫁|不帅,性格不好,身高矮,不上进)

    p (嫁|不帅、性格不好、身高矮、不上进)
    =(1/2)*(1/6)*(1/6)*(1/6)*(1/2)/分母
    =(1/144)/分母 
    
    p (不嫁|不帅、性格不好、身高矮、不上进)
    
    = ((1/6*1/2*1*1/2)*1/2)/分母
    = (1/24)/分母 
    
    
    于是有p (不嫁|不帅、性格不好、身高矮、不上进)>p (嫁|不帅、性格不好、身高矮、不上进)
    

    所以我们根据朴素贝叶斯算法可以给这个女生答案,是不嫁!!!!


    以上公式是如何得来的呢

    韦恩图

    韦恩图

    如上面的韦恩图,我们用矩形表示一个样本空间,代表随机事件发生的一切可能结果。
    
    的在统计学中,我们用符号P表示概率,A事件发生的概率表示为P(A)
    
    A事件与B事件同时发生的概率表示为P(A∩B),或简写为P(AB)即两个圆圈重叠的部分。
    
    A或者B至少有一个发生的概率表示为P(A∪B),即圆圈A与圆圈B覆盖的区域。
    
    在B事件发生的基础上发生A的概率表示为P(A|B),这便是条件概率,图形上 它表示AB重合的面积比上B的面积
    

    统计学基本概念

    • P(A) A事件发生的概率
    • p(AB)或p(A∩B) 事件AB同时发生的概率
    • p(A|B) 事件B发生了情况下发生事件A的概率

    条件概率公式

    由维恩图可知: p(AB) = p(B)p(A|B) = p(A)p(B|A)
    
    P(A|B)=P(AB)/P(B)=p(A)p(B|A)/p(B)
    
    条件概率是理解全概率公式和贝叶斯公式的基础,可以这样来考虑,
    
    如果P(A|B)大于P(A)则表示B的发生使A发生的可能性增大了。
    
    在条件概率中,最本质的变化是样本空间缩小了——由原来的整个样本空间缩小到了给定条件的样本空间
    

    全概率公式

        1.事件组B1,B2,.... 满足 B1,B2....两两互斥,即 Bi ∩ Bj = ∅ ,i≠j , i,j=1,2,....,
        且P(Bi)     >0,i=1,2,....;
    
        2.B1∪B2∪....=Ω ,则称事件组 B1,B2,...是样本空间Ω的一个划分
    
        设 B1,B2,...是样本空间Ω的一个划分,A为任一事件,则:
    
        P(A)=P(AB1)+P(AB2)+....+P(ABn)
    
            =P(A|B1)P(B1)+P(A|B2)P(B2)+...+P(A|Bn)P(PBn)
    
        上式即为全概率公式(formula of total probability)
    
    
        全概率公式的意义在于,当直接计算P(A)较为困难,而P(Bi),P(A|Bi)  (i=1,2,...)的计算较为简单
    
        时,  可以利用全概率公式计算P(A)。
    
        思想就是,将事件A分解成几个小事件,通过求小事件的概率,然后相加从而求得事件A的概率,而将事
    
        件A进行分割的时候,不是直接对A进行分割,而是先找到样本空间Ω的一个个划分B1,B2,...Bn,这样事件
    
        A就被事件AB1,AB2,...ABn
    
        分解成了n部分,即A=AB1+AB2+...+ABn, 每一Bi发生都可能导致A发生相应的概率是P(A|Bi),由加法公式得
    
        P(A)=P(AB1)+P(AB2)+....+P(ABn)
    
            =P(A|B1)P(B1)+P(A|B2)P(B2)+...+P(A|Bn)P(Bn)
    

    事件A在事件B(发生)的条件下的概率,与事件B在事件A的条件下的概率是不一样的;然而,这两者

    是有确定的关系,贝叶斯定理就是这种关系的陈述

     

    这个公式本身平平无奇,无非就是条件概率的定义加上全概率公式一起作出的一个推导而已。但它所表达的意义却非常深刻。
    
    全概率公式就是一个“原因推结果”的过程
    
    但贝叶斯公式却恰恰相反,研究造成结果发生的原因 是XX原因造成的可能性有多大,即“结果推原因”。
    

    实例1

    发报台分别以概率0.6和0.4发出信号“∪”和“—”。由于通信系统受到干扰,当发出信号“∪”时,
    
    收报台分别以概率0.8和0.2受到信号“∪”和“—”;又当发出信号“—”时,收报台分别以概率0.9和0.1收到信号“—”和“∪”。
    
    求当收报台收到信号“∪”时,发报台确系发出“∪”的概率。
    
    
    p(发出U|收到U) = p(发出u) * P(收到U|发出U) / p(真实发出U)*p(收到u|真实发出u) + p(假发出U)* p(收到u|假发出u
    
    ==> 0.6*0.8 / (0.6*0.8 + 0.1*0.4) =0.923
    

    实例2

    一所学校里面有 60% 的男生,40% 的女生。男生总是穿长裤,女生则一半穿长裤一半穿裙子。
    
    假设你走在校园中,迎面走来一个穿长裤的学生(很不幸的是你高度近似,你只看得见他(她)穿的是否长裤,
    
    而无法确定他(她)的性别),你能够推断出他(她)是男生的概率是多大吗?
    
    p(男生|长裤) = p(男生) * p(长裤|男生) / p(长裤)
     = 0.6 * 1 / 0.6*1 + 0.4*0.5 = 0.6/0.8 = 6/8
    

    工程应用推导过程:

    • p(y=ck) = y类别的概率 = y类别出现的次数/总类别数

    • p(xi|y) = xi在y分类中出现的总次数/样本中该分类的次数

    不同模型下的p(xi|y):

    • 高斯模型 当特征是连续变量的时候,运用多项式模型就会导致很多P(xi|yk)=0(不做平滑的情况下),此时即使做平滑,所得到的条件概率也难以描述真实情况。所以处理连续的特征变量,应该采用高斯模型

    • 多项式 当特征是离散的时候,使用多项式模型。多项式模型在计算先验概率P(yk)和条件概率P(xi|yk)时,会做一些平滑处理,具体公式为: P(yk)=Nyk+α / N+kα

      N是总的样本个数,k是总的类别个数,Nyk是类别为yk的样本个数,α是平滑值

      P(xi|yk)=Nyk,xi+α / Nyk+nα

      Nyk是类别为yk的样本个数,n是特征的维数,Nyk,xi是类别为yk的样本中,第i维特征的值是xi的样本个数,α是平滑值

      当α=1时,称作Laplace平滑,当0<α<1时,称作Lidstone平滑,α=0时不做平滑。

      如果不做平滑,当某一维特征的值xi没在训练样本中出现过时,会导致P(xi|yk)=0,从而导致后验概率为0。加上平滑就可以克服这个问题。

    • 伯努利

      与多项式模型一样,伯努利模型适用于离散特征的情况,所不同的是,伯努利模型中每个特征的取值只能是1和0(以文本分类为例,某个单词在文档中出现过,则其特征值为1,否则为0).

      伯努利模型中,条件概率P(xi|yk) 的计算方式是:

      当特征值xi为1时,P(xi|yk)=P(xi=1|yk)

      当特征值xi 为0时,P(xi|yk)=1−P(xi=1|yk)

    数据溢出:

    为防止连续乘法时每个乘数过小,而导致的浮点数溢出(太多很小的数相乘结果为0,或者不能正确分类)
    
    当计算乘积 p(w0|ci) * p(w1|ci) * p(w2|ci)... p(wn|ci) 时,由于大部分因子都非常小,
    
    所以程序会下溢出或者得到不正确的答案。(用 Python 尝试相乘许多很小的数,最后四舍五入后会得到 0)
    
    一种解决办法是对乘积取自然对数。在代数中有 ln(a * b) = ln(a) + ln(b), 
    
    于是通过求对数可以避免下溢出或者浮点数舍入导致的错误。采用自然对数进行处理不会有任何损失
    

    流程

    数据的训练

    • 留出法

      留出法的步骤相对简单,直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试T。在S上训练出模型后,用T来评估测试误差,作为泛化误差的估计。训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外偏差而对最终结果产生影响。

      留出法的一个缺点是,训练集S与测试集T的划分比例不好确定。若令训练集S包含绝大多数样本,则训练出的模型可能更接近与用D训练出的模型,但由于T比较小,评估结果可能不够稳定准确;若令测试集T多包含一些样本,则训练集S与D差别更大了,被评估的模型与用D训练出的模型相比可能有较大差别,从而降低了评估结果的保真性

    • 交叉验证法

      “交叉验证法”先将数据集D划分为k个大小相似的互斥子集。然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集,如下图所示,

    • 自助法

      我们希望评估的是用D训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,

      这必然会引入一些因训练样本规模不同而导致估计偏差。交叉验证法受训练样本规模影响较小,但计算复杂度又太高了。有没有什么办法可以减少

      训练样本规模不同造成的影响,同时还能比较高效进行试验评估呢?

      “自助法”是一个比较好的解决方案。给定包含m个样本的数据集D,我们对它进行采样产生数据集D':每次随机从D中挑选一个样本,并将其拷贝放

      入D'中,然后再将该样本放回数据集D中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行m次后,我们得到了包含m个样本的数据集

      D',这就是我们自助采样的结果。我们将D'作为训练集,将D-D‘(集合减法)作为测试集。

      自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大

      的好处。然而,自助法产生的数据改变了初始数据集的分布,这会引入估计偏差。因此,在初始数据量足够是,留出法和交叉验证法更常用一些。

    评估

    正确率(查准率)

    正确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是对的。那么预测为正
    
    就有两种可能了,一种就是把正类预测为正类,另一种就是把负类预测为正类
    
    正确率 = 提取出的正确信息条数 / 提取出的信息条数    
    

    召回率(查全率)

    召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两
    
    种可能,一种是把原来的正类预测成正类,另一种就是把原来的正类预测为负类
    
    召回率 = 提取出的正确信息条数 /  样本中的正确信息条数
    

    F1

    综合这二者指标的评估指标,用于综合反映整体的指标
    F1 = 正确率 * 召回率 * 2 / (正确率 + 召回率) 
    

    例子

    不妨举这样一个例子:
    
    某池塘有1400条鲤鱼,300只虾,300只鳖,现在以捕鲤鱼为目的
    
    撒一大网,逮着了700条鲤鱼,200只虾,100只鳖。那么,这些指标分别如下:
    
    正确率 = 700 / (700 + 200 + 100) = 70%
    
    召回率 = 700 / 1400 = 50%
    
    F值 = 70% * 50% * 2 / (70% + 50%) = 58.3%
    
    如果把池子里的所有的鲤鱼、虾和鳖都一网打尽,这些指标又有何变化:
    
    正确率 = 1400 / (1400 + 300 + 300) = 70%
    
    召回率 = 1400 / 1400 = 100%
    
    F值 = 70% * 100% * 2 / (70% + 100%) = 82.35%    
    
    由此可见,正确率是评估捕获的成果中目标成果所占得比例;召回率,顾名思义,就是从关注领域中,召回目标类别的比例;
    
    而F值,则是综合这二者指标的评估指标,用于综合反映整体的指标。
    

    准确率就是P = TP/(TP+FP)  大白话就是“你的预测有多少是对的”
    
    召回率就是R = TP/(TP+FN)  大白话就是“正例里你的预测覆盖了多少”
    
    真正例 TP = 700  [我要鱼]
    
    假正例 FP = 300  [我要的是鱼, 你给我别的 都认为是假正例]
    
    假反例 FN = 700  [本来是鱼,却没有当做鱼给我 1400-700] 
    
    真反例 FP = 300  [本来不是鱼,却当成鱼给我 300+300-200-100]
    
    正确率 = TP/TP+FP = 700/(700+300)
    
    召回率 = TP/TP+FN = 700/(700+700)
    

    项目实战 文章自动分类

    • 第一阶段获取样本数据

      爬虫系统在抓取特定的分类的文章已经定义好分类

      目前分类有: 股票/外汇/期货/黄金/基金/科技/数字货币/收藏/保险/P2P/理财/信托/债券/银行/房地产 共有15个分类

      采集的样本共有 5521条数据 其中训练集 4416 测试数据 1105

    • 数据的训练

      测试数据收集方式: 留出法 80% 训练 20% 测试

      准确率: 取前2个 83%左右, 取第一个72%左右

      召回率: -- 暂未开发

      F1: --暂未开发

      样本集: 增量方式 每月拉取一次,增量同步信息,效果评估没问题投入生产上

      训练输出: 每个单词在分类下的概率 P(xi|yj) & 分类概率 P(y)

    • 分类的使用

      入参: [文章内容]

      1.提取关键词

      2.累加P(xi|yj)概率 + P(yj)

      出参: [文章属于所有分类的列表及概率值]

    • 持续优化及问题

      1. 提高样本分类的正确性/数据均匀分布/足够的数量 (很重要前提)

      2. 增加了关键词的权重

      3. stop_word 完善,去掉不相关的词或者词频比较高中性词的

      4. 训练过程中不同长度文章提取不同数量的关键词 <1000 10 tags, 1000~3000 15 tags, >3000 20 tags

      5. 文章内容很少的忽略,不进入训练样本 目前<300字符 忽略

      6. 关键词小写,防止大小写问题不匹配

    • 问题

      1. 在前面提到的防止浮点数连乘 数据溢出 整体取对数 log2(x) x(0,1) 结果是负数, 累加是越来越小

        目前采取的方式是 曲线平移 log2(1+x) 保证数据的正数

    2. 分类过程没有出现的词汇不进行计算 有分不出类别的可能
    
    3. 纯手写没有使用开源框架
    
    4. 目前样本数据噪声比较大 
    

    总结


    • 朴素贝叶斯

      朴素贝叶斯算法是建立在每一个特征值之间时独立的基础上的监督学习分类算法,而这也是称
      
      他为 “朴素”贝叶斯的缘由
      
      贝叶斯公式 + 特征条件独立假设 =  朴素贝叶斯
      
    • 流程 1.准备数据/采集样本

      2.训练数据 计算p(yi)/p(wi|yi) 高斯/伯努利/多项式
      
      3.数据的测试验证 留出法/交叉验证/自助  准确率/召回率/F1
      
      4.使用 简单累加
      
    • 优化

      1.保证样本数据准确和数据分布均匀
      
      2.防止数据溢出 取对数
      
      3.防止概率为0情况 拉普拉斯平滑
      
      4.stop_word 整理
      
      5.英文大小写统一处理
      
      6.不同长度文章提取不同个数个关键词
      

     

    展开全文
  • 朴素贝叶斯 文本分类

    热门讨论 2014-06-28 17:59:30
    朴素贝叶斯 文本分类,注释详细,一看就明白,JAVA实现。下载导入即可使用
  • 朴素贝叶斯文本分类算法的java代码 完整版
  • 朴素贝叶斯文本分类的Python实现代码
  • 贝叶斯文本分类

    千次阅读 2014-09-05 22:03:04
    本文完成了基于朴素贝叶斯文本自动分类的软件设计,运用贝叶斯理论阐述了朴素贝叶斯文本分类器的基本原理。在特征独立性假设的基础上,构造了一个朴素贝叶斯文本分类器,通过样本训练该分类器,进而对测试样本分类...
    摘 要
        本文完成了基于朴素贝叶斯文本自动分类的软件设计,运用贝叶斯理论阐述了朴素贝叶斯文本分类器的基本原理。在特征独立性假设的基础上,构造了一个朴素贝叶斯文本分类器,通过样本训练该分类器,进而对测试样本分类判断。实验表明,朴素贝叶斯理论在文本分类中有很好的效果。

    朴素贝叶斯分类算法的原理是贝叶斯公式(见下面的公式)。原理是由果溯因方法。试验表明该算法的性能能和神经网络等数据挖掘算法相媲美。

       文本分类一般分为三个阶段:文本预处理阶段、分类器设计阶段、试验和测试阶段。包含了去停用词、英文分词、算法设计、系统实现等多个模块。

    最后本论文实现了文本分类软件,试验效果优良。完成了课题要求。但是本系统在时间复杂度上面还有进步的空间。

    关键词:朴素贝叶斯;英文分词;文本自动分类;Java;

       资源地址:http://download.csdn.net/detail/b11040805/7871001


    第一章 绪论

    1.1、选题背景及意义
    在个性化推荐无处不在的今天,文本的精确分类成为互联网发展的必然趋势。在新闻系统中,如果精确的给用户推送他感兴趣的新闻,俨然成为了现阶段需要解决的重要课题。与此同时,海量数据成倍增长,更是增加了文本分类的难度。因此,开发准确性和速度高效地本文分类系统很有必要。
    文本分类是指在给定分类体系下,根据文本内容确定文本类别的过程。该技术可以追溯到上世纪60年代。不过,在最近的10年里,由于文本信息数字化而带来的海量数据,,文本信息的自动分类得到了广泛的关注和快速的发展。
    一些研究表明,机器学习技术解决这个问题是较为有效的方法:通过一种广义的诱导学习建立相应的自动分类器,形成预先文档信息的一个或多个特征的分类集合。基于机器学习的分类方式在分类效果和灵活性上都比之前基于知识工程和专家系统(通过某个领域里的专家人为地定义分类器)的文本分类模式有所突破,大量节省了专家人力的投入,可以很方便地用于各种不同的领域。文本分类是一个有指导的学习过程,它根据一个已经被标注的训练文本集合,找到文本属性(特征)和文本类别之间的关系模型(分类器),然后利用这种学习得到的关系模型对新的文本进行类别判定。文本分类一般包括两个步骤:第一步,通过样本训练,利用样本和类别之间的联系,建立一个样本分类函数;第二步,通过样本分类函数,对新文本进行分类。
    目前,文本自动分类算法基本都是基于概率统计模型的,例如贝叶斯分类算法(Naive Bayes,Bayes Network),支持向量机(SVM),最大熵模型(Maximum Entropy Model),K近邻算法(KMM)等等。由于朴素贝叶斯方法的简单高效,其运用很广泛。本文就基于概率模型的朴素贝叶斯分类算法作了一些讨论,并根据理论描述使用Java语言构建了一个朴素朴贝叶斯文本分类器。实验表明,朴素贝叶斯分类器可以取得了优良的分类效果。

    1.2、国内外研究现状
    国外,对本文分类的研究比较早,而且很做出了巨大的贡献。一般情况下,业界将国外的文本分类分成四个阶段。
    第一个阶段:文本自动分类的可行性研究。也就是说,研究人员的主要任务是研究文本分类的可行性,是文本分类的初始阶段。
    第二个阶段:文本自动分类的实验阶段。是初级阶段。
    第三个阶段:文本自动分类的实用化阶段,是发展最迅速的阶段。
    第四个阶段:面向互联网的自动文本分类,成熟阶段。
    在国外,Marone在1961年发表了第一篇关于自动分类的论文,开启了研究文本自动分类的序幕。1975年,Salton提出了向量空间模型,在信息检索、人工人智能和机器学习技术的推动下,文本分类技术在很多的应用领域下取得了不错的成果。如今文本分类在互联网的应用更为广泛,比如邮件自动分类、电子会议等。
    相对于国外,国内的文本自动分类研究起步很晚,这和我国的互联网起步较晚有这密切的联系。从20世纪80年代,才初步开始这方便的研究,国内的文本分类大多借鉴了国外的方法。在前人工作的基础上,中文文本自动分类取得了不菲的成绩。
    但是由于中文文本和外文文本的差别,比如外文有空格,而中文文本没有,所以需要分词。目前,我们国家的中文分词技术也日渐成熟,最大的代表是中科院研发的中文分词技术ICTCLAS。
    根据方法的不同,一般可以将文本自动分类系统可以分成下面两类:第一种,基于知识工程;第二种,基于机器学习。在20实际80年代,文本自动分类系统大都是已经知识工程的,它的思想是根据领域专家对这些给定文档集合的分类习惯和经验,人工提供出逻辑规则,作为计算机自动文本分类的依据。后来90年代,基于机器学习的文本分类方法渐渐受到了重视,尤其是准确度和稳定性方面有了显著的提高。机器学习一般分为两个步骤,学习和训练。
    互联网的发展使得传统的文本分类系统很难适应网络文本信息,因而面向互联网的文本自动分类则成了文本分类的又一研究热点。
    近些年来,对网络内容管理、监控和有害信息过滤的需求随着互联网技术的迅速发展和普及变得越来越大,与此同时网络信息的主观倾向性分类受到越来越多的关注。因而这个时期运用的文本分类方法已经由知识工程方法被取得丰硕成果的统计方法和机器学习的方法所取代。目前,统计学习法是文本分类的主流方法,虽然它也需要人工进行准确分类的文档作为学习的材料,但很多统计学习法都有着坚实的理论基础作支持,并且有着评价标准明确和实际表现良好的优点。
    1.3、论文的主要内容
    本论文的主要内容是基于贝叶斯算法的文本分类器的设计与开发。本文详细的介绍了贝叶斯分类算法的原理和步骤,已经朴素贝叶斯的改进算法。除此之外,本文还对英文文本分类的一般流程做了详细的介绍。最后,使用Java语言实现了文本自动分类系统。
    1.4、全文纵览
    本文第一章介绍了选题的背景和意义以及本课题在国内外的研究现状。第二章详细的介绍了贝叶斯基本原理和公式推导,于此同时还介绍了几种朴素贝叶斯改进的算法。第三章对本文分类的原理步骤和算法做了介绍。第四章完成了软件的设计,用java代码实现了文本自动分类系统。
    1.5、本章小结
    本章介绍了本论文的选题背景和意义,简单的介绍了国内外关于文本自动分类的研究现状。还概括的介绍了本论文的主要内容。
    第二章 贝叶斯分类算法
    2.1、贝叶斯的原理
    2.1.1、条件概率、全概率和贝叶斯公式
    在概率论中,我们将事件A发生的概率记做P(A)。但是有的情况下,我们需要考虑在事件B发生的概率下,事件A发生的概率,这种情况下记做P(A|B)。
     条件概率公式
    设A,B事件是两个事件,且P(B)> 0,那么

    为在事件B发生的情况下,A发生的条件概率。
    在现实生活中,遇到的问题往往不是这么简单的。但是我们可以将复杂的问题划分成若干个简单的问题。
     定义划分
    设随机试验E的样本空间为 是样本空间S的一组事件,如果满足下面两个条件,就称 为样本空间S的一个划分。
    1) 两两互不相容。
    2) 。
     全概率公式
    设随机试验E的样本空间S, 是样本空间S的一个划分,则对于任意事件A,有


    该公式称为全概率公式。该公式的证明非常简单,请自行证明。
    根据条件概率和全概率公式很容易就能推到出贝叶斯公式。
     贝叶斯公式
    设随机试验E的样本空间为S, 是样本S的 一个划分,A是一事件,且 ,则有

    证明:由条件概率和全概率公式推导而来,


    2.1.2、贝叶斯原理
    贝叶斯公式有着很重要的现实意义。比如,现在要判断一个学生是南京仙林大学城那个学校的,设候选的学校为 ,即 是不相容的。我们凭借以往的经验估计出他是各个学校的概率 ,这通常称为先验概率。进一步考虑这个人的专业,比如师范类的专业还是理工类的专业,在专业确定下,他是各个学校的概率 ,这个概率是由贝叶斯公式计算得到的,通常称为是后验概率。根据后验概率,我们就能更准确地判断这个学生的所在学校了。
    上面的例子可以看出一个分类的小问题,从上面的示例中可以看出,贝叶斯分类器的算法的关键是求出先验概率和后验概率。理解贝叶斯其实不难,举个例子来说。在仙林大学城,南邮的男生比例很大,同时南财的女生比例很大。这时,你看见一群女生走在街上,你的判断肯定是她们是南财的概率大。于是你将她们分到了南财那一类。贝叶斯就是根据结果来判断概率的方法。
    2.2、几种贝叶斯算法
    2.2.1、朴素贝叶斯
    朴素贝叶斯(Naive Bayesian Classifier,NBC)是贝叶斯算法中最简单的算法,朴素贝叶斯之所以叫做“朴素”贝叶斯是因为它完全按照贝叶斯计算公式来分类,假设各个属性是条件独立的,互不影响、互不依赖。朴素贝叶斯虽然简单,但是其性能可以达到神经网络,决策树的水平。是文本分类中最常用的算法之一。
    在使用朴素贝叶斯进行分类的时候,需要特别注意,它所选取的特征向量是相互独立的。因为,这里要满足划分定义的第一个条件。在实际应用中,往往达不到这个要求,这些变量之间往往有着连续,因此在进行数据挖掘之前可以进行特征向量的选取。这个条件好像是限制了朴素贝叶斯的使用范围,但是由于特性向量的压缩,减少了计算量,降低了构建贝叶斯网络的复杂性。使得贝叶斯分类器应用到更广的领域中。
    在贝叶斯原理的介绍中,我们已经知道求解贝叶斯分类问题必不可少的步骤是先验概率和后验概率的计算。
    朴素贝叶斯分类模型原理:
    1)每个数据样本用一个n维特征向量 表示,分别描述对n个属性 样本的n个度量。
    2)假定有m个类 ,给定一个未知的数据样本X(即没有类标号),分类法将预测X,属于具有最高后验概率(条件X下)的类。也就是说,朴素贝叶斯分类将未知的样本分类给类 ,当且仅当

    就是求最大的后验概率。根据贝叶斯定量得到:

    3)根据P(X)对于所有类为常数,只需要 最大即可。如果类的先验概率未知,假设这些类是等概率的。先验概率可以用 得到。其中 是类 中的训练样本数,而 是训练样本总数。
    4)计算 ,在计算这个值的时,如果给定具有许多属性的数据集,计算的开销会很大。为了节省开销,可以坐类条件独立的朴素假设。给定样本的类标号,假设该属性值相互独立,即在属性间,不存在依赖关系。这样的话,

    概率 可以由训练样本估值。
    (a)如果 是分类属性,则 ,其中 是在属性 上具有值 的类 的训练样本数,而 是 中的训练样本数。
    (b)如果 是连续属性值,则通过假设该属性服从高斯分布。
    从上面我们可以总结朴素贝叶斯分类的步骤
    1)求每个属性值的先验概率。
    2)求最大后验概率。
    朴素贝叶斯分类模型的特点:
    1)算法逻辑简单,易于理解和实现。
    2)分类过程中时间负责度和空间复杂度在可控范围内。
    3)算法性能好。
    尽管朴素贝叶斯模型有如此优点,但是它的局限性也是有的。注意我们假设各个属性之间是条件独立分布的,在实际应用中,这个往往是不能实现的。改进的贝叶斯也是解决这个问题的。
    2.2.2、改进的贝叶斯算法
    改进的贝叶斯分类算法是为了解决贝叶斯分类的独立假设条件。目前比较有名的算法有半朴素贝叶斯、选择贝叶斯、树增广朴素贝叶斯、贝叶斯网络等。
    半朴素贝叶斯的思想是将相互依赖的属性放在一个属性集合中,形成一个新的属性,其他的运算跟朴素贝叶斯相同。
    下面的图可以作为对比。

    图一、朴素贝叶斯分类器

    图二、半朴素贝叶斯
    选择贝叶斯的思想是选择属性集的子集作为属性集,其他的和朴素贝叶斯一样。由此可见选择贝叶斯和半朴素贝叶斯有异曲同工之妙。都是使得每个属性是条件独立的。不过半朴素贝叶斯是全体属性,选择贝叶斯是局部代替整体。

    图三、选择贝叶斯
    上面两种方式都解决了独立性假设问题,但是并不是说,它们的分类准确性一定比朴素贝叶斯要好。对于半朴素贝叶斯来说,它构造了一个更复杂的训练数据集。表面上来看,系统越复杂,准确度越高,但是实际中复杂的系统会产生一个过分拟合的问题,即适用性不高,在分类器学习训练时性能很好,但是用到一个实例时,结果却不理想。另一个,算法的时间复杂度和空间复杂度也会相应的增加。对于选择贝叶斯来说,同样也存在相应的问题。子集的选择就是一个问题,如何保证子集选择的正确性是关键。
    除了选择贝叶斯和半朴素贝叶斯,还有树增广朴素贝叶斯。树增广朴素贝叶斯的基本思想是:在朴素贝叶斯分类器的基础上,在属性之间增加连接弧线,以消除朴素贝叶斯分类器的条件独立假设。我们将这个弧线叫做扩展弧。如下图。

    图四 树增广朴素贝叶斯
    2.2.3、并行化的贝叶斯
    随着海量数据的发展,大数据的处理也已经成为迫在眉睫的事情。大数据在单机内存处理已经远远不能满足现在的计算和时间需求了。
    从朴素贝叶斯的算法来看,朴素贝叶斯的时间大多消耗在各个属性值的先验概率的计算上,而这些计算是可以分来的,因此我们可以将这一阶段进行并行化处理。
    目前,Hadoop云计算的发展,为并行化计算带来了巨大的方便,已有人实现了基于Hadoop Mapreduce的朴素贝叶斯文本分类器。
    2.3本章小结
    本章介绍了概率论中,贝叶斯的推导过程。朴素贝叶斯算法的原理和步骤,已经朴素贝叶斯算法的几种改进方案,它们分别是选择朴素贝叶斯、半朴素贝叶斯、树增广贝叶斯。
    第三章、文本分类
    3.1文本分类
    3.1.1文本分类的概念
    在文本自动分类中,假设我们有文档d∈X,X表示文档向量空间(document space),和一个固定类集合的C={c1,c2,…,cj},类别也称为标签。很显然,这个文档的向量空间是个高维度空间。我们把这一堆打了的标签文档的集合<d,c>作为文本分类的训练样本,<d,c>∈X×C。例如:
    <d,c>={Welcome to China, China}
    对于这个只有一句话的文档,我们把它归类到 China,即打上china标签。
    我们期望用某种训练算法,训练出一个函数γ,能够将文档映射到某一个类别:
    γ:X→C
    这种类型的学习方法也叫做有监督学习,因为这种方法事先有个监督者(在这里我们事先已经给出了一堆打好标签的分类文档)像个老师那样监督着整个学习过程。
    朴素贝叶斯分类器是一种有监督学习,常见有两种模型,多项式模型(multinomial model)和伯努利模型(Bernoulli model)。
    上面给出了文本分类的数学表示方法,这里我们描述一下文本分类。文本自动分类是在已经给定了一个或者预先已经定义好的类的场景下(也就是说类别是确定的),对文本形式的信息资源进行划分的一种方法。文本自动分类的最终目的就是对这些错综复杂的文本信息资源有效组织和管理,推荐给互联网的用户。
    文本分类系统的任务可以简单定义为:在对于给定的分类体系中,自动文本分类系统自动确定与该文本具有关联性类别需要必须依据文本的内容。如果我们用数学语言来描述这个文本自动分类系统的任务,那么就可以这样形容:文本自动分类就是一个映射过程,它既可以是一一映射的,也可以是一对多的映射。
    文本自动分类的映射规则:对已知类别中若干个的样本的数据信息,系统会总结出分类的规律性同时建立类别判别公式或判别规则。当该系统遇到新文本的时侯,只需根据总结出的类别判别规则来确定它所属的类别。
    在文本自动分类中,有两大类型的学习方式:分别是有监督学习、无监督学习。所谓有监督学习是利用一组已知类别的样本进行调整分类器的参数,使他们达到所要求性能的过程,这个也可以被称为监督训练。计算机不像人,它需要要通过不断学习才能获取这种识别各种事物、现象的能力。而用来计算机进行机器学习的材料是有限的与被识别对象属于同类的数量样本。监督学习的特点是先给予计算机学习样本,与此同时,还告诉计算机,各个样本所属的类别。任何一种学习都是有一定目的的,拿模式识别来说,就是要通过有限数量的样本学习,使分类器进行自动分类,并保证分类结果的准确性。分类器使用的学习算法不同,得到的分类器也不同。对于贝叶斯分类器来说,是通过使用学习样本来对特征向量的类条件概率密度函数进行估计。在概率论中,如果已知类条件概率密度函数的情况下,使用给定的独立和随机样本集,可以根据最大似然法或者是贝叶斯学习估计出类条件概率的密度函数。如果类条件概率密度函数未知,也可以使用各种非参数方法,估计学习样本对类条件概率的密度函数。
    而所谓的无监督学习,可以这么理解,直接对样本进行分类,这个算法是自适应的,不需要学习样本。在无监督学习中是用全部学习样本来估计混合概率密度函数的,也就是说假设这个模式类概率密度函数只有一个极大值,那么此时就可以根据混合概率密度函数计算得出分开各类的边界值。因本文采用的是有监督学习。
    也就是说,本文分类是根据文本的特征值,这里通常用文本的单词来表示,来对文本进行自动分类,分类方法分为有监督的学习和无监督的学习。
    3.1.2文本分类的步骤
    文本自动分类一般一下几个步骤:第一文本的表达、第二分类器的选择与训练、 第三分类结果的评价与反馈,其中文本的表达又可细分。可以分为文本预处理过程、索引和统计过程、特征抽取过程等步骤。文本自动分类系统的功能模块为:
    (1) 文本预处理:英文分词使用空格即可。中文没有像外文那样的空格,因此需要对文本进行分词处理。为了方便后来的处理,需要将原始语料格式化为统一的格式。中文的分词决定了后来文本分类的准确性。所以文本的预处理应该处在核心地位,给以重视。
    (2) 文本索引:为了降低后续处理的开销,往往需要将带分类的文档分解为基本处理单元,。文本索引是解决这个问题的一种常用方案。其中空间向量是一种不错的选择。
    (3) 统计:在上一步我们进行了分词,这一步需要对文本进行词频统计,常用的算法有IF-ITF。
    (4) 特征抽取:计算能反映文本主题的特征项进行抽取,计算与分类类别相关的概率。 一般情况下,是文档的单词。它能反映类别和特性项之间的关系。
    (5)分类器选择与训练:这一步是算法的选择,不同的算法标志不同的分类器,常见的分类器有SVM,决策树等,本文使用的是朴素贝叶斯。
    (6)测试与评价:这一步很重要,检验自动分类系统是否合格。如果准确度不行,就要不断地重复以上的步骤,直到达到理想的范围。
    按以上所述,文本分类需要经过三个阶段:
    第一阶段:准备阶段。这个阶段的任务是得到特征属性,也就是分词等操作。它是为文本分类作必要准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。本文中采用网上的样本库,这一步就不需要再做了。然而在整个文本分类中,这是唯一一个需要人工完成的阶段,而它的完成质量也决定了整个文本分类完成的质量。
    第二阶段:分类器训练阶段,这个阶段主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录,进而生成分类器。而这一阶段工作相对于前一阶段而言则较为简单,因为该阶段是计算机自定完成,只需要根据公式便可以由程序自动计算完成。在贝叶斯分类器中就是求先验概率和后验概率。
    第三阶段:应用与评价阶段。完成了分类器以后,需要试验来检查软件的性能,采用之前的样本集中若干文档,通过本分类器再次分类,从而检验。这部是通过程序实现的不需要人工。

    3.2文本分类的基本原理
    3.2.1停用词
    中文是词语的排列组合从而表达一定的含义,在文本中往往有一些必要的词,但是却没有特定的含义,对分类没有影响,我们把它们叫做停用词。停用词是类似“的”,“啊”等对分类没有任何帮助的,往往又经常出现在文章中的副词等常用词。在进行文本分类之间需要将这些词过滤掉。
    英文的停用词也是一样的含义,包括“the too”等词语,本文中的停用词见附录。
    3.2.2英文分词
    与中文分词相比,英文分词比较简单,英文是用空格分词的。因此一个字符串操作语句就能解决。
    中文分词是将一句话按语义分成若干词语。比如“我是中国人”,首先去掉停用词“是”。我们想要分成“我”“中国人”,但是分词系统可能分成“我中”,“国人”,已经“我”,“中国”,“人”等等。当然我们需要分析系统尽量和人的思想分成一样的。这也决定了文本分类系统的准确性。
    目前,国内比较有名的中文分成技术有中科院分成技术。
    在文本分类实验中,选择语料库一定要慎重,语料库的选择对最终的分类效果可能有影响。然而由于语料库中的文本在存储格式有差异、文档的完整性上有缺失、对存在重复文档未处理……存在一些问题,为了提高分类性能,避免这些问题影响文本分类系统的后续工作,因此对语料库进行预处理工作必不可少,对其中的噪音信息必须去除,将不规范的内容进行调整,使其满足文本分类输入数据要求。


    3.2.3文本分类算法
    文本分类算法有很多,机器学习和数据挖掘中的算法很多都能应用到文本分类中,例如支持向量机,决策树等。
    决策树分类算法分为两步。首先根据训练数据构建决策树,然后根据决策树对输入的数据进行分类。因此该算法是有监督的学习算法。在构建决策树的过程中,又分为两个关键的步骤:建树和减枝。这些在后面的算法中具体介绍。我们来看图一这棵决策树。方框即内部结点表示属性,椭圆也就是叶子结点表示分类结果,斜线表示属性的值,也就是条件分支。决策树构建过程是不断地按广度优先递归,直到叶子结点属于某一个类为止。在预测的过程中,根据深度优先,按照条件分支,直到找到叶子结点即分类结果为止。

    图、银行服务决策树
    支持向量机方法是建立在统计学习理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性和学习能力之间寻求最佳折衷,以期获得最好的推广能力(Generalizatin Abjlity)。支持向量机的方法主要有以下几个优点。
    (1)它是专门针对有限样本情况的,其目标是得到现有信息下的最优解而不仅是样本数趋干无穷大时的最优值。
    (2)算法最终将转化成为一个最优化问题,从理论上说,得到的将是全局最优点,解决了在神经网络方法中无法避免的
    局部极值问题。
    (3)算法将实际问题通过非线性变换转换到高维的特征空间(Feature Space),在高维窄间中构造线性判别函数来实现原空间中的非线性判别函数,特殊性质能保证机器有较好的推广能力,同时它巧妙地解决了维数问题,其算法复杂度与样维数无关。
    本论文使用贝叶斯进行文本分类。
    3.3、基于贝叶斯的文本分类
    首先,对文本进行去停用词、中文分词处理。下面我们就可以全心设计基于朴素贝叶斯的文本分类算法。
    第一步:计算先验概率
    第二步:计算后验概率
    算法参考下表:



    表1 用于学习和分类的朴素贝叶斯算法

    LEARN_NAIVE_BAYES_TEXT(Examples, V)
    Examples为一组文本文档以及它们的目标值。V为所有可能目标值的集合。此函数作用是学习概率项,它描述了从类别中的一个文档中随机抽取的一个单词为的概率。该函数也学习类别的先验概率。
    收集Examples中所有的单词、标点符号以及其它记号
    • 在Examples中任意文本文档中出现的所有单词和记号的集合
    计算所需要的概率项和
    • 对中每个目标值
    • 中目标值为的文档子集;
    • ;
    • 将中所有成员连接起来建立的单个文档;
    • 在中不同单词位置的总数;
    • 对中的每个单词
    • 单词出现在中的次数;
    • ;
    CLASSIFY_NAIVE_BAYES_TEXT(Doc)
    对文档返回其估计的目标值。代表在中的第个位置上出现的单词。
    • 返回


    本文的朴素贝叶斯文本分类主要是利用绝对词频来对特征项进行统计计算,因此朴素贝叶斯分类器也就存在着:有些高频词区分能力弱,而有些低频词区分能力强,但是绝对词频却主要体现高频词的区分能力,因而这样就使得朴素贝叶斯文本分类的结果存在偏差甚至出现错误。
    为解决这一问题,采用TFIDF算法使得区分能力很强得低词频特征项能够获得较高的频率,从而体现其较强的区分能力。
    假设文本D= 是文本中的一个特征项(1≤i≤m)。变量说明如下: 表示特征项 在文本 中出现的频数; 是训练样本集中出现特征项 的文档数;N是训练样本集中总的文档数。
    (1)绝对词频(TF)
    在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语 来说,它的重要性可表示为:

    以上式子中以上式子中,分母则是在文件 中所有字词的出现次数之和。
    在绝对词频方法中,主要体现是高频特征项的区分能力,而无法体现低频特征项的区分能力,因为有些特征项频率虽然很高,但分类能力很弱;而有些特征项虽然频率较低,但分类能力却很强。
    (2)TF-IDF
    TF-IDF(term frequency–inverse document frequency)是一种用于信息搜索和信息挖掘的常用加权技术。
    TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。IDF反文档频率(Inverse Document Frequency)的主要思想是:如果包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。
    3.4、本章小结
    本章介绍了文本分类的一般步骤和不同阶段,并介绍了停用词和中文分词技术。针对本文使用的朴素贝叶斯分类器设计了实现方案。
    第四章、系统设计
    4.1需求分析
    设计并实现一个中文文本分类软件,该软件能根据输入样本,输入的文件进行自动分类。
    时间复杂度和空间复杂度要求:时间复杂度小。
    准确度要求:文本的分类准确度高
    用户界面要求:界面友好,使用简单方便。
    4.2概要设计
    初步确定使用Java语言开发,界面使用Java的Swing技术。算法使用朴素贝叶斯分类算法。
    Java Swing是一个为Java设计的GUI工具包。Swing是JAVA基础类的一部分。Swing包括了大量的常用的图形用户界面(GUI)控件如:文本框,分隔窗格和表等。
    Swing提供许多比AWT更好的屏幕显示元素。它是在AWT的基础上发展出来的。它们用Java写成,所以它同Java本身一样,可以跨不同的平台运行,这一点不像AWT,它是JFC的一部分。简单来说就是跨平台,使用方便,支持硬件变化。你可以在任意平台上使用JAVA支持的面板。Swing是轻量级元件,它的缺点是执行速度慢,优点就是跨平台。
    朴素贝叶斯算法参加第二章和第三章。
    使用角色就是普通用户,本系统需要登录。功能就是自动分类。需要输入学习样本的路径和待分类的文档路径。
    4.3详细设计
    4.3.1结构设计
    软件设计采用常用的MVC框架,将视图和逻辑分开来,减少代码的冗余。MVC全名是Model View Controller,是模型(model)-视图(view)-控制器在软件设计中非常常用。它的思想就是用一种业务逻辑和数据显式分离的方法组织代码,将业务逻辑聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。优点是将代码组建化,提高代码的可复用性和修改时的代价低。
    4.3.2算法设计

     停用词处理
    停用词的处理思想很简单,读入停用词保存在数组中,在文本处理的过程中,首先匹配停用词数组,如果是停用词标记为true,否则为false。下面是代码实现。
    public class StopWordsHandler
    {
    private static String stopWordsList[] = new String[1028];//
    public static void readStopWord() throws IOException{
    File file = new File("D:\\workspace\\bigdata\\Beys\\英文停用词.txt");
    //FileReader reader = new FileReader(file);
    BufferedReader buff = new BufferedReader(new FileReader(file));
    String temp = null;
    int i=0;
    while((temp=buff.readLine())!=null){
    stopWordsList[i]= temp;
    i++;
    }
    }

    public static boolean IsStopWord(String word) throws IOException
    {
    if(stopWordsList.length==0){
    readStopWord();
    }
    for(int i=0;i<stopWordsList.length;++i)
    {
    if(word.equalsIgnoreCase(stopWordsList[i]))
    return true;
    }
    return false;
    }
    }

     先验概率
    贝叶斯算法的核心步骤就是先验概率的计算。根据第二章中的计算公式进行计算。
    public class PriorProbability
    {
    private static TrainingDataManager tdm =new TrainingDataManager();
    /**
    * 先验概率
    * @param c 给定的分类
    * @return 给定条件下的先验概率
    */
    public static float calculatePc(String c)
    {
    float ret = 0F;
    float Nc = tdm.getTrainingFileCountOfClassification(c);
    float N = tdm.getTrainingFileCount();
    ret = Nc / N;
    return ret;
    }
    }

     分类器
    这里定义一个文本分类器,在分类过程中,先过滤停用词,再计算先验概率,最后读入待分类文档,分词以后进行后验概率的计算,最后返回分类结果。
    public class BayesClassifier
    {
    private TrainingDataManager tdm;//训练集管理器
    //private String trainnigDataPath;//训练集路径
    private static double zoomFactor = 10.0f;
    /**
    * 默认的构造器,初始化训练集
    */
    public BayesClassifier(String trainPath)
    {
    tdm =new TrainingDataManager(trainPath);

    }
    public String readTestFile(String pathString) throws IOException{
    File file = new File("D:\\workspace\\bigdata\\Beys\\train\\C3-Art\\C3-Art0001.txt");
    BufferedReader buff = new BufferedReader(new FileReader(file));
    String tempString = null;
    String resultString = null;
    while ((tempString=buff.readLine())!=null) {
    resultString = resultString+tempString;
    }
    return resultString;
    }

    /**
    * 计算给定的文本属性向量X在给定的分类Cj中的类条件概率
    * <code>ClassConditionalProbability</code>连乘值
    * @param X 给定的文本属性向量
    * @param Cj 给定的类别
    * @return 分类条件概率连乘值,即<br>
    */
    float calcProd(String[] X, String Cj)
    {
    float ret = 1.0F;
    // 类条件概率连乘
    for (int i = 0; i <X.length; i++)
    {
    String Xi = X[i];
    //因为结果过小,因此在连乘之前放大10倍,这对最终结果并无影响,因为我们只是比较概率大小而已
    ret *=ClassConditionalProbability.calculatePxc(Xi, Cj)*zoomFactor;
    }
    // 再乘以先验概率
    ret *= PriorProbability.calculatePc(Cj);
    return ret;
    }
    /**
    * 去掉停用词
    * @param text 给定的文本
    * @return 去停用词后结果
    * @throws IOException
    */
    public String[] DropStopWords(String[] oldWords) throws IOException
    {
    Vector<String> v1 = new Vector<String>();
    for(int i=0;i<oldWords.length;++i)
    {
    if(StopWordsHandler.IsStopWord(oldWords[i])==false)
    {//不是停用词
    v1.add(oldWords[i]);
    }
    }
    String[] newWords = new String[v1.size()];
    v1.toArray(newWords);
    return newWords;
    }
    /**
    * 对给定的文本进行分类
    * @param text 给定的文本
    * @return 分类结果
    * @throws IOException
    */
    @SuppressWarnings("unchecked")
    public String classify(String pathString) throws IOException
    {
    String text=readTestFile(pathString);
    String[] terms = null;
    terms= ChineseSpliter.split(text, " ").split(" ");//中文分词处理(分词后结果可能还包含有停用词)
    terms = DropStopWords(terms);//去掉停用词,以免影响分类

    String[] Classes = tdm.getTraningClassifications();//分类
    float probility = 0.0F;
    List<ClassifyResult> crs = new ArrayList<ClassifyResult>();//分类结果
    for (int i = 0; i <Classes.length; i++)
    {
    String Ci = Classes[i];//第i个分类
    probility = calcProd(terms, Ci);//计算给定的文本属性向量terms在给定的分类Ci中的分类条件概率
    //保存分类结果
    ClassifyResult cr = new ClassifyResult();
    cr.classification = Ci;//分类
    cr.probility = probility;//关键字在分类的条件概率
    System.out.println("In process....");
    System.out.println(Ci + ":" + probility);
    //保存到文件,以后分类时到文件中读取数据,这样节省时间。
    crs.add(cr);
    }
    //对最后概率结果进行排序
    java.util.Collections.sort(crs,new Comparator()
    {
    public int compare(final Object o1,final Object o2)
    {
    final ClassifyResult m1 = (ClassifyResult) o1;
    final ClassifyResult m2 = (ClassifyResult) o2;
    final double ret = m1.probility - m2.probility;
    if (ret < 0)
    {
    return 1;
    }
    else
    {
    return -1;
    }
    }
    });
    //返回概率最大的分类
    return crs.get(0).classification;
    }
    }
     主函数
    在用户点击开始分类时,调用分类器进行分类,这里是监听函数的操作。
    startButton.addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    //ProgressBar progressBar = new ProgressBar();
    BayesClassifier classifier = new BayesClassifier(trainPath.getText());
    try {
    result = classifier.classify(testPath.getText());
    classResult.setText(result);
    classResult.setVisible(true);
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    }});

    4.3.3界面设计
     登录页面
    为了保证系统的安全,我们设计了一个简单的用户登录页面,默认情况下用户名是admin,密码是123456.用户名或者密码不正确无法使用该系统。

     主程序页面
    本系统的训练函数主要包括两个参数,训练集路径和测试集路径。根据这两个参数可以对文本进行分类。

     路径选择页面
    使用了Java Swing控件实现了路径选择功能。

    4.4、软件运行流程
     登录页面
    输入用户名admin 密码123456能成功登录页面。如果错误会提示用户名或密码错误。

     主程序页面
    登录成功后,进入程序主页面。如下图

     路径选择页面
    选择训练集和测试集路径,点击按钮start开始分类。

     分类结果显示
    等待程序运行完成后,将结果显示在文本框中。

    4.4测试
    实验采用数据集来源为:UCI提供的文本分类语料库(网上下载)http://kdd.ics.uci.edu/databases/。然后对训练集中文档进行学习过程,400篇文档,统计出不同的单词或者符号个数,也就是朴素贝叶斯方法中的特征个数,从而计算先验概率和条件概率。最后,对测试集中400篇文档进行分类。试验结果如下表。

    表2 文本分类实验结果
    文档类别 训练样本数 测试样本数 误判样本数 判别正确率
    计算机 100 100 1 99%
    艺术 100 100 37 63%
    历史 100 100 8 92%
    体育 100 100 12 88%
    总计 400 400 58 85.5%

    试验表明,该软件能对文本进行分类。
    4.5系统分析
    本软件基本实现了软件的要求,能正确的对文本进行分类。而且界面友好,易于操作,完成了本课题的要求任务。但是由于本系统在实现时没有考虑到朴素贝叶斯的改进问题。因此,准确度有待提高。
    4.6、本章小结
    本章从需求分析、概要设计、详细设计、测试一步步地试验了基于朴素贝叶斯文本分类器的软件系统,并通过试验证明取得了很好的准确度。但是时间复杂度有待提高。
    第五章、总结和展望
    本文运用贝叶斯理论阐述了朴素贝叶斯文本分类器的基本原理。在特征独立性假设的基础上,构造了一个朴素贝叶斯文本分类器,通过样本训练该分类器,进而对测试样本分类判断。实验表明,朴素贝叶斯理论在文本分类中有很好的效果。
    但是,本文还存在一些缺陷。由于实验数据集还不够大,文本类别较少,文档数量不多,还不能完全反映出朴素贝叶斯文本分类器的性能。而且时间复杂度有待提高。

    致 谢


    该课题是鲁东大学学习完成的。在这里,我要感谢我的学校导师XXX教授对我的大力支持和培养,以及XX学院通信工程专业的各位老师,本人在学校学习的这段时间里,给了我许多做人的道理和做学问的方法。在你们的课堂上以及课后的答疑上,我学习到了许多本专业的知识,你们严谨的治学态度和对学生的关心帮助将是我一生学习的榜样。
    感谢我的父母和兄弟姐妹,在学习与生活上他们对我一如既往的支持,为我顺利完成论文提供了坚实的后盾。
    最后,对我的大学表示感谢,感谢 XX系对我的培养,感谢所有帮助过我的老师、同学们!

    参考文献

    [1]李晓明,闫宏飞,王继民,“搜索引擎——原理、技术与系统”.科学出版社,2004
    [2]冯是聪, "中文网页自动分类技术研究及其在搜索引擎中的应用," 北京大学,博士论文, 2003
    [3]Y. Yang and X. Liu, "A re-examination of text categorization methods" presented at Proceedings of ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR'99), 1999.
    [4]F. Sebastiani, "A tutorial on Automated Text Categorization", Proceedings of ASAI-99, 1st Argentinian Symposium on Artificial Intelligence, Buenos Aires, AR, 1999
    [5]王涛:文本自动分类研究,图书馆学研究,2007.12
    [6]崔彩霞,张朝霞:文本分类方法对比研究,太原师范学院学报(自然科学版),2007.12
    [7] 毛国君等.数据挖掘原理与算法[M].北京:清华大学出版社,2005.
    [8] 陈文伟等.数据挖掘技术[M].北京:北京工业大学出版社,2002.
    [9] [美]Tom M Mitchell著.曾华军,张银奎等译.机器学习[J].北京:机械工业出版杜.2003.
    [10]陈剑敏.基于Bayes方法的文本分类器的研究与实现[D] .重庆:重庆大学计算机学院, 2007

    附录一:停用词表
    见英文停用词表。

    附录二:训练集
    见训练集。
    展开全文
  • 朴树贝叶斯文本分类

    2018-01-29 14:16:08
    朴树贝叶斯文本分类 前两个加载文件为特征分类文件,可以自己定义,例如:第一个文件是体育,第二个文件是新闻 第三个文件是测试文件 自己定义 目前这个demo是二分类 python3 from numpy import * def text...

    朴树贝叶斯文本分类

    前两个加载文件为特征分类文件,可以自己定义,例如:第一个文件是体育,第二个文件是新闻

    第三个文件是测试文件 自己定义 目前这个demo是二分类

    python3

    from numpy import *
    def textParse(bigString):    # input is big string, # output is word list # 分词
        import re
        listOfTokens = re.split(r'\W*', bigString)
        return [tok.lower() for tok in listOfTokens if len(tok) > 2]
    
    def bagOfWords2VecMN(vocabList, inputSet):
        returnVec = [0]*len(vocabList)
        for word in inputSet:
            if word in vocabList:
                returnVec[vocabList.index(word)] += 1
        return returnVec
    
    def createVocabList(dataSet):
        vocabSet = set([])  #create empty set
        for document in dataSet:
            vocabSet = vocabSet | set(document) #union of the two sets
        return list(vocabSet)
    
    
    def trainNB0(trainMatrix,trainCategory):
        numTrainDocs = len(trainMatrix)
        numWords = len(trainMatrix[0])
        pAbusive = sum(trainCategory)/float(numTrainDocs)
        p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones()
        p0Denom = 2.0; p1Denom = 2.0                        #change to 2.0
        for i in range(numTrainDocs):
            if trainCategory[i] == 1:
                p1Num += trainMatrix[i]
                p1Denom += sum(trainMatrix[i])
            else:
                p0Num += trainMatrix[i]
                p0Denom += sum(trainMatrix[i])
        p1Vect = log(p1Num/p1Denom)          #change to log()
        p0Vect = log(p0Num/p0Denom)          #change to log()
    
        return p0Vect,p1Vect,pAbusive
    
    def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
        p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
        p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
        if p1 > p0:
            return 1
        else:
            return 0
    
    
    def spamTest():
        docList=[]; classList = []; fullText =[]
        docList1 = [];
        classList1 = [];
        fullText1 = []
        wordList = textParse(open('F:/logclassify/ws3.log').read())
        # print wordList
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
        wordList = textParse(open('F:/logclassify/lm2.txt').read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)
        wordList1 = textParse(open('F:/logclassify/test/test1.txt').read())
        docList1.append(wordList1)
        fullText1.extend(wordList1)
    
        vocabList = createVocabList(docList) # create vocabulary
    
        trainingSet = range(3);
        trainingSet1 = range(1);
    
        testSet=[]           # create test set
        for i in range(1):
            randIndex = 0
            testSet.append(trainingSet1[randIndex])
        trainMat=[]; trainClasses = []
    
        for docIndex in trainingSet: # train the classifier (get probs) trainNB0
            trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
            trainClasses.append(classList[docIndex])
        p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses))
        errorCount = 0
    
        for docIndex in testSet:        #classify the remaining items
            wordVector = bagOfWords2VecMN(vocabList, docList1[docIndex])
            print(classifyNB(array(wordVector),p0V,p1V,pSpam));
        #     if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList1[docIndex]:
        #         errorCount += 1
        #         print ("classification error",docList1[docIndex])
        # print ('the error rate is: ',float(errorCount)/len(testSet))
        #return vocabList,fullText
    
    spamTest()


    展开全文
  • 朴素贝叶斯文本分类

    2017-08-29 23:09:13
    基于朴素贝叶斯文本分类,结合了TF-IDF算法和textrank算法
  • 序本文主要简单研究一下朴素贝叶斯算法是如何对文本进行分类的。贝叶斯算法贝叶斯方法把计算“具有某特征的条件下属于某类”的概率转换成需要计算“属于某类的条件下具有某特征”的概率,属于有监督学习。后验概率 ...

    本文主要简单研究一下朴素贝叶斯算法是如何对文本进行分类的。

    贝叶斯算法

    贝叶斯方法把计算“具有某特征的条件下属于某类”的概率转换成需要计算“属于某类的条件下具有某特征”的概率,属于有监督学习。

    后验概率 = 先验概率 x 调整因子

    这就是贝叶斯推断的含义。我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。

    公式

    p(yi|x) = p(yi) * p(x|yi) / p(x)

    p(所属类别yi|某种特征x) = p(所属类别yi) * p(某种特征x|所属类别yi) /p(某种特征x)

    根据公式就可以把计算“具有某种特征的条件下属于某个类别”的概率转换为:“属于某种类别的条件下,具有某种特征”的概率。

    先验概率

    其中p(yi)称为先验概率,即在x事件发生之前,发生yi事件的概率

    后验概率

    p(yi|x)称为后验概率,即在x事件发生之后,发生yi事件的概率,属于可观测的值

    调整因子

    p(x|yi)/p(x)为调整因子,也成为可能性函数(Likelyhood),使得预估概率更接近真实概率

    朴素贝叶斯算法

    朴素贝叶斯理论源于随机变量的独立性:就文本分类而言,从朴素贝叶斯的角度来看,句子中的两两词之间的关系是相互独立的,即一个对象的特征向量中每个维度都是相互独立的。这是朴素贝叶斯理论的思想基础。其流程如下

    - 第一阶段,训练数据生成训练样本集:TF-IDF。

    - 第二阶段,对每个类别计算P(yi)。

    - 第三阶段,对每个特征属性计算所有类别下的条件概率p(ai|yi)。

    - 第四阶段,对每个类别计算p(x|yi)p(yi)。

    - 第五阶段,以p(x|yi)p(yi)的最大项作为x的所属类别。

    问题

    假设x是一个待分类文本,其特征为{a1,a2,...,am};已知类别集合{y1,y2,...yn};求x所属的类别

    基本思路

    如果p(yi|x) = max{p(y1|x),p(y2|x),p(y3|x),...,p(yn|x)},则x属于yi类别

    如何计算p(yi|x)

    利用贝叶斯公式

    p(yi|x) = p(x|yi)*p(yi) / p(x)

    问题转换为对每个类别计算p(x|yi) p(yi),以p(x|yi)p(yi)的最大项作为x的所属类别

    计算p(x|yi)

    由于朴素贝叶斯假定各个特征是相互独立的,因此

    p(x|yi) = p(a1|yi)*p(a2|yi)...*p(am|yi)

    p(x|yi)/p(x)为调整因子

    计算p(ai|yi)

    而p(ai|yi)则可以通过训练集(已经分好类),统计各个类别下面各种特征的条件概率p(ai|yi)得到。

    自此求x所属的类别p(yi|x)被一步步化解,可以通过计算训练集中每个类别下各种特征的条件概率p(ai|yi)来求解得到。

    而训练的过程则是根据训练集去计算调整因子的影响因素p(x|yi)=p(a1|yi)p(a2|yi)...p(am|yi),因此训练集的好坏直接影响预测结果的准确性。

    TF-IDF

    TF-IDF( term frequency–inverse document frequency )是一种用于信息检索与数据挖掘的常用加权方法。

    TF-IDF = TF * IDF

    TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率 TF 高,并且在其他文章中很少出现(IDF值大),则认为此词或者短语具有很好的类别区分能力,适合用来分类。

    TF

    意思是词频( Term Frequency ),即某个词在文件中出现的频率

    TFi = Ndti / Ndt1..n

    即该词在文档中出现的次数/该文档所有词出现的次数之和

    IDF

    意思是逆向文件频率( Inverse Document Frequency ),它是一个词语重要性的调整系数,衡量一个词是不是常见词。如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。

    某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到

    IDF = log(Nd/Ndt)

    Nd为总文件数,Ndt为包含该词语的文件数目

    如果一个词非常常用则Ndt变大,则IDF值会变小,因而TF-IDF值也会变小,这样就很好地削弱了常用词的特征性。

    小结

    朴素贝叶斯算法将问题一步步化解,最后通过训练集求解,值得好好学习推敲。

    doc

    展开全文
  • 朴素贝叶斯文本分类:以垃圾邮件分类举例:一封邮件根据内容不同,可以被分为“垃圾邮件”和“正常邮件”。垃圾邮件内的单词可能在正常邮件里出现,而正常邮件里的单词也有可能在垃圾邮件里出现。通过朴素贝叶斯文本...
  • 朴素贝叶斯文本分类算法

    千次阅读 2015-12-27 15:47:33
    朴素贝叶斯文本分类算法 摘要:常用的文本分类方法有支持向量机、K-近邻算法和朴素贝叶斯。其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用。本文详细介绍了朴素贝叶斯的基本原理,讨论了两种常见模型:...
  • 2、本课程从属于正在录制的《机器学习入门系列》,本篇是第2篇:朴素贝叶斯文本分类。本课程中会涉及到一些数学算法和使用工具。先教大家怎么使用和简单触碰原理。很快后续会有针对这些特定数学基础和工具的精讲课程...
  • 一种基于词向量的分布式中文贝叶斯文本分类器,冯梦轲,吴国仕,朴素贝叶斯分类器的提出是基于一个假定:在给定目标值时,属性值之间相互独立。这种算法在文本分类中获得了很大的成功。但是在计
  • 朴素贝叶斯文本分类小demo(通过文本的特征预测文本所属分类) 数据集下载:链接:https://pan.baidu.com/s/1zxrKtTYli2iQgK1iNVP9PQ 提取码:la3w 目的:通过文本的特征预测文本所属分类。 1.导包 import os ...
  • Mahout朴素贝叶斯文本分类算法 Mahout贝叶斯分类器按照官方的说法,是按照《Tackling the PoorAssumptions of Naive Bayes Text Classiers》实现的。分为三个模块:训练、测试和分类。该文档首先简要介绍朴素...
  • 朴素贝叶斯 分类算法数据集文本挖掘(Text Mining,从文字中获取信息)是一个比较宽泛的概念,这一技术在如今每天都有海量文本数据生成的时代越来越受到关注。目前,在机器学习模型的帮助下,包括情绪分析,文件分类...
  • 带你搞懂朴素贝叶斯分类算法 NLP系列(2)_用朴素贝叶斯进行文本分类(上) NLP系列(3)_用朴素贝叶斯进行文本分类(下) ...朴素贝叶斯文本分类算法学习 贝叶斯推断及其互联网应用(三):拼写检查...
  • 新闻案例 贝叶斯文本分类 5-24

    千次阅读 2018-05-24 19:05:49
    基于python的 新闻分类案例 贝叶斯文本分类 5-24 import pandas as pd import jieba import numpy padas读取TXT文档的方式 df_news=pd.read_table('./sougou_news_data/val.txt',names=['category','theme...
  • 机器学习-朴素贝叶斯文本分类Python实现 前面提到的K最近邻算法和决策树算法,数据实例最终被明确的划分到某个分类中,下面介绍 朴素贝叶斯是一种运用概率给对象进行分类,而不是完全确定实例应该分到哪个类;K...
  • 机器学习 4.5节 贝叶斯文本分类
  • 贝叶斯文本分类原理

    2017-07-03 17:09:00
    1、贝叶斯定理 贝叶斯条件概率公式的核心思想是利用容易知道的条件...2、贝叶斯定理在文本分类中的具体使用原理 我们知道文本都是由一个个的词语所构成的,利用有效技术手段将文本进行分词得到一个个文本的特征项(...
  • 这就用到了一个机器学习的算法——贝叶斯文本分类器。这个算法很有用处,可以让电脑识别人类语言,如果加上一点心理学的知识,可以让电脑理解人类的文章并让电脑判断作者的个性特征,这就复杂了,现在我们先做一个...
  • 接着上一篇文章:朴素贝叶斯文本分类算法java实现(一),最近一直在学习朴素贝叶斯进行文本自动分类。 为了加深理解,自己实现了多项式朴素贝叶斯对文本的自动分类。文本样本采用了搜狗提供的文本分类语料库. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,202
精华内容 880
关键字:

贝叶斯文本分类