欢迎投稿

今日深度:

hadoop 学习笔记,

hadoop 学习笔记,


基于hadoop的贝叶斯文本分类器实现过程

贝叶斯基础理论(这个东西的项目概览)

对这个工程总体的流程可以参考这个文献里面的做法即可

参考文献1

远程原件目录

/user/coderlau/input

hadoop文件系统命令行主要是hdfs

对于初学者而言,在这个地方主要是注意两个地方即可,一个是Linux 环境下本身的文件路径,和HDFS系统远程文件系统,这是两个不同的东西

hadoop 执行源码情况

hadoop jar 源码打包成的jar 文件情况(关于这部分设计到如何去打包一个Java项目, 然后上传到服务器进行运行(这里的服务器是指Linux系统概念情况))

编程实践

主要是理解两个过程,一个map和reduce ,关于这个可以查看官方的文档资料等情况

官方文档

根据自己写的代码情况 自己定义参数情况

自定义参数情况

主要是主程序中的入口问题

程序编写

在这里要注意的地方是 InWritable 对象可以在后面进行创建,也可以在前面进行创建

程序代码案例

Hadoop 中最基本的词语统计功能

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

    public static class TokenizerMapper
            extends Mapper<Object, Text, Text, IntWritable> {
       //最后的输出结果形式
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context
        ) throws IOException, InterruptedException {
            //map 方法数据的处理来源 的value参数, text  可以转换为 value 的基本关系
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer
            extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values,
                           Context context
        ) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        // 设置出来的值情况
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

代码编写过程中的核心概念设计

主程序中job

Configuration

Configuration configuration = new Configuration();

​ Job job = Job.getInstance(conf, “WordCount”);
​ job.setJarByClass(WordCount.class);
​ job.setMapperClass(WordCount.TokenizerMapper.class); // 如果调用两种情况 mapper类型
​ job.setReducerClass(WordCount.IntSumReduce.class); // 如果调用两种情况 reduce类
​ job.setOutputKeyClass(Text.class);

context() 方式

代码过程中的数据源

value , key ,分别代表的是什么数据源情况

hadoop 如何与bayes分类器结合起来使用这种情况

hadoop 结合贝叶斯简单分类器设置

如何计算概率,如何还是使用map 和reduce的功能进行计算概率, 先验概率和条件概率如何进行计算

先验概率情况

类条件概率P(tk|c)=(类c下单词tk在各个文档中出现的次数之和+1)/(类c的单词总数+训练样本中不重复特征词总数)

先验概率P©=类c下的单词总数/整个训练样本的单词总数

要统计的东西

条件概率

p(某个单词 | CHINA)=

p (某个单词| CANA) =

p

………

先验概率

P(CHINA)

P(CANA)

如何预测

关于这个贝叶斯分类器的设计的基础查看这部分文本

贝叶斯分类器

为训练集正负样本中出现每个单词都要计算

p(单词 1| CHINA) = 单词一(在China文本类中出现的总次数)/ (CHINA 样本中总的单词数) ,包括重复样本的数目情况

如果一个单词在CHINA中出现,而在CANA中没有出现过的话,则直实现加1操作吧, 把他出现的次数直接设置为

……………

P(单词n| CANA)

预测文本分别在

预测P(CHINA| 单词一,单词二,单词三,) == P(单词1|China) ****P(单词n| CANA) * p(CHINA)/ P(单词一) * 单词(二)………….

P(CANA| 单词一,单词二,单词三,)== P(单词1| CANA)

最终的概率计算方式情况(预测公式)

p(CHINA|单词一,单词二,,) = P(CHINA) * P(单词一| CHINA ) * P(单词二| CHINA)

P(CANA|单词一,单词二,,) = P(CANA) * P(单词一|CANA ) * P (单词二| CANA)

比较上述两个特征的值

P(CHINA|单词一,单词二,) > P(CANA|单词一,单词二,,) 比较两者大小情况

一个main方法

一个main 方法一个job 东西,

如何在hadoop 上面选择运行某一个job 作业,如何将这个项目进行打包即可在,这种情况下

如果解决多个作业任务的输出输入问题

如何将输出的文件进行合并情况

Hadoop fs -getmerge /JULY/output 本地文件名字情况

其中out后面生成的东西文件名字不要再指明这种情况 part-afds

实验文件路径

甘露学长在做的过程所使用的命令行

打包 hadoop archive -archinveName china.har -p /train/CHINA /data(dest 存放目录不需要先创建的,会自动进行创建的情况)

在运行环境过程中对运务进行截图

利用hadoop 自带的打包工具进行,

主要是hdfs 文件归档操作

单词统计功能

考虑文件大小有没有超过block size 工作区文件

存放数据的目录情况

hdfs dfs -mkdir -p /user/coderlau/input/train

这个目录下面是存放数据的情况

统计单词数目

统计单词数目 数目情况

Hadoop jar train_wordsum.jar /data/china.har /result1 统计词频命令行问题

统计文档数量情况

在所有的文件我们统一写cana 或china

hadoop jar train_prior.jar /input /out class 有三个参数,第一个是输入路径,第二个是输出路径,

统计词频的命令行工具情况

涉及到计算条件概率的问题, 所有要指明是哪一个类别还有单词总数是多少的情况

命令行工具总结如下面的情况可以得到的情况编写如下该种情况

uage : hadoop jar 源码文件 srcpath outpath class total

Total 总某个类别情况下面的数目情况

针对上面这种情况进行整合

"usage: hadoop jar package.ar srcpath outputpath  china_word_total cana_word_total"

第三个参数是类别情况 cana 还是china 的情况要区分开来的基本情况

如何使用这个命令行

// 提示如何使用这个代码 ,运行输入相应的参数,
// hadoop 命令行,   .jar 是Java打包后的可执行文件, srcpath 是输入mapreduce 模型的原件路径, outpath 是结果输出路径, class 是文档类别

用户输入

用户输入的参数可以进行conf.set

在主函数中可以

configuration.set(“type”, args[2]);

在文档统计中输入代表 用户输入情况

type1 采用 CHINA 代替

type0 采用 CANA 代替

最后如何编译写成的代码情况

https://blog.csdn.net/lifeifei2010/article/details/69396332

问题解决

如何解决编译的问题在这种情况下面

javac DouceNumberCount.java -cp $(/Users/coderlau/hadoop/hadoop-2.9.2/bin/hadoop classpath)

使用上述命令行解决中编译不成功的问题即可

www.htsjk.Com true http://www.htsjk.com/Hadoop/41772.html NewsArticle hadoop 学习笔记, 基于hadoop的贝叶斯文本分类器实现过程 贝叶斯基础理论(这个东西的项目概览) 对这个工程总体的流程可以参考这个文献里面的做法即可 参考文献1 远程原件目录 /...
相关文章
    暂无相关文章
评论暂时关闭