大数据hadoop期末考核-贝叶斯情感分析

题目如下:

1.基础材料说明

1)训练集training.txt文件

该文件是一个大小为75.8MB的文本数据集,并包含了20,000,000条数据记录,每行数据中包含的信息为“评价结论\t 评价内容”。其中,“评价内容”是若干词语组合而成,词语之间是空格隔开,词语包括中文、英文以及其他特殊符号,即其内容为“word1 word2 word3 word4 …… wordn”,其中wordi表示当前文本描述中的第i个词,n为当前文本描述中包含的总词数。

2)测试集test.txt文件

给定“test.data”数据集,该数据集包含了2000条记录,每行记录中包含的信息为“评价内容”,该“评价内容”的具体表现形式与前文描述的“training.txt”数据集相同。

2.课程任务说明(每一步均有一项提交的材料)

1)基于Vmware安装CentOS Linux/ubunt环境(三台及以上),并在此基础之上安装Hadoop集群环境,整个安装过程涉及到的配置文件修改,需要写在“学号_Hadoop配置.docx”文件中。(共一项任务,共10分)

2)在命令行环境下上传training.data文件,在Web界面上传test.txt文件,文件上传至hdfs的“input_学号”目录下,将整个过程写在“学号_上传文件.docx”文件中。(共一项任务,共10分)

3)在命令行环境下,查看数据集是否上传成功,将使用的命令写在“学号_上传文件检查.docx”文件中。(共一项任务,共5分) 

4)基于Eclipse创建Hadoop工程,需提交工程代码,工程的命名:“NB_学号”,工程中应该应包含一个名”NB.java”的程序,该程序是整合工程的执行入口(包括main(),程序可直接运行)。 (共一项任务,共5分)

5)编写Java程序,使其能够实现基于上传至hdfs的“学号_上传文件.txt”数据集训练情感分类器的目的。在训练的过程中,应过滤包含非中文字符或全部由非中文字符构成的词语。保存模型文件至“学号_模型.txt”文件中。格式要求:(共一项任务,共20分)                                         

类标_词语1\t计数

类标_词语2\t计数

类标_词语3\t计数

……

类标1\t计数

类标2\t计数

6)基于训练得到的模型参数(即Nc和Ncw,其中,c表示情感标签类别,c∈{好评,差评},w∈V,V是“学号_上传文件.data”数据集包含的中文词典集合),对“test.txt”数据集中的各条记录进行“情感标签”判别。判别结果输出至“学号_预测结果.txt”文件中。“学号_预测结果.txt”文件中的每行是行号及“test.txt”中预测的“情感标签”:格式要求: (共一项任务,共20分)                              

1 情感标签

2 情感标签

3 情感标签

……

2000 情感标签

7)以小组为单位提交总报告,将整个实验过程和结论以总报告的形式,命名为“学号_总报告.docx”。(共一项任务,共10分)

我经过编写代码之后得到的结果:

提交的所有文件:

部分代码:

NB.java

package com.gong.fusion.NB_2020081200;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.log4j.BasicConfigurator;



public class NB  {

    public static void main(String[] args) throws Exception {
    	BasicConfigurator.configure(); //自动快速地使用缺省Log4j环境。不使用则控制台不打印信息
        Configuration configuration = new Configuration();
        //启动job1任务
        Job job1 = Job.getInstance(configuration, "task1"); 
        job1.setJarByClass(NB.class);  //指定jar打包主类
        job1.setMapperClass(MyMapper.class);   //指定mapper
        job1.setReducerClass(MyReduce.class);  //指定reduce
        job1.setOutputKeyClass(Text.class);    //指定输出的k格式
        job1.setOutputValueClass(LongWritable.class);  //指定输出的v格式
        FileInputFormat.addInputPath(job1, new Path("file:///Users/mac/Desktop/input/training.txt")); //本地测试模式的读取路径
        FileOutputFormat.setOutputPath(job1, new Path("file:///Users//mac//Desktop//output")); //本地测试模式的输出路径
        //FileInputFormat.addInputPath(job1, new Path("hdfs://localhost:9020/input_2020081200/training.txt")); //指定文件读取路径
        //FileOutputFormat.setOutputPath(job1,new Path("hdfs://localhost:9020/output"));//指定文件输出路径
        job1.waitForCompletion(true);  //等待任务完成
        
        //启动job2任务
        Job job2 = Job.getInstance(configuration, "task2");
        job2.setJarByClass(NB.class);   //指定jar打包主类
        job2.setMapperClass(PredictMapper.class);  //指定mapper
        job2.setReducerClass(PredictReduce.class);   //指定reduce
        job2.setOutputKeyClass(IntWritable.class);  //指定输出的k格式
        job2.setOutputValueClass(Text.class);   //指定输出的v格式
        FileInputFormat.addInputPath(job2, new Path("file:///Users/mac/Desktop/input/test.txt")); //本地测试模式的读取路径
        FileOutputFormat.setOutputPath(job2, new Path("file:///Users//mac//Desktop//output1"));  //本地测试模式的输出路径
        //FileInputFormat.addInputPath(job2, new Path("hdfs://localhost:9020/input_2020081200/test.txt"));  //指定文件读取路径
        //FileOutputFormat.setOutputPath(job2,new Path("hdfs://localhost:9020/output1"));  //指定文件输出路径
        job2.waitForCompletion(true); //等待任务完成
        
        //启动job3任务
        Job job3 = Job.getInstance(configuration, "task3");
        job3.setJarByClass(NB.class);   //指定jar打包主类
        job3.setMapperClass(CountMapper.class);  //指定mapper
        job3.setReducerClass(CountReduce.class);   //指定reduce
        job3.setOutputKeyClass(Text.class);  //指定输出的k格式
        job3.setOutputValueClass(LongWritable.class);   //指定输出的v格式
       FileInputFormat.addInputPath(job3, new Path("file:///Users/mac/Desktop/input/test.txt")); //本地测试模式的读取路径
       FileOutputFormat.setOutputPath(job3, new Path("file:///Users//mac//Desktop//output2"));  //本地测试模式的输出路径
        //FileInputFormat.addInputPath(job2, new Path("hdfs://localhost:9020/input_2020/test.txt"));  //指定文件读取路径
        //FileOutputFormat.setOutputPath(job2,new Path("hdfs://localhost:9020/output1"));  //指定文件输出路径
        job3.waitForCompletion(true); //等待任务完成
    }
}

 Mymapper.java

package com.gong.fusion.NB_2020081200;
import java.io.IOException;

import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Mapper;

public class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{

  @Override
  protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context)
          throws IOException, InterruptedException {
      	  LongWritable one = new LongWritable(1);   //one是一个固定的值1
          String split[] = value.toString().split("\t");  //源文件以制表符隔开,得到一个数组
          if(split.length==2){  //此处保证了选取的每行数据都是带有总评价(好或者坏)的
              String label = split[0]; //好或者坏标签
              context.write(new Text(label), one); //标签先放入上下文
              String[] words = split[1].split(" ");  //将评价词汇以空格为分隔符进行切分
              for(String word : words) {
                  if(containsNonChineseCharacters(word)){ //筛选只含有中文的词汇
                      word="_"+word ;  //每个词汇前面加上_来与标签分隔开
                      context.write(new Text(label+word), one);  //写入上下文
                  }
              }
          }
  } 
  
  public boolean containsNonChineseCharacters(String str) {
	    // 创建一个正则表达式,用于匹配中文字符
	    String pattern = "[\\u4E00-\\u9FA5]+";
	    // 如果字符串中包含非中文字符,则返回false,否则返回true
	    return str.matches(pattern);
	}

  }

MyReduce.java

package com.gong.fusion.NB_2020081200;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class MyReduce extends Reducer<Text, LongWritable,Text,LongWritable> {

    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
        long count=0l;
        //1.遍历集合,将集合中数字相加,得到V3
        for (LongWritable value : values) {
            count+=value.get();
        }
        //2.将K2和V3写入上下文中
        context.write(key,new LongWritable(count));
    }
}

剩下的代码太多,需要的同学可以到我的资源那里去下载,点击我的头像关注一下,然后进到我的主页,查看我的资源下载。

也可以点击下面的链接快速跳转到我的资源进行下载!
hadoop大实验源码

https://download.csdn.net/download/qq_38136372/87373323?spm=1001.2014.3001.5503

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是木子呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值