Hanlp分词1.7版本在Spark中分布式使用记录

 

新发布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_)

---------------------

相关文章
相关标签/搜索