新发布1.7.0版本的hanlp天然语言处理工具包差很少已经有半年时间了,最近也是一直在整理这个新版本hanlp分词工具的相关内容。不过按照当前的整理进度,还须要一段时间再给你们详细分享整理的内容。昨天正好看到的这篇关于关于1.7.0版本hanlp分词在spark中的使用介绍的文章,顺便分享给你们一块儿学习一下!java
如下为分享的文章内容:服务器
HanLP分词,如README中所说,若是没有特殊需求,能够经过maven配置,若是要添加自定义词典,须要下载“依赖jar包和用户字典".maven
直接"java xf hanlp-1.6.8-sources.jar" 解压源码,把源码加入工程(依赖本地jar包,有些麻烦,有时候到服务器有找不到jar包的状况)分布式
按照文档操做,在Spark中分词,默认找的是本地目录,因此若是是在driver中分词是没有问题的。可是若是要分布式分词,是要把词典目录放在HDFS上面,由于这样每台机器才能够访问到 【参考代码】ide
最好把新增词典放在首位,第一次使用时,HanLP会把新增txt文件,生成bin文件,这个过程比较慢。可是只须要跑一次,它会把bin文件写到HDFS路径上面,第二次之后速度就快一些了。工具
注意到issue中说,只能够在mapPartition中使用。oop
参考scala代码学习
class HadoopFileIoAdapter extends IIOAdapter {spa
override def create(path: String): java.io.OutputStream = {scala
val conf: Configuration = new Configuration()
val fs: FileSystem = FileSystem.get(URI.create(path), conf)
fs.create(new Path(path))
}
override def open(path: String): java.io.InputStream = {
val conf: Configuration = new Configuration()
val fs: FileSystem = FileSystem.get(URI.create(path), conf)
fs.open(new Path(path))
}
}
def myfuncPerPartition_ ( iter : Iterator [String] ) : Iterator[(Int, mutable.Buffer[String])] = {
println("run in partition")
val keyWordNum = 6
HanLP.Config.IOAdapter = new HadoopFileIoAdapter
val ret = iter.filter(_.split(",",2).length==2)
.map(line=>(line.split(",",2)(1).trim.hashCode, HanLP.extractKeyword(line.split(",",2)(0),keyWordNum)
.map(str=>str.filterNot(stopChar.contains(_))).filter(w=>(w.length>1 || ( w.length==1 && white_single_word.contains(w(0))) ))
.filterNot(stopWords.contains(_)).take(keyWordNum).distinct))
ret
}
//调用
raw_data.repartition(100).mapPartitions(myfuncPerPartition_)
---------------------