>>分享SPSS,Hadoop等大数据处理技术,以及分布式架构以及集群系统的构建 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 20272 个阅读者 刷新本主题
 * 贴子主题:  Hadoop中文词频统计 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2020-03-08 19:23:40     消息  查看  搜索  好友  邮件  复制  引用

                                                                                                

Hadoop中文词频统计

        学习Hadoop都免不了WordCount,但是都是最简单的例子,而且都是以空格为划分的英文词频的统计,相比于中文,英文的统计显得简单很多,因为中文涉及到很多语义及分词的不同,通常不好统计中文词频,即使是现在的技术,也没有完全能符合人们标准的中文词频统计工具出现,不过现阶段还是有可以使用的工具的,比如IK Analyzer,今天就来尝试一下。

         先感谢看到的博客指导:http://www.cnblogs.com/jiejue/archive/2012/12/16/2820788.html

1,实验环境

     hadoop 1.2.1

         java 1.7

         node:only one

2,数据准备

     这里采用的完结篇小说《凡人修仙传》,大概20MB,个人爱好。

3,实验过程

     1)修改WordCount代码,主要是应用IK Analyzer中文分词法,这是一个开源的工具,参考http://code.google.com/p/ik-analyzer/              

  1.       import java.io.IOException;
  2.       import java.io.InputStream;
  3.       import java.io.InputStreamReader;
  4.       import java.io.Reader;
  5.       import java.io.ByteArrayInputStream;
  6.       import org.wltea.analyzer.core.IKSegmenter;
  7.       import org.wltea.analyzer.core.Lexeme;
  8.       import org.apache.hadoop.conf.Configuration;
  9.       import org.apache.hadoop.fs.Path;
  10.       import org.apache.hadoop.io.IntWritable;
  11.       import org.apache.hadoop.io.Text;
  12.       import org.apache.hadoop.mapreduce.Job;
  13.       import org.apache.hadoop.mapreduce.Mapper;
  14.       import org.apache.hadoop.mapreduce.Reducer;
  15.       import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  16.       import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  17.       import org.apache.hadoop.util.GenericOptionsParser;
  18.       public   class  ChineseWordCount {
  19.             public  static   class  TokenizerMapper
  20.                  extends Mapper< Object,  Text,  Text,  IntWritable>{
  21.               private  final  static IntWritable one =  new IntWritable( 1);
  22.               private Text word =  new Text();
  23.                public  void  map  (Object key, Text value, Context context
  24.                               )  throws IOException, InterruptedException {
  25.                   byte[] bt = value.getBytes();
  26.                  InputStream ip =  new ByteArrayInputStream(bt);
  27.                  Reader read =  new InputStreamReader(ip);
  28.                  IKSegmenter iks =  new IKSegmenter(read, true);
  29.                  Lexeme t;
  30.                   while ((t = iks.next()) !=  null)
  31.                  {
  32.                      word.set(t.getLexemeText());
  33.                      context.write(word, one);
  34.                  }
  35.              }
  36.            }
  37.         public  static   class  IntSumReducer
  38.              extends Reducer< Text, IntWritable, Text, IntWritable> {
  39.           private IntWritable result =  new IntWritable();
  40.            public  void  reduce  (Text key, Iterable<IntWritable> values,
  41.                              Context context
  42.                              )  throws IOException, InterruptedException {
  43.             int sum =  0;
  44.             for (IntWritable val : values) {
  45.              sum += val.get();
  46.            }
  47.            result.set(sum);
  48.            context.write(key, result);
  49.          }
  50.        }
  51.          public  static  void  main (String[] args)  throws Exception {
  52.          Configuration conf =  new Configuration();
  53.          String[] otherArgs =  new GenericOptionsParser(conf, args).getRemainingArgs();
  54.           if (otherArgs.length !=  2) {
  55.            System.err.println( "Usage: wordcount <in> <out>");
  56.            System.exit( 2);
  57.          }
  58.          Job job =  new Job(conf,  "word count");
  59.          job.setJarByClass(ChineseWordCount.class);
  60.          job.setMapperClass(TokenizerMapper.class);
  61.          job.setCombinerClass(IntSumReducer.class);
  62.          job.setReducerClass(IntSumReducer.class);
  63.          job.setOutputKeyClass(Text.class);
  64.          job.setOutputValueClass(IntWritable.class);
  65.          FileInputFormat.addInputPath(job,  new Path(otherArgs[ 0]));
  66.          FileOutputFormat.setOutputPath(job,  new Path(otherArgs[ 1]));
  67.          System.exit(job.waitForCompletion( true) ?  0 :  1);
  68.        }
  69.      }

             2)为更方便查看任务进度,打包运行,注意要将IK Analyzer的包一起,我将打好的包以及工具包和测试文本都上传到共享http://pan.baidu.com/s/1jGwVSEy

         首先将测试文件上传到HDFS的input目录下,hadoop dfs -copyFromLocal part-all.txt input

         然后开始运行 hadoop jar chinesewordcount.jar input output

         等待运行完成,就不截图了。

         3)数据处理,因为生成的数据并没有排序,所以还是要进行一系列的处理                      

  1.      head words.txt
  2.      tail words.txt
  3.      sort -k2 words.txt > 0.txt
  4.      head  0.txt
  5.      tail  0.txt
  6.      sort -k2r words.txt> 0.txt
  7.      head  0.txt
  8.      tail  0.txt
  9.      sort -k2rn words.txt> 0.txt
  10.      head -n  50  0.txt
  11.      目标提取
  12.      awk  '{if(length($1)>=2) print $0}'  0.txt > 1.txt
  13.      最终显示结果
  14.      head  1.txt -n  200 | sed = | sed  'N;s/
    //'

       不过数据还是有很多单字的情况,这是很无用的,因此最终的记过可能还是要手动处理一下,最终的结果放到共享,有兴趣的可以查看下http://pan.baidu.com/s/1hqn66MC

4,总结

     中文分词果然比较复杂,只能说继续努力。。

                                                                                      
----------------------------
原文链接:https://blog.csdn.net/minglaihan/article/details/23601731

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-08 23:12:42 重新编辑]
  Java面向对象编程-->对象的生命周期
  JavaWeb开发-->JSP中使用JavaBean(Ⅱ)
  JSP与Hibernate开发-->使用JPA和注解
  Java网络编程-->通过JavaMail API收发邮件
  精通Spring-->创建综合购物网站应用
  Vue3开发-->Vue Router路由管理器
  一套可复用的方法论!从0-1搭建数据团队,看这篇就够了
  30岁女IT工程师感叹:靠这工具,把报表做成养老工作,月薪快...
  Spark配置redis的jar包
  playbook自动安装kafka集群
  合并两套环境的FastDFS数据
  spark DAGScheduler、TaskSchedule、Executor执行task源码分...
  hadoop从零开始--HDFS篇
  如何设计实时数据平台(设计篇)-wx5c2da66615f74的博客
  大数据虚拟混算平台Moonbox配置指南
  大数据平台CDH搭建
  Spark Thrift JDBCServer应用场景解析与实战案例
  大数据采集、清洗、处理:使用MapReduce进行离线数据分析完整...
  深入剖析Hadoop HBase
  SQL Hadoop核心结束揭秘
  SSH免除免密登录的配置
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。