散仙在上篇文章中,介绍过如何使用Pig来进行词频统计,整个流程呢,也是非常简单,只有短短5行代码搞定,这是由于Pig的内置函数TOKENIZE这个UDF封装了单词分割的核心流程,当然,我们的需求是各种各样的,Pig的内置函数,仅仅解决了80%我们常用的功能,如果稍微我有一些特殊的需求,就会发现内置函数解决不了,不过也无需担忧,Pig开放了各个UDF的接口和抽象类,从加载,转换,过滤,存储等等,都有对应的实现接口,只要我们实现或继承它,就非常方便扩展。

本篇呢,散仙会使用Ansj分词器+Pig来统计中文的词频,Pig的TOKENIZE只支持对英文句子的切分,为什么呢?因为英文的句子非常工整,都是以空格作为分割符的,而相当于中文来说,则不一样,中文的切分,需要有词库支持,才能分割出一个个词汇,或者比较暴力一点的,直接根据算法进行Ngram,也不需要词库支持,但这样切分出来的词汇,可能大部分时候都不太友好,意义也不太大,目前比较不错的开源的分词器有ansj,ik,meseg4j等,随便选一款就行,散仙在这里用的ansj的分词器,有对ansj感兴趣的朋友,可以参考此处

分词器选好了,分词功能也实现了,下一步就该考虑如何把这个功能与Pig集成起来,其实答案也很明显,仿照Pig官方TOKENIZE源码,再写一个基于中文分词功能的UDF,就可以了,对Pig源码感兴趣的朋友可以参考这个链接,以Web的形式展示的源码,非常清晰直观。

关于如何在Pig中自定义UDF函数,可以参考散仙的这一篇文章: 
http://qindongliang.iteye.com/blog/2171303

下面给出,散仙扩展的基于中文分词的UDF类:

  1. package com.pigudf;
  2. import java.io.IOException;
  3. import java.util.List;
  4. import org.ansj.domain.Term;
  5. import org.ansj.splitWord.analysis.ToAnalysis;
  6. import org.apache.pig.EvalFunc;
  7. import org.apache.pig.backend.executionengine.ExecException;
  8. import org.apache.pig.data.BagFactory;
  9. import org.apache.pig.data.DataBag;
  10. import org.apache.pig.data.DataType;
  11. import org.apache.pig.data.Tuple;
  12. import org.apache.pig.data.TupleFactory;
  13. import org.apache.pig.impl.logicalLayer.schema.Schema;
  14. /**
  15. * 自定义UDF,实现Pig与中文分词集成
  16. * **/
  17. public class MyTokenize extends EvalFunc<DataBag> {
  18. /**tuple实例**/
  19. TupleFactory mTupleFactory = TupleFactory.getInstance();
  20. /**Bag实例*/
  21. BagFactory mBagFactory = BagFactory.getInstance();
  22. @Override
  23. public DataBag exec(Tuple input) throws IOException {
  24. try {
  25. DataBag output = mBagFactory.newDefaultBag();
  26. Object o = input.get(0);
  27. List<Term> terms=ToAnalysis.parse((String)o);//获取Ansj的分词
  28. for(Term t:terms){
  29. output.add(mTupleFactory.newTuple(t.getName()));//获取分词token,放入tuple,然后以bag的形式组装tuple
  30. }
  31. return output;
  32. } catch (ExecException ee) {
  33. // error handling goes here
  34. ee.printStackTrace();
  35. }
  36. return null;
  37. }
  38. /**描述scheaml形式*/
  39. public Schema outputSchema(Schema input) {
  40. try{
  41. Schema bagSchema = new Schema();
  42. bagSchema.add(new Schema.FieldSchema("token", DataType.CHARARRAY));
  43. return new Schema(new Schema.FieldSchema(getSchemaName(this.getClass().getName().toLowerCase(), input),
  44. bagSchema, DataType.BAG));
  45. }catch (Exception e){
  46. return null;
  47. }
  48. }
  49. }

UDF写完后,需打成一个jar包,然后在Pig脚本里注册jar包(依赖的jar包也需要注册,例如本例中的ansj的jar),关于如何打包,注册,请参考散仙上篇文章,不要问我上篇文章在哪里,就在这文章里。

最后,我们来看下一个实际例子的效果,,散仙本打算把此篇博客给分析一下,统计下词频,看看能不能,通过高频词,直接看出本文的主题,后来立马否决了,因为此刻还没写完,不理解的就跳过,最后,从网上找了篇新闻,感兴趣的可以阅读下,原内容如下: 

  1. 原标题:南水北调办主任回应境外抹黑:没什么可藏着掖着
  2. 【环球时报综合报道】1月14日,2015年南水北调工作会议在河南南阳召开,安排部署2015年南水北调工作。在媒体通气会上,国务院南水北调办主任鄂竟平对境外一些媒体对南水北调工程的抹黑作出了回应,南水北调办主要领导就移民补偿、国际交流等问题接受了《环球时报》记者的采访。
  3. 环球时报:关于丹江口移民率先的16倍补偿,这个标准是如何制定出来的?
  4. 国务院南水北调办征地移民司司长袁松龄:这个16倍的补偿措施是我们南水北调工程率先在全国范围内实行的,在南水北调之前,水利工程的补偿基本是8倍到10倍。然而在整个迁区规划工作来看,8倍10倍标准显然是太低。我们的规划也是以人为本,不让被征迁的移民吃亏,所以按照当时国家标准作参考,南水北调率先实施16倍补偿。东、中线移民工程永久征地是96万亩,临时用地45万亩,总体来讲,被征迁的群众对国家的政策是理解和支持的。
  5. 环球时报:资料中提到,南水北调移民过程中河南、湖北两省有18名干部因为过度劳累,牺牲在移民搬迁第一线,可否介绍下具体情况?
  6. 国务院南水北调办征地移民司司长袁松龄:我们34.5万移民的整体搬迁过程中,有近十万干部投入到组织工作上。在这十多年以来,先后有18名干部倒在工作岗位上。比如说,湖北有一个叫刘峙清的干部,就是由于工作劳累心脏病突发,倒在了工作岗位上。还有比如河南南阳淅川的干部也是这样。整个村的移民,在搬迁前的一个晚上,基本都是行李拉起来,车装好之后,点燃篝火,干部们就陪着,第二天把大家送走。基层的干部基本上每天都和移民们朝夕相处,在搬迁过程中得不到休息,而且很闹心。我们有很多这样的事迹。
  7. 环球时报:在南水北调工程中,我们是否借鉴过国外的一些经验,与其他国家的交流情况是怎样的?
  8. 国务院南水北调办主任鄂竟平:国外的工程,我们考察了几个,比如美国、德国、加拿大、西班牙等等。总的来说,引水工程中的过程管理有一些可以借鉴,比如说国外有的工程是以公益性地来管理,由政府托管,只按照成本来收取水费,即按照建设和维护这个工程花多少钱来收水费,让工程自身能良性运行,但不盈利。
  9. 咱们国家基本也是按照这个套路来弄的。
  10. 再有就是调水的生态问题,也是值得借鉴的,国外在调出区和调入区的生态上,都有一些说法。德国对一些生态方面的规定蛮具体的,比如这条河流,流量到什么数值就要调水了,到什么数字就不能调水了,规定得很具体,管理很精细。这方面咱们应该特别需要注意,尤其是北方一些地区,水资源特别珍贵,如果没有一个量的概念,就不是很好管。
  11. 对于境外一些媒体针对南水北调工程的抹黑,鄂竟平给予了回应,他表示,南水北调工程没有什么可藏着掖着的,为什么呢?因为它是一个积德的事儿。“北方一些地区的水资源已经紧缺到那样一个程度了,咱们把宝贵的水资源调来,叫老百姓能喝上好水,让生态环境不再恶化,大家生活在一个优美的环境里,这不是积德吗?一个积德的事有什么可藏着掖着的?”
  12. 鄂竟平强调,国务院的政策都是透明的,有多少钱、干多少事,达到什么目标都是透明的,媒体什么问题都可以问,都可以讨论。“一些境外的媒体,话说的让人真的不好理解,英国有家媒体,大致意思说‘南水北调是祸国殃民的,引的都是脏水,比如中线,想把水引到东北工业基地,还没到天津就不能用了’。我们从来就没有过‘把水引到东北老工业基地’的方案,有些境外媒体说这些话的时候,连事情都搞不清楚,不知道到底是什么居心。” (环球时报记者范凌志)

使用Pig分析完的部分topN结果如下:

  1. (,,77)
  2. (的,50)
  3. ( ,24)
  4. (是,24)
  5. (。,23)
  6. (南水北调,18)
  7. (在,14)
  8. (:,12)
  9. (工程,12)
  10. (移民,11)
  11. (有,11)
  12. (一些,9)
  13. (都,9)
  14. (了,9)
  15. (到,8)
  16. (水,8)
  17. ( ,8)
  18. (干部,7)
  19. (一个,7)
  20. (时报,7)
  21. (、,7)
  22. (工作,7)
  23. (中,7)
  24. (我们,7)
  25. (就,7)
  26. (着,7)
  27. (什么,7)
  28. (环球,7)
  29. (媒体,7)
  30. (不,6)
  31. (来,6)
  32. (?,6)
  33. (办,6)
  34. (境外,5)
  35. (补偿,5)
  36. (国务院,5)
  37. (很,5)
  38. (上,5)
  39. (过程,4)
  40. (引,4)
  41. (搬迁,4)
  42. (按照,4)

最后来解释下,在一篇文章里,最多的词无疑是标点符号,和一些副词了,这不仅在中文里是这样,在英文里同样是这样的,最多的词往往是a,the,an,this之类的,副词什么的,所以统计词频前,一般会过滤掉一些无意义的词,这些散仙就不细说了,相信搞过搜索和自然语言处理的人,都很清楚,从结果前几个结果来看,确实证明了标点和一些连词与副词的频率最高,终于在结果的第六行,出现了第一个有意义的高频词,南水北调,频率是18次,这直接反映了本文的主题,并与之相关,有意义的高频词,一般就是本文的重点介绍内容,这一点在我们的数据挖掘,关键词提取,自然语言处理中用的比较多。

最后总结一下重点:

(1)测试的文本,在使用前是需要传到HDFS上的。 
(2)注册jar包时,如果有依赖,也需要将依赖jar包注册在pig里。 
(3)在真实的应用中,统计分析前,最好将一些无用的数据给过滤掉。 


如果有什么疑问,欢迎扫码关注微信公众号:我是攻城师(woshigcs) 
本公众号的内容是有关大数据技术和互联网等方面内容的分享,也是一个温馨的技术互动交流的小家园,有什么问题随时都可以留言,欢迎大家来访! 

如何使用Pig集成分词器来统计新闻词频?的更多相关文章

  1. solr常用操作及集成分词器或cdh集群部署说明

    首先,如果是从http://lucene.apache.org/solr/下载的solr,基本都是自带集成的jetty服务,不需要单独搭建tomcat环境,但是要注意jdk版本,直接解压通过cmd命令 ...

  2. Elasticsearch系列---倒排索引原理与分词器

    概要 本篇主要讲解倒排索引的基本原理以及ES常用的几种分词器介绍. 倒排索引的建立过程 倒排索引是搜索引擎中常见的索引方法,用来存储在全文搜索下某个单词在一个文档中存储位置的映射.通过倒排索引,我们输 ...

  3. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  4. Solr学习笔记之2、集成IK中文分词器

    Solr学习笔记之2.集成IK中文分词器 一.下载IK中文分词器 IK中文分词器 此文IK版本:IK Analyer 2012-FF hotfix 1 完整分发包 二.在Solr中集成IK中文分词器 ...

  5. ES系列一、CentOS7安装ES 6.3.1、集成IK分词器

    Elasticsearch 6.3.1 地址: wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3. ...

  6. Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词

    一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在p ...

  7. solr 7+tomcat 8 + mysql实现solr 7基本使用(安装、集成中文分词器、定时同步数据库数据以及项目集成)

    基本说明 Solr是一个开源项目,基于Lucene的搜索服务器,一般用于高级的搜索功能: solr还支持各种插件(如中文分词器等),便于做多样化功能的集成: 提供页面操作,查看日志和配置信息,功能全面 ...

  8. Lucene介绍及简单入门案例(集成ik分词器)

    介绍 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和 ...

  9. (2)ElasticSearch在linux环境中集成IK分词器

    1.简介 ElasticSearch默认自带的分词器,是标准分词器,对英文分词比较友好,但是对中文,只能把汉字一个个拆分.而elasticsearch-analysis-ik分词器能针对中文词项颗粒度 ...

随机推荐

  1. Error: Cannot find module '@babel/core'

    报错如下 产生原因 babel-loader和babel-core版本不对应所产生的, babel-loader 8.x对应babel-core 7.x babel-loader 7.x对应babel ...

  2. Python学习笔记(一)——输入与输出

    输出:——print() Python中的输出使用print()完成 >>> 在屏幕中输出Hello World >>> print('Hello World') ...

  3. Android开发 View_自定义圆环进度条View

    前言 一个实现,空心圆环的自定义View,已经封装完好,可以直接使用. 效果图 代码 import android.content.Context; import android.graphics.C ...

  4. animation,transition,transform小练习

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. CF475F meta-universe

    题意:给你一个无限大矩形中有一些planet,每次可以选择某一没有planet的行或列分割开矩形(分割开以后要求矩形不为空).问最后能分割成几个矩形? 标程: #include<bits/std ...

  6. C++相对路径和绝对路径

    学习备忘 转自:http://www.cnblogs.com/vranger/p/3820783.html 电脑硬盘E盘下,建文件夹“test”,"test"下建立子文件夹“fil ...

  7. BIO、NIO、AIO入门认识

    同步.异步.阻塞.非阻塞概念理解. 同步: 比如在执行某个逻辑业务,在没有得到结果之前一直处于等待阻塞状态,得到结果后才继续执行 异步: 比如在执行某个逻辑业务,在没有得到结果可以去干其他的事情,等待 ...

  8. python3 enum模块

    枚举是绑定到唯一的常量值的一组符号名称(成员).在枚举中,成员可以通过身份进行比较,枚举本身可以迭代. 1.Enum模块 该模块定义了四个枚举类,可用于定义唯一的名称和值集:Enum,IntEnum, ...

  9. 「STL」bitset正传

    前言 之前一些需要转二进制来解决的题目我看到很多大佬用了bitset. 然而我并不会这东西.看上去很高级的样子…… 改题改累了来学习一下233. 正文 一.bitset的构造 bitset有三种构造方 ...

  10. 概率dp——期望水题hdu4405

    还是逆推,如果遇到跳板直接继承目标地的期望即可 #include<bits/stdc++.h> using namespace std; #define maxn 200005 doubl ...