spark + ansj 对大数据量中文进行分词

本文要解决的问题:

实现将Spark与中文分词源码(Ansj)相结合,进行一系列中文分词操作。


目前的分词器大部分都是单机服务器进行分词,或者使用hadoop mapreduce对存储在hdfs中大量的数据文本进行分词。由于mapreduce的速度较慢,相对spark来说代码书写较繁琐。本文使用 spark + ansj对存储在hdfs中的中文文本数据进行分词。

首先下载ansj源码文件,下载地址为https://github.com/NLPchina/ansj_seg,同时需要下载nlp-lang.jar包,下载地址上述网站中可以看到。由于spark传输数据必须进行序列化,而ansj中的属性类都没有实现序列化,需要将ansj_seg-master/src/main/java/org/ansj/domain中的属性类AnsjItem、Nature、 NewWord、NumNatureAttr、PersonNatureAttr、Term、TermNature、TermNatures分别实现 Serializable接口。然后使用maven的mvn install生成ansj_seg-2.0.8.jar包,将编译的ansj_seg-2.0.8.jar包 和之前下载的nlp-lang-0.3.jar包加入到spark依赖中,spark便可对hdfs中的文本进行分词。另外,将序列化后编译的jar上传至csdn,可以直接下载使用。

实例如下:

import org.apache.spark.SparkContext
import org.ansj.domain.Term
import org.ansj.splitWord.analysis.ToAnal
任务描述 本关任务:用SparkSQL的方法,用ANSJ分词器,拿出岗位要求中的技能,统计这些技能的出现次数,并将其存入MySQL的eduskill表中。 相关知识 为了完成本关任务,我们需要掌握: 什么是ANSJ分词器; 如何使用ANSJ分词器; 使用ANSJ分词分词后如何获取想要的词。 ANSJ介绍 这是一个基于n-Gram+CRF+HMM的中文分词的Java实现。分词速度达到每秒钟大约200万字左右(mac air下测试),准确率能达到96%以上。目前实现了中文分词中文姓名识别,用户自定义词典,关键字提取,自动摘要,关键字标记等功能。可以应用到自然语言处理等方面,适用于对分词效果要求高的各种项目。 ANSJ使用 ANSJ项目 项目的github地址:https://github.com/NLPchina/ansj_seg 项目的文档地址:http://nlpchina.github.io/ansj_seg/ ANSJ下载 可以从 http://maven.ansj.org/org/ansj/ 下载你需要的jar包。 用maven导入 <!-- https://mvnrepository.com/artifact/org.ansj/ansj_seg --> <dependency> <groupId>org.ansj</groupId> <artifactId>ansj_seg</artifactId> <version>5.1.6</version> </dependency> 分词调用方式 基本分词 基本就是保证了最基本的分词,词语颗粒度最非常小的,所涉及到的词大约是10万左右。 基本分词速度非常快。在macAir上,能到每秒300w字每秒。同时准确率也很高,但是对于新词他的功能十分有限。 功能: 用户自定义词典 数字识别 人名识别 机构名识别 新词发现 × √ × × × Result parse = BaseAnalysis.parse("让战士们过一个欢乐祥和的新春佳节。"); List<Term> baseParse =parse.getTerms(); result:[让/v, 战士/n, 们/k, 过/ug, 一个/m, 欢乐/a, 祥和/a, 的/uj, 新春/t, 佳节/n, 。/w] 精准分词(推荐) 精准分词ANSJ分词的店长推荐款。 它在易用性、稳定性、准确性、以及分词效率上都取得了一个不错的平衡。 如果你初次赏识ANSJ如果你想开箱即用,那么就用这个分词方式是不会错的。 功能: 用户自定义词典 数字识别 人名识别 机构名识别 新词发现 v √ v × × Result parse = ToAnalysis.parse("包括Hadoop、Spark 、Hive、Hbase、Kafaka、Flume、Sqoop等"); List<Term> toParse = parse.getTerms(); result:[包括/v, hadoop/en, 、/w, spark/en, , 、/w, hive/en, 、/w, hbase/en, 、/w, kafaka/en, 、/w, flume/en, 、/w, sqoop/en, 等/u] 根据词性获取想要的词 获取句子里词性为en的词: Result parse = ToAnalysis.parse("包括Hadoop、'Spark 、Hive、Hbase、Kafka、Flume、Sqoop等"); List<Term> toParse = parse.getTerms(); for (int i = 0; i < toParse.size(); i++) { String word = toParse.get(i).getName(); //拿到词 String natureStr = toParse.get(i).getNatureStr(); //拿到词性 if ("en".equals(natureStr)) { System.out.println(word); } } 输出: hadoop spark hive hbase Kafka flume sqoop 编程要求 根据提示,在右侧编辑器Begin-End处补充代码,用SparkSQL的方法,用ANSJ分词器,拿出岗位要求中的技能,统计这些技能的出现次数,并将其存入MySQL的eduskill表中。以下为代码package com; import org.ansj.domain.Result; import org.ansj.domain.Term; import org.ansj.splitWord.analysis.ToAnalysis; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.RowFactory; import org.apache.spark.sql.SparkSession; import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.StructField; import org.apache.spark.sql.types.StructType; import scala.Tuple2; import java.util.*; public class EduSkill { public static void main(String[] args) { SparkSession spark = SparkSession.builder().appName("cc").master("local").getOrCreate(); spark.sparkContext().setLogLevel("error"); /********** Begin **********/ //读取parquet文件 //获取到responsibility并采用分词分词获取en词性的词 //统计这个词出现的次数 //将JavaRDD转为Dataset //将结果存入MySQL /********** End **********/ } }
最新发布
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值