您现在的位置是:首页 > 文章详情

Spark中分布式使用HanLP(1.7.0)分词示例

日期:2019-05-07点击:418

HanLP分词,如README中所说,如果没有特殊需求,可以通过maven配置,如果要添加自定义词典,需要下载“依赖jar包和用户字典".
分享某大神的示例经验:
是直接"java xf hanlp-1.6.8-sources.jar" 解压源码,把源码加入工程(依赖本地jar包,有些麻烦,有时候到服务器有找不到jar包的情况)
按照文档操作,在Spark中分词,默认找的是本地目录,所以如果是在driver中分词是没有问题的。但是如果要分布式分词,是要把词典目录放在HDFS上面,因为这样每台机器才可以访问到 【参考代码】
最好把新增词典放在首位(没有放在首位好像没有生效).第一次使用时,HanLP会把新增txt文件,生成bin文件,这个过程比较慢。但是只需要跑一次,它会把bin文件写到HDFS路径上面,第二次以后速度就快一些了。
注意到issue中说,只可以在mapPartition中使用
参考scala代码
class HadoopFileIoAdapter extends IIOAdapter {

override def create(path: String): java.io.OutputStream = {

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_)

原文链接:https://yq.aliyun.com/articles/701590
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章