spark scala 用ansj分词

本文介绍如何使用ANSJ分词器5.1.1版本进行中文文本分词处理,并结合Scala与Apache Spark实现大规模文本文件的高效分词。文中详细展示了如何添加自定义词典及停用词,以及通过Spark RDD进行分词的具体步骤。

本文编辑于2017.4.15,使用ansj最新的版本5.1.1分词

先要将ansj_seg-5.1.1.jar和nlp-lang-1.7.2.jar加入工程

ansj源码github:https://github.com/NLPchina/ansj_seg

ansj下载链接:https://oss.sonatype.org/content/repositories/releases/org/ansj/ansj_seg/

nlp-lang下载链接:https://oss.sonatype.org/content/repositories/releases/org/nlpcn/nlp-lang/


下面的scala代码展示:从一个文本文件中读入用户自定义的词、停用标点、用spark的RDD分词:

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import scala.io.Source
import org.ansj.splitWord.analysis.DicAnalysis
import org.ansj.library.DicLibrary
import org.ansj.recognition.impl.StopRecognition
import org.nlpcn.commons.lang.tire.library


object TextClassificationDemo {
  def main (args: Array[String]) {
    Logger.getLogger("org").setLevel(Level.OFF)
    System.setProperty("spark.ui.showConsoleProgress","False")
    //----添加自定义词典----
    val dicfile = raw"/xxx/xxx/ExtendDic" //ExtendDic为一个文本文件的名字,里面每一行存放一个词
    for (word <- Source.fromFile(dicfile).getLines) { DicLibrary.insert(DicLibrary.DEFAULT,word)} //逐行读入文本文件,将其添加到自定义词典中
    println("done")
    //----添加停用词----
    val filter = new StopRecognition()
    filter.insertStopNatures("w") //过滤掉标点
    //----先分一句话测试----
    val testsentence = DicAnalysis.parse("好喜欢《武林外传》这部电视剧!"). //用DicAnalysis分词,这是一个优先用户自定义词典分词的分词方式
      recognition(filter).  // 过滤停用词
      toStringWithOutNature("|") // 分词默认会打出词性,此语句用于不打出词性,并且分好的词用“|”隔开
    println(testsentence)
    // ----构建spark对象----
    val conf = new SparkConf().setAppName("TextClassificationDemo").setMaster("local[2]")
    val sc = new SparkContext(conf)
    //----读入要分词的文件----
    val filename = raw"/WorkSpace/TextClassificationDemo/data/SampleText.csv"    
    val CSVFile = sc.textFile(filename) // 用sc读入文件,此时文件的数据是RDD结构,注意textFile只能读UTF-8编码
    val splited = CSVFile.map( x => DicAnalysis.parse(x).recognition(filter).toStringWithOutNature("|") )
    splited.foreach(println) 
    println("done")  
  } 
}

任务描述 本关任务:用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、付费专栏及课程。

余额充值