专栏首页hadoop学习笔记MapReduce实现与自定义词典文件基于hanLP的中文分词详解
原创

MapReduce实现与自定义词典文件基于hanLP的中文分词详解

前言:

文本分类任务的第1步,就是对语料进行分词。在单机模式下,可以选择python jieba分词,使用起来较方便。但是如果希望在Hadoop集群上通过mapreduce程序来进行分词,则hanLP更加胜任。

一、使用介绍

hanLP是一个用java语言开发的分词工具, 官网是 http://hanlp.com/ 。 hanLP创建者提供了两种使用方式,一种是portable简化版本,内置了数据包以及词典文件,可通过maven来管理依赖,只要在创建的 maven 工程中加入以下依赖,即可轻松使用(强烈建议大家优先采用这种方法)。

具体操作方法如图示,在pom.xml中,加入上述依赖信息,笔者使用的IDEA编辑器就会自动开始解析依赖关系,并导入左下角的hanlp jar包。

第二种方法需要自己下载data数据文件,并通过一个配置文件hanlp.properties来管理各种依赖信息,其中最重要的是要人为指定data目录的家目录。(不建议大家一上来就使用这种方法,因为真心繁琐!)

二、通过第一种方法,建立maven工程,编写mapreduce完整程序如下(亲测运行良好):

三、添加自定义词典文件 & 单机模式

有时候我们希望根据自己业务领域的一些专有词汇进行分词,而这些词汇可能并不包含在官方jar包自带的分词词典中,故而我们希望提供自己的词典文件。首先,我们定义一个测试的句子,并用系统默认的词典进行分词,可看到效果如下图所示:

假设在我们的专业领域中,“词分”,“自试” 都是专业术语,那么使用默认词典就无法将这些目标词分出来了。这时就要研究如何指定自定义的词典,并在代码中进行调用。这时有2种方法。

1. 在代码中,通过CustomDictionary.add();来添加自己的词汇,如下图所示, 可以看到这次分词的结果中,已经能将“词分”,“自试” 单独分出来了。

假如说我们想添加的词汇较多呢,通过上面的方法,一个一个 add, 未勉显得不够优雅,这时我们就希望通过一个词典文件的形式来添加自定义词汇。在官方网站上,提供了如下一种方法。该方法要求我们单独下载一个data目录,以及定义一个配置文件。下面我们就来看下如何操作。

首先,下载好上面的hanlp.jar后,在java工程师导入该包。同时在src目录下创建一个hanlp.properties配置文件,内容直接复制官网上的内容,但是注意修改两个地方。

其中myDictionary.txt是我们自己创建的一个词典文件,其内容为:

这时候,再运行方法1同样的代码,可看到如下结果中,也将“词分”、“自试” 分了出来。

注意,如果你不想显示/n /nr这样的记性,也可以将上述配置文件中最后一行

ShowTermNature=true

修改为

ShowTermNature=false

注意,这时候,运行成功的话,会在词典目录下生成一个词典缓存文件

四、自定义词典文件 & mapreduce提交

写到这里,想必细心的人已经想到了,当我们希望将编辑好的mapreduce程序打成jar包,提交到集群上运行时,上面这种通过配置文件指定data目录的方法还可行吗? 反正我是没有搞定。理论上,要么我们需要把data上传到集群上每个节点,要么把data直接打到jar包中。但是,这两种方法本人尝试都没有成功。最终,跟一位同事相互讨论后,借鉴了对方的方法。即我们猜想,portable版本自带了data数据,且不需要额外指定配置文件。而我们现在想做的就是添加了一些自定义词汇,那么,是否我们将其中的词典缓存文件替换掉,就行了呢?动手试下才知道嘛。这次不通过maven来管理依赖,直接下载portable版本的jar包,然后打开压缩文件,删除data\dictionary\custom目录下的CustomDictionary.txt.bin文件,然后将上一步运行成功的CustomDictionary.txt.bin粘贴进去! 将工程打成jar包,再通过命令行进入其所在目录,执行java -jar  包名, 发现可以执行成功。然后,为了测试是否对这个绝对路径有依赖,我们故意将该jar包剪切到 d:\ , 再执行一下,发现同样是成功的。

具体到提交到集群上运行,我们就不赘述了。这个方法虽然土一些,但至少是可用的。

文章转载自 a_step_further 的博客(有小幅改遍)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自然语言处理hanlp的入门基础

    此文整理的基础是建立在hanlp较早版本的基础上的,虽然hanlp的最新1.7版本已经发布,但对于入门来说差别不大!分享一篇比较早的“旧文”给需要的朋友!

    IT小白龙
  • HanLP代码与词典分离方案与流程

    之前在spark环境中一直用的是portable版本,词条数量不是很够,且有心想把jieba,swcs词典加进来,

    IT小白龙
  • hadoop分布式集群环境搭建安装规划

    Hadoop分布式集群环境搭建是每个入门级新手都非常头疼的事情,因为你可能花费了很久的时间在搭建运行环境,最终却不知道什么原因无法创建成功。但对新手来说,运行环...

    IT小白龙
  • 微博要两年新增1亿月活,凭什么打破产品周期魔咒?

    微博发布了Q2财报,当季总营收达9.27亿元,同比增长36%;净利润为3550万美元,较去年同期增长225%。微博商业化表现亮眼,不过,更值得留意的是,微博用户...

    罗超频道
  • Leetcode 213. House Robber II

    版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn....

    Tyan
  • 数据分析:从PGONE事件中,你们看到了人性,我却看到了明星真实的粉丝数据

    明星的微博粉丝数量一直都是个谜,原因在于无论有多少人质疑明星在微博买粉丝数量,但是苦于一直没有证据,所以也就只是大家知道,粉丝不认而已,这也就是成谜了。备注:我...

    沉默的白面书生
  • 【聚焦】从“赵本山 20吨黄金”是怎么来的谈新闻传播的路径

    昨晚“赵本山”被大家在微博刷屏了,一大波“赵本山被抓,家中搜出20吨黄金”的微博扑面而来。正好睡不着,于是本数据分析师开始工作了。 分析关键词 这样...

    小莹莹
  • “搞垮” 微博服务器?每天上亿条用户推送是如何做到的

    想必国内绝大多数网民都有新浪微博的用户账号。据最新数据显示,2018 年第四季度财报,微博月活跃用户突破 4.62 亿,连续三年增长 7000 万 +;微博垂直...

    AI科技大本营
  • ERROR | [iOS] unknown: Encountered an unknown error (Could not find a `ios` simulator (valid values:

    os:Mac os Mojave10.14.4 Cocospod:1.6.0beta

    ZY_FlyWay
  • 跨域与跨设备的原理

    跨域是指不同网站之间,跨设备是指不同设备(电脑、手机、平板等)之间,基础都是打通识别用户,将不同触点/设备上用户的数据串联起来。

    GA小站

扫码关注云+社区

领取腾讯云代金券