基于的朴素贝叶斯的文本分类(附完整代码(spark/java)

本文主要包括以下内容:

1)模型训练数据生成(demo)

2 ) 模型训练(spark+java),数据存储在hdfs上

3)预测数据生成(demo)

4)使用生成的模型进行文本分类。

一、训练数据生成

spark mllib模型训练的输入数据格式通常有两种,一种叫做 LIBSVM 格式,样式如下:

label index1:value1 index2:value2

label为类别标签,indexX为特征向量索引下标,value为对应的那维的取值。

另一种格式样式如下:

label f1,f2,f3,…,fn

fx为特征取值

两种格式的文件,分别可以通过方法:

org.apache.spark.mllib.util.MLUtils.loadLibSVMFile

org.apache.spark.mllib.util.MLUtils.loadLabeledData

读取。

我们这里采用第一种格式。

现在开始正式生成这种格式的数据文件。在模型训练阶段,会直接从这个文件中读取数据训练。这个后面会讲到。

我们这里假设对于文本,我们已经提取了关键词作为特征。特征列表如下:

features = [w1,w2,w3,…,wn]

同时,文本的主题(类别)集为:

topics = [t1,t2,…tm]

然后有很多的经过简单处理(分词,去停用词等)得到训练数据,每行的格式大概如下:

t2 w1,w23,w34,w1,…

我们直接将词频当做特征的取值。下面是生成libsvm格式的python代码,仅供参考:

    for info in result:
        sstr = ""
        topic_name = info[0] #主题名
        content = str(info[1]).split() #处理后的文本内容(词列表)
        index = topics.index(channel_name)
        sstr += str(index)
        features_val = ""
        for i,word in enumerate(features):
            freq = content.count(word)
            if freq:
                features_val += " "
                features_val += str(i+1) + ":" + str(freq)
        if not features_val:continue
        sstr += features_val
        #bayes_data.write(sstr+"\n")
        print n
        n += 1
    hdfs_client.write_list(sstr_lst,BAYES_DATA_PATH)#写到hdfs指定路径        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这样,训练数据就算生成完成了。

二、模型训练

这步就简单了。spark官网上有例子,直接拿来用就行了。现在贴出略做调整后的java代码:

public static void training(JavaSparkContext jsc){
        String path = "data/libsvm_data.txt";

         JavaRDD<LabeledPoint> inputData = MLUtils.loadLibSVMFile(jsc.sc(), path).toJavaRDD();
         JavaRDD<LabeledPoint>[] tmp = inputData.randomSplit(new double[]{0.6, 0.4}, 12345);
         JavaRDD<LabeledPoint> training = tmp[0]; // training set
         JavaRDD<LabeledPoint> test = tmp[1]; // test set
         final NaiveBayesModel model = NaiveBayes.train(training.rdd());
         JavaPairRDD<Double, Double> predictionAndLabel =
           test.mapToPair(new PairFunction<LabeledPoint, Double, Double>() {
             @Override
             public Tuple2<Double, Double> call(LabeledPoint p) {
               return new Tuple2<Double, Double>(model.predict(p.features()), p.label());
             }
           });
         double accuracy = predictionAndLabel.filter(new Function<Tuple2<Double, Double>, Boolean>() {
           @Override
           public Boolean call(Tuple2<Double, Double> pl) {
             return pl._1().equals(pl._2());
           }
         }).count() / (double) test.count();
        //System.out.println(accuracy);
         // Save and load model
         model.save(jsc.sc(), "target/tmp/NaiveBayesModel");
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

如何执行这个任务?

具体完整的代码大家可以从spark的项目上找,或者看本文最后贴出的补充部分代码,基本也就全了。

把代码所在的工程打包(jar),比如打包为XX.jar。

然后执行命令:

spark-submit –class “yourclass” –master yarn XX.jar

就可以了。打包,已经spark-submit命令就不要详细讲了吧?

模型训练完成,可以打印模型的评测结果(准确率),并且将模型保存到hdfs上。注意上面的两个路径都是指hdfs上的路径。

三、使用模型对文本进行分类

拿来展示分类的文本数据生成过程就不介绍了。和模型数据生成一样。基本就是对你的文章分词等,然后转换成libsvm格式的文件,放到hdfs上。下面直接上分类的代码:

public static void predict(JavaSparkContext jsc){
        NaiveBayesModel sameModel = NaiveBayesModel.load(jsc.sc(), "target/tmp/NaiveBayesModel");
        String path = "/data/pred_data.txt";
        JavaRDD<String> rdd = jsc.textFile(path);

        for(String features:rdd.collect()){
            //System.out.println(features);
            String[] feature_str_lst = features.split(",");
            double[] feature_lst = new double[feature_str_lst.length];
            for(int i = 0;i<feature_str_lst.length;i++){
                feature_lst[i] = Double.parseDouble(feature_str_lst[i]);
            }
            System.out.println(sameModel.predict(Vectors.dense(feature_lst)));

        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

执行后的结果正常情况你会看到如下的输出:(框起来的都是预测的类别)

还不会,没有执行完整个demo?

代码main()方法的也贴给你们:

public static void main(String[] args){
        SparkConf sparkConf = new SparkConf().setAppName("JavaNaiveBayesExample");
         JavaSparkContext jsc = new JavaSparkContext(sparkConf);
         //training(jsc);
         predict(jsc);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

好了。讲完了,是不是很简单。实现很简单,算法原理也很简单。有兴趣就自己去研究吧。

时间: 2024-11-08 19:04:23

基于的朴素贝叶斯的文本分类(附完整代码(spark/java)的相关文章

基于朴素贝叶斯的文本分类

前言:学习机器学习的过程意识到,数学是工科的基石.很多数学公式似懂非懂,因此有了这篇博客,想在学习每个模型的过程中搞懂其中的数学理论. 贝叶斯决策论 1.前置知识:先验概率与后验概率 先验概率P(B):根据以往经验和分析得到的概率 先验概率是一种常识性.经验性认知,比如抛硬币正反面的概率是1/2. 后验概率P(A|B):某个因素的到来影响了对某个结果发生可能性的判断 后验概率是基于已知,对结果发生的可能性一种推测. 比如:文本分类中,假设文章类别为3类,没有数据时,观测到类别c的概率是先验概率P

NLP系列(2)_用朴素贝叶斯进行文本分类(上)

作者:寒小阳 && 龙心尘 时间:2016年1月. 出处:http://blog.csdn.net/longxinchen_ml/article/details/50597149 http://blog.csdn.net/han_xiaoyang/article/details/50616559 声明:版权全部,转载请联系作者并注明出处 1. 引言 贝叶斯方法是一个历史悠久.有着坚实的理论基础的方法,同一时候处理非常多问题时直接而又高效.非常多高级自然语言处理模型也能够从它演化而来.因此,

机器学习基础——带你实战朴素贝叶斯模型文本分类

本文始发于个人公众号:TechFlow 上一篇文章当中我们介绍了朴素贝叶斯模型的基本原理. 朴素贝叶斯的核心本质是假设样本当中的变量服从某个分布,从而利用条件概率计算出样本属于某个类别的概率.一般来说一个样本往往会含有许多特征,这些特征之间很有可能是有相关性的.为了简化模型,朴素贝叶斯模型假设这些变量是独立的.这样我们就可以很简单地计算出样本的概率. 想要回顾其中细节的同学,可以点击链接回到之前的文章: 机器学习基础--让你一文学会朴素贝叶斯模型 在我们学习算法的过程中,如果只看模型的原理以及理

NLP系列(3)_用朴素贝叶斯进行文本分类(下)

作者: 龙心尘 && 寒小阳 时间:2016年2月. 出处: http://blog.csdn.net/longxinchen_ml/article/details/50629110 http://blog.csdn.net/han_xiaoyang/article/details/50629587 声明:版权所有,转载请联系作者并注明出处 1. 引言 上一篇文章我们主要从理论上梳理了朴素贝叶斯方法进行文本分类的基本思路.这篇文章我们主要从实践上探讨一些应用过程中的tricks,并进一步分

(数据挖掘-入门-8)基于朴素贝叶斯的文本分类器

主要内容: 1.动机 2.基于朴素贝叶斯的文本分类器 3.python实现 一.动机 之前介绍的朴素贝叶斯分类器所使用的都是结构化的数据集,即每行代表一个样本,每列代表一个特征属性. 但在实际中,尤其是网页中,爬虫所采集到的数据都是非结构化的,如新闻.微博.帖子等,如果要对对这一类数据进行分类,应该怎么办呢?例如,新闻分类,微博情感分析等. 本文就介绍一种基于朴素贝叶斯的文本分类器. 二.基于朴素贝叶斯的文本分类器 目标:对非结构化的文本进行分类 首先,回顾一下朴素贝叶斯公式: 特征.特征处理:

【机器学习实验】使用朴素贝叶斯进行文本的分类

引言 朴素贝叶斯由贝叶斯定理延伸而来的简单而强大的概率模型,它根据每个特征的概率确定一个对象属于某一类别的概率.该方法基于一个假设,所有特征需要相互独立,即任一特征的值和其他特征的值没有关联关系. 虽然这种条件独立的假设在许多应用领域未必能很好满足,甚至是不成立的.但这种简化的贝叶斯分类器在许多实际应用中还是得到了较好的分类精度.训练模型的过程可以看作是对相关条件概率的计算,它可以用统计对应某一类别的特征的频率来估计. 朴素贝叶斯最成功的一个应用是自然语言处理领域,自然语言处理的的数据可以看做是

朴素贝叶斯-垃圾邮件分类实现

1. 前言 <朴素贝叶斯算法(Naive Bayes)>,介绍了朴素贝叶斯原理.本文介绍的是朴素贝叶斯的基础实现,用来垃圾邮件分类. 2. 朴素贝叶斯基础实现 朴素贝叶斯 (naive Bayes) 法是基于贝叶斯定理与特征条件独立假设的分类的方法.对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然后基于此模型,对于给定的输入$x$,利用贝叶斯定理求出后验概率最大的输出$y$,完整代码GitHub. 输入: #垃圾邮件的内容 posting_list = [ ['m

机器学习--朴素贝叶斯算法原理、方法及代码实现

一.朴素的贝叶斯算法原理 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据,朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种,朴素的意思是条件概率独立性. 条件概率的三个重要公式: (1)概率乘法公式: P(AB)= P(B) P(A|B) = P(A) P(B|A) =P(BA) (2)全概率公式:        (3)贝叶斯公式:            如果一个事物在一些属性条件发生的情况下,事物属于A的概率>属于B的概率,则判定事物属于A,这就是朴素贝叶斯的基本思想. 二.算法步骤 (

《机器学习实战》学习笔记:基于朴素贝叶斯的分类方法

概率是许多机器学习算法的基础,在前面生成决策树的过程中使用了一小部分关于概率的知识,即统计特征在数据集中取某个特定值的次数,然后除以数据集的实例总数,得到特征取该值的概率. 目录: 一.基于贝叶斯理论的分类方法 二.关于朴素贝叶斯的应用场景 三.基于Python和朴素贝叶斯的文本分类 1.准备数据 2.训练算法 3.测试算法 四.小结 以下进入正文: 一.基于贝叶斯理论的分类方法 假设有两类数据组成的数据集如下: 其中,假设两个概率分布的参数已知,并用p1(x,y)表示当前数据点(x,y)属于类