写在前边的话:

本篇博客也是在做豆瓣电影数据的分析过程中,需要对影评信息和剧情摘要信息进行分析而写的一篇博客

以前学习hadoop时,感觉做中文分词也没那么麻烦,但是到了Spark,却碰到了诸多困难,但幸好最终都解决了这些问题,而得到了正确的结果,这里我们不解释具体的spark语法之类的,着重于解决中文分词统计这个问题

同步github地址:点击查看

1:Python+jieba

使用python版本的spark,首先想到的便是jieba分词,这里结合python的jieba分词和Spark对文件内容进行分词和词频统计,使用的样例数据依旧豆瓣电影的影评数据,这里只是采用了大鱼海棠的影评信息进行分词。

数据样例的格式如下:

26051523        根据真实事件改编,影片聚焦1973年智利政变时期,一对年轻的德国夫妇丹尼尔与莱娜反抗智利军政府统领、独裁者皮诺切特的故事。当时正值智利政变的高潮期,丹尼尔被皮诺切特的手下绑架到一个被称为“尊严殖民地”的秘密基地。那儿正是前德国纳粹分子逃亡智利所建的聚集地,而军政府武装进行着大量的刑讯工作与秘密人体实验,被绑架的人从来没有一个曾活着逃出“殖民地”。然而丹尼尔的妻子莱娜没有放弃,她找到了基地所在,并计划救出丈夫。

需要注意的是:如果去掉下面函数中的combine函数,则正常保存统计结果,显示的形式大致是这样的

而这里的combine函数就是为了解决这个问题,最终的统计结果为

#-*-coding:utf-8-*-
from pyspark import SparkConf, SparkContextimport jiebadef split(line):word_list = jieba.cut(line.strip().split("\t")[1])  #进行中文分词ls =[]for word in word_list:if len(word)>1:      #过滤掉单音节词ls.append(word)return lsdef combine(line):        #去除保存结果中的括号和解=解决中文编码显示的问题result = ""result +=line[0]+"\t"+str(line[1])   #让数字在前,方便统计return resultdef main(sc):text = sc.textFile("/file/douban_movie_data/movie_summary.txt")word_list = text.map(split).collect() #保存为列表count = sc.parallelize(word_list[0]) #返回列表中的第一个元素results = count.map(lambda w:(w,1)).reduceByKey(lambda x,y:x+y).map(combine).sortByKey().saveAsTextFile("/file/douban_movie_data/result")print "succeed"if __name__=="__main__":conf = SparkConf().setAppName("wordSplit")conf.setMaster("local")sc= SparkContext(conf = conf)main(sc)

2:Java+Scala+庖丁分词

网上搜了一遍,有使用ansj分词的,但是瞄了一遍,不懂,于是还是回归到了庖丁分词,整体的程序分为两部分,一个是java+庖丁分词程序,一个是scala提交spark的统计程序,具体代码和解释如下

至于如何使用Idea+Spark构建开发环境请移步:点击阅读

庖丁分词等中文分词比较请移步:点击阅读

这里需要注意的是:庖丁分词的字典库的配置问题(下图红线所示),正常情况下,程序打成jar包在spark集群上运行会报出各种错误,但主要是两个方面,一个是spark集群的内存问题(我用的是自己电脑的虚拟机,视具体配置而定),二是字典库的路径问题,我这里是把dic放在集群上每台机器的一个指定的相同的目录,同时把jar包在放在集群上的每台机器上

tokens.java

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;import net.paoding.analysis.analyzer.PaodingAnalyzer;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;public class tokens {public static List<String> anaylyzerWords (String str){// TODO Auto-generated method stub//定义一个解析器  Analyzer analyzer = new PaodingAnalyzer();//定义一个存放存词的列表List<String> list=new ArrayList<String>();//得到token序列的输出流TokenStream tokens = analyzer.tokenStream(str, new StringReader(str));try{Token t;while((t=tokens.next() ) !=null){list.add(t.termText());}}catch(IOException e){e.printStackTrace();}return list;}public static void main(String[] args){String text = "本思想就是在分词的同时进行句法、语义分析, 利用句法信息和语义信息来进行词性标注, " +"以解决分词歧义现象。因为现有的语法知识、句法规则十分笼统、复杂, 基于语法和规则的分词" +"法所能达到的精确度远远还不能令人满意, 目前这种分词系统还处在试验阶段。";List<String> list=tokens.anaylyzerWords(text);for(String s:list){System.out.println(s);}}
}  

Analyzer.scala

import org.apache.spark._
/*** Created by gaoyt on 2016/8/11.*/
object Analyzer {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("my app").setMaster("spark://192.168.48.130:7077")val sc = new SparkContext(conf)val outputPath = "/file/douban_movie_data/summary"sc.addJar("/home/master/SparkApp/WordAnalyzer.jar")sc.textFile("/file/douban_movie_data/movie_summary.txt").map(x => {val list=tokens.anaylyzerWords(x)list.toString.replace("[", "").replace("]", "").split(",")}).flatMap(x => x.toList).map(x => (x.trim(),1)).reduceByKey(_+_).saveAsTextFile(outputPath)}
}

最终的运行结果如下:

执行查看命令

/opt/hadoop/bin/hdfs dfs -cat /file/douban_movie_data/summary/part-00001

使用Python+jieba和java+庖丁分词在Spark集群上进行中文分词统计相关推荐

  1. pythonspark集群模式运行_有关python numpy pandas scipy 等 能在YARN集群上 运行PySpark

    有关这个问题,似乎这个在某些时候,用python写好,且spark没有响应的算法支持, 能否能在YARN集群上 运行PySpark方式, 将python分析程序提交上去? Spark Applicat ...

  2. Caught exception java.lang.interruptedException(在集群上进行多个文件合并压缩时出错)

    问题:将mapreduce程序打成JAR包提交给yarn集群,用hadoop命令启动后发现报以下错误: 原因:经检查后发现少了这一行代码,此代码的作用是通过传入的class,找到job的JAR包. 解 ...

  3. 如何在jieba分词中加自定义词典_常见中文分词包比较

    1 jieba jieba.cut 方法接受三个输入参数: 需要分词的字符串:cut_all 参数用来控制是否采用全模式:HMM 参数用来控制是否使用 HMM 模型 jieba.cut_for_sea ...

  4. spark集群使用hanlp进行分布式分词操作说明

    本篇分享一个使用hanlp分词的操作小案例,即在spark集群中使用hanlp完成分布式分词的操作,文章整理自[qq_33872191]的博客,感谢分享!以下为全文:   分两步: 第一步:实现han ...

  5. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) 本博客仅为作者记录笔记之用,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 博客虽水,然亦博主之苦劳也. 如需 ...

  6. 09_Flink入门案例、word-count程序(java和scala版本)、添加依赖、Flink Streaming和Batch的区别 、在集群上执行程序等

    1.9.Flink入门案例-wordCount 1.9.1.开发工具 1.9.2.编写java版本word-count程序 1.9.2.1.添加Flink Maven依赖 1.9.2.2.编写word ...

  7. Spark学习笔记(三):使用Java调用Spark集群

    我搭建的Spark集群的版本是2.4.4. 在网上找的maven依赖,链接忘记保存了.... <properties><project.build.sourceEncoding> ...

  8. 中文分词分类有哪些小黄鸡中文分词案例分析

    字符匹配 这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个"充分大的"机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词).按照扫描方向 ...

  9. 【11款最全最新】Java游戏开发项目合集(上)_Java项目实战_Java练手项目

    黄金矿工.俄罗斯方块.飞机大战.超级玛丽.坦克大战.飞翔的小鸟等等经典小游戏相信很多人都玩过.大家有没有想过亲自制作出这些小游戏呢? 今天给大家分享11款经典小游戏的Java开发教程,快来戳下方视频学 ...

最新文章

  1. 2017 JMP Discovery Summit China圆满落幕
  2. iOS - UIScrollView
  3. oracle数据库中sql%notfound的用法
  4. OpenCV(Open Source Computer Vision Library)简介
  5. unix 网络编程总结 二
  6. RayMarching1:用射线的方式画一个球
  7. JS 回调(CallBack)
  8. SQL Server数据导入导出的几种方法
  9. easyui事件方法onChange()、onSelect()、 onLoadSuccess()
  10. 智能音箱---TAS5754M 音频DSP 到Android
  11. 结合实际案例讲解系统分析方法
  12. Linux I2C 核心、总线、与设备驱动
  13. Linux XAMP is currently only availably as 32 bit application.
  14. 用AI视觉芯片打造舱内舱外全开放解决方案
  15. IC学习笔记3——异步FIFO
  16. springboot学习(七十一)解决问题:the URL contained a potentially malicious String “;“
  17. BlogBus居然没有人谈及‘魔方’
  18. PostgreSQL vs MySQL——哪种关系数据库更好?
  19. 电脑端上面完成转换的CAD转DWF格式如何进行分享?
  20. 第六周周工作总结及计划表

热门文章

  1. 入局生成式AI,看好亚马逊(AMZN)中期表现
  2. R语言之读取图片的方式总结
  3. 大型Java项目视频教程_大牛亲授DRP项目教程完整版
  4. 燃气表全国产化电子元件推荐方案
  5. Qt编写自定义控件3-速度仪表盘
  6. 2021年中国SUV产销量分析:销量达1010.1万辆,占汽车总销量的38.44%[图]
  7. upx 3.96版本编译
  8. 成信大C语言D1,网络空间安全学院成功举办C语言程序设计大赛
  9. 电商左侧商品分类菜单实现
  10. python视频教程黑马-python视频教程免费:求黑马程序员python教程?