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

2023-12-13 09:32

本文主要是介绍使用Python+jieba和java+庖丁分词在Spark集群上进行中文分词统计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前边的话:

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

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

        同步github地址:点击查看


1:Python+jieba

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

      数据样例的格式如下:

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

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

     

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

     

[html]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">#-*-coding:utf-8-*-  
  2. from pyspark import SparkConf, SparkContext  
  3.   
  4. import jieba  
  5.   
  6. def split(line):  
  7.     word_list = jieba.cut(line.strip().split("\t")[1])  #进行中文分词  
  8.     ls =[]  
  9.     for word in word_list:  
  10.         if len(word)>1:      #过滤掉单音节词  
  11.             ls.append(word)  
  12.     return ls  
  13.   
  14. def combine(line):        #去除保存结果中的括号和解=解决中文编码显示的问题  
  15.     result = ""  
  16.     result +=line[0]+"\t"+str(line[1])   #让数字在前,方便统计  
  17.     return result  
  18.   
  19. def main(sc):  
  20.     text = sc.textFile("/file/douban_movie_data/movie_summary.txt")  
  21.     word_list = text.map(split).collect() #保存为列表  
  22.     count = sc.parallelize(word_list[0]) #返回列表中的第一个元素  
  23.     results = count.map(lambda w:(w,1)).reduceByKey(lambda x,y:x+y).map(combine).sortByKey().saveAsTextFile("/file/douban_movie_data/result")  
  24.     print "succeed"  
  25.   
  26. if __name__=="__main__":  
  27.     conf = SparkConf().setAppName("wordSplit")  
  28.     conf.setMaster("local")  
  29.     scSparkContext(conf = conf)  
  30.     main(sc)</span>  


2:Java+Scala+庖丁分词

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

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

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

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

            

tokens.java

[html]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">import java.io.IOException;  
  2. import java.io.StringReader;  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import net.paoding.analysis.analyzer.PaodingAnalyzer;  
  7.   
  8. import org.apache.lucene.analysis.Analyzer;  
  9. import org.apache.lucene.analysis.Token;  
  10. import org.apache.lucene.analysis.TokenStream;  
  11.   
  12. public class tokens {  
  13.     public static List<String> anaylyzerWords (String str){  
  14.         // TODO Auto-generated method stub  
  15.         //定义一个解析器    
  16.         Analyzer analyzer = new PaodingAnalyzer();  
  17.         //定义一个存放存词的列表  
  18.         List<String> list=new ArrayList<String>();  
  19.         //得到token序列的输出流  
  20.         TokenStream tokens = analyzer.tokenStream(str, new StringReader(str));  
  21.         try{  
  22.             Token t;  
  23.             while((t=tokens.next() ) !=null){  
  24.                 list.add(t.termText());  
  25.             }  
  26.         }catch(IOException e){  
  27.             e.printStackTrace();  
  28.         }  
  29.         return list;  
  30.     }  
  31.   
  32.     public static void main(String[] args){  
  33.         String text = "本思想就是在分词的同时进行句法、语义分析, 利用句法信息和语义信息来进行词性标注, " +  
  34.                 "以解决分词歧义现象。因为现有的语法知识、句法规则十分笼统、复杂, 基于语法和规则的分词" +  
  35.                 "法所能达到的精确度远远还不能令人满意, 目前这种分词系统还处在试验阶段。";  
  36.         List<String> list=tokens.anaylyzerWords(text);  
  37.         for(String s:list){  
  38.             System.out.println(s);  
  39.         }  
  40.   
  41.     }  
  42. }  </span>  


Analyzer.scala
[html]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">import org.apache.spark._  
  2. /**  
  3.   * Created by gaoyt on 2016/8/11.  
  4.   */  
  5. object Analyzer {  
  6.   def main(args: Array[String]): Unit = {  
  7.     val conf = new SparkConf().setAppName("my app").setMaster("spark://192.168.48.130:7077")  
  8.     val sc = new SparkContext(conf)  
  9.     val outputPath = "/file/douban_movie_data/summary"  
  10.     sc.addJar("/home/master/SparkApp/WordAnalyzer.jar")  
  11.     sc.textFile("/file/douban_movie_data/movie_summary.txt").map(x => {  
  12.       val list=tokens.anaylyzerWords(x)  
  13.       list.toString.replace("[", "").replace("]", "").split(",")  
  14.     }).flatMap(x => x.toList).map(x => (x.trim(),1)).reduceByKey(_+_).saveAsTextFile(outputPath)  
  15.   
  16.   }  
  17. }</span>  

最终的运行结果如下:


执行查看命令

[html]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">/opt/hadoop/bin/hdfs dfs -cat /file/douban_movie_data/summary/part-00001</span>  

这篇关于使用Python+jieba和java+庖丁分词在Spark集群上进行中文分词统计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/487955

相关文章

Python将字库文件打包成可执行文件的常见方法

《Python将字库文件打包成可执行文件的常见方法》在Python打包时,如果你想将字库文件一起打包成一个可执行文件,有几种常见的方法,具体取决于你使用的打包工具,下面就跟随小编一起了解下具体的实现方... 目录使用 PyInstaller基本方法 - 使用 --add-data 参数使用 spec 文件(

Python MCPInspector调试思路详解

《PythonMCPInspector调试思路详解》:本文主要介绍PythonMCPInspector调试思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录python-MCPInspector调试1-核心知识点2-思路整理1-核心思路2-核心代码3-参考网址

IDEA之MyBatisX使用的图文步骤

《IDEA之MyBatisX使用的图文步骤》本文主要介绍了IDEA之MyBatisX使用,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录一、idea插件安装二、IDEA配置数据库连接(以mysql为例)三、生产基础代码一、idea插

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上

将图片导入Python的turtle库的详细过程

《将图片导入Python的turtle库的详细过程》在Python编程的世界里,turtle库以其简单易用、图形化交互的特点,深受初学者喜爱,随着项目的复杂度增加,仅仅依靠线条和颜色来绘制图形可能已经... 目录开篇引言正文剖析1. 理解基础:Turtle库的工作原理2. 图片格式与支持3. 实现步骤详解第

Python的pip在命令行无法使用问题的解决方法

《Python的pip在命令行无法使用问题的解决方法》PIP是通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载、更新等功能,安装诸如Pygame、Pymysql等Pyt... 目录前言一. pip是什么?二. 为什么无法使用?1. 当我们在命令行输入指令并回车时,一般主要是出现以

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线

Java Jackson核心注解使用详解

《JavaJackson核心注解使用详解》:本文主要介绍JavaJackson核心注解的使用,​​Jackson核心注解​​用于控制Java对象与JSON之间的序列化、反序列化行为,简化字段映射... 目录前言一、@jsonProperty-指定JSON字段名二、@JsonIgnore-忽略字段三、@Jso

MySQL中隔离级别的使用详解

《MySQL中隔离级别的使用详解》:本文主要介绍MySQL中隔离级别的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言undo log的作用MVCC的实现有以下几个重要因素如何根据这些因素判断数据值?可重复读和已提交读区别?串行化隔离级别的实现幻读和可