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

简介:

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

其他像ik,ansi-seg等分词词典由于没有词性并没有加进来. 本次修改主要是采用jar包方包将词典目录

datahanlp.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格式的文件做成bindat格式的文件,然后做成jar包,否则打包运行后无法再写成bindat格式文件.

简单的办法是跑一下示例,即可生成相应的bindat格式文件.

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

转载自cicido的个人空间

相关文章
|
3月前
|
自然语言处理 IDE 前端开发
5个可保存的在线代码片段平台推荐-变成自己的代码词典库
5个可保存的在线代码片段平台推荐-变成自己的代码词典库
46 0
|
3月前
|
数据库
Langchain中改进RAG能力的3种常用的扩展查询方法
有多种方法可以提高检索增强生成(RAG)的能力,其中一种方法称为查询扩展。我们这里主要介绍在Langchain中常用的3种方法
191 0
|
6月前
|
编解码 数据可视化 Java
3D模型拆分与合并展示,IVX真的可以简单实现
iVX 平台的优势和特点,包括逻辑完备性、操作流畅性、面向对象设计方法、可独立作为编程语言等方面的优势,下面来详细的介绍介绍。
72 0
|
5月前
|
机器学习/深度学习 自然语言处理 安全
【网安专题11.8】14Cosco跨语言代码搜索代码: (a) 训练阶段 相关程度的对比学习 对源代码(查询+目标代码)和动态运行信息进行编码 (b) 在线查询嵌入与搜索:不必计算相似性
【网安专题11.8】14Cosco跨语言代码搜索代码: (a) 训练阶段 相关程度的对比学习 对源代码(查询+目标代码)和动态运行信息进行编码 (b) 在线查询嵌入与搜索:不必计算相似性
156 0
|
11月前
|
数据采集 算法 数据可视化
MMdetection框架速成系列 第03部分:简述整体构建细节与模块+训练测试模块流程剖析+深入解析代码模块与核心实现
按照抽象到具体方式,从多个层次进行训练和测试流程深入解析,从最抽象层讲起,到最后核心代码实现,希望帮助大家更容易理解 MMDetection 开源框架整体构建细节
502 0
|
数据采集 自然语言处理 算法
java应用集成HanLP进行中文自然语言分词详细完整案例以及demo源码
java应用集成HanLP进行中文自然语言分词详细完整案例以及demo源码
49922 1
java应用集成HanLP进行中文自然语言分词详细完整案例以及demo源码
|
自然语言处理 PyTorch 算法框架/工具
离线解耦的文本表征方法(持续更新ing...)
本文仅介绍离线、解耦的、直接对文本进行表征的方法。分成通过词嵌入池化得到句子嵌入,和直接进行句子嵌入两种做法。主要用PyTorch实现。 本文将使用一个数据集来撰写相应代码,并使用简单的线性分类器来实现multi-class文本分类,分类模型的代码(我每个都是跟前面的文本表征部分直接写在同一个脚本里的)和各表征方法的效果在第4节展示。 本文使用的分词方式是jieba默认模式。其他注意事项看具体各分节内容。
离线解耦的文本表征方法(持续更新ing...)
|
自然语言处理 编译器 数据处理
数据加工DSL编译优化:搜索特定领域语言
背景面向数据加工领域的搜索DSL(特定领域语言,Domain-Specific Language)无需使用者编写较为复杂的通常程序语言,通过简洁的DSL即可实现复杂的搜索需求,具有较好的用户体验。搜索算子语法支持较为丰富,传统方案采用遍历AST(抽象语法树,Abstract Syntax Tree)的方式,根据当前的标识符类型执行对应操作。上述设计也就是常说的“解析执行”方案,由于每次都需要 “判
数据加工DSL编译优化:搜索特定领域语言
|
消息中间件 存储 JSON
一种面向数据加工DSL的代码翻译算法
背景面向数据加工领域的DSL(特定领域语言,Domain-Specific Language)无需使用者编写较为复杂的通常程序语言,具有较好的用户体验,应用较为广泛。如何将DSL翻译为机器可执行的程序是每种DSL均需面对的问题,并且传统的DSL翻译通常采用直译的方式,运行时执行效率较低。本文,提出一种面向数据加工领域语言的代码翻译算法,针对不同的DSL函数分别设计了代码翻译方案,不仅保证了语义的正
一种面向数据加工DSL的代码翻译算法
|
SQL 自然语言处理 算法
hanlp分词工具应用案例:商品图自动推荐功能的应用
本篇分享一个hanlp分词工具应用的案例,简单来说就是做一图库,让商家轻松方便的配置商品的图片,最好是可以一键完成配置的。先看一下效果图吧: 商品单个推荐效果:匹配度高的放在最前面 这个想法很好,那怎么实现了。
958 0