文档章节

HanLP代码与词典分离方案与流程

c
 cicido
发布于 2017/05/13 12:11
字数 809
阅读 217
收藏 1
之前在spark环境中一直用的是portable版本,词条数量不是很够,且有心想把jieba,swcs词典加进来,
其他像ik,ansi-seg等分词词典由于没有词性并没有加进来. 本次修改主要是采用jar包方包将词典目录
data与hanlp.properties合成一个data.jar文件.
1. pom.xml 过滤资源文件的配置
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>${maven-jar-plugin.version}</version>
        <configuration>
            <excludes>
                <exclude>**/*.properties</exclude>
            </excludes>
        </configuration>
       </plugin>
这里把properties文件从jar包文件中去掉,因而结果文件是没有properties文件的.
可根据需要来确定是否把properties加入jar包中.由于我打算把hanlp.properties与词典目录写在一起
这里是要过滤掉hanlp.properties文件

2. 修改hanlp.properties文件
root=
#将根目录置为空,或者注释掉root
CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; scws.txt; jieba.txt; 现代汉语补充词库.txt; 全国地名大全.txt ns; 人名词典.txt; 机构名词典.txt; 上海地名.txt ns;data/dictionary/person/nrf.txt nrf;
#增加更多的配置文件,这里增加了结巴分词,scws分词
#IOAdapter=com.hankcs.hanlp.corpus.io.FileIOAdapter
IOAdapter=com.hankcs.hanlp.corpus.io.JarIOAdapter
#修改IOAdapter,以便使用jar包形式加载词典


3. 修改HanLP.java
if ( root.length() != 0 && !root.endsWith("/")) root += "/";
当root的长度为0时,不用在root字符串后面添加'/'

4. 增加处理词典jar包的代码文件: JarIOAdapter.java

package com.hankcs.hanlp.corpus.io;

import java.io.*;

/**
 * 基于普通文件系统的IO适配器
 *
 * @author hankcs
 */
public class JarIOAdapter implements IIOAdapter
{
    @Override
    public InputStream open(String path) throws FileNotFoundException
    {
        /*
        采用第一行的方式加载资料会在分布式环境报错
        改用第二行的方式
         */
        //return ClassLoader.getSystemClassLoader().getResourceAsStream(path);
        return JarIOAdapter.class.getClassLoader().getResourceAsStream(path);
    }

    @Override
    public OutputStream create(String path) throws FileNotFoundException
    {
        return new FileOutputStream(path);
    }
}

在跑DemoStopWord时,发现
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoStopWord
报错,原因是接口不统一导致. 修改
DMAG.java如下:
   public MDAG(File dataFile) throws IOException
    {
        BufferedReader dataFileBufferedReader = new BufferedReader(new InputStreamReader(IOAdapter == null ?
                                                                                                 new FileInputStream(dataFile) :
                //IOAdapter.open(dataFile.getAbsolutePath())
                IOAdapter.open(dataFile.getPath())
                , "UTF-8"));
即可.


5. 如何将词典与配置文件打成一个jar包
最好是把txt格式的文件做成bin或dat格式的文件,然后做成jar包,否则打包运行后无法再写成bin或dat格式文件.
简单的办法是跑一下示例,即可生成相应的bin或dat格式文件.
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoAtFirstSight
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoChineseNameRecognition
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoJapaneseNameRecognition
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoPinyin
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoPlaceRecognition
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoOrganizationRecognition
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoTokenizerConfig #命名实体识别,包括上面的人名,地名等
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoTraditionalChinese2SimplifiedChinese
java -cp .:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoStopWord
或者用以下shell脚本完成
 :>a;while read cl; do echo $cl; echo "=========="$cl"=======" >>a;java -cp .:test.jar:hanlp-1.3.2.jar $cl 1>> a 2>&1;done < <(jar tvf test.jar | awk '$(NF)~"Demo"{print $(NF)}' | sed 's/.class$//;s/\//./g')

我们把data目录与hanlp.properties文件放在一个目录,比如xxx目录
cd xxx
jar cvf data.jar .
即可生成data.jar包

6. 如何运行
[dxp@Flyme-SearchTag-32-220 makeNewDict]$ ls
data.jar  hanlp-1.3.2.jar  README.md  test  test.jar
[dxp@Flyme-SearchTag-32-220 makeNewDict]$ java -cp data.jar:hanlp-1.3.2.jar:test.jar com.hankcs.demo.DemoAtFirstSight

7. 在spark中应用
IDE如(intellij idea)中maven项目
引入以下依赖:
        <dependency>
            <groupId>com.hankcs</groupId>
            <artifactId>hanlp</artifactId>
            <version>1.3.2</version>
            <scope>system</scope>
            <systemPath>${LocalPath}/hanlp-1.3.2.jar</systemPath>
        </dependency>

spark-submit提交任务时增加
--jar hanlp-1.3.2.jar,data.jar

© 著作权归作者所有

c
粉丝 0
博文 1
码字总数 809
作品 0
广州
私信 提问
自然语言处理hanlp的入门基础

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

左手的倒影
01/18
62
0
Hanlp在ubuntu中的使用方法介绍

HanLP的一个很大的好处是离线开源工具包,换而言之,它不仅提供免费的代码免费下载,而且将辛苦收集的词典也对外公开啦,此诚乃一大无私之举.我在安装的时候,主要参照这份博客: blog.csd...

左手的倒影
2018/12/10
10
0
HanLP Analysis for Elasticsearch

基于 HanLP 的 Elasticsearch 中文分词插件,核心功能: 兼容 ES 5.x-7.x; 内置词典,无需额外配置即可使用; 支持用户自定义词典; 支持远程词典热更新(待开发); 内置多种分词模式,适合...

大数据资讯
04/22
0
0
Spring Boot中对自然语言处理工具包hanlp的调用详解

概 述 HanLP 是基于 Java开发的 NLP工具包,由一系列模型与算法组成,目标是普及自然语言处理在生产环境中的应用。而且 HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点,...

左手的倒影
2018/11/21
42
0
自然语言处理工具hanlp自定义词汇添加图解

过程分析 1.添加新词需要确定无缓存文件,否则无法使用成功,因为词典会优先加载缓存文件 2.再确认缓存文件不在时,打开本地词典按照格式添加自定义词汇。 3.调用分词函数重新生成缓存文件,...

左手的倒影
01/27
26
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
6
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部