查看: 1379|回复: 0

[转载] Spark中分布式使用HanLP(1.7.0)分词示例

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2019-5-8 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表