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

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

1、使用介绍python

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

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

第二种方法须要本身下载data数据文件,并经过一个配置文件hanlp.properties来管理各类依赖信息,其中最重要的是要人为指定data目录的家目录。(不建议你们一上来就使用这种方法,由于真心繁琐!)编辑器

2、经过第一种方法,创建maven工程,编写mapreduce完整程序以下(亲测运行良好):工具

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

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

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

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

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

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

其中myDictionary.txt是咱们本身建立的一个词典文件,其内容为:

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

注意,若是你不想显示/n /nr这样的记性,也能够将上述配置文件中最后一行

ShowTermNature=true

修改成

ShowTermNature=false

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

4、自定义词典文件 & 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 的博客(有小幅改遍)

相关文章
相关标签/搜索