ITPub博客

首页 > 人工智能 > 自然语言 > HanLP代码与词典分离方案与流程

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

原创 自然语言 作者:adnb34g 时间:2018-10-10 10:34:24 0 删除 编辑


之前在 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 的长度为 时,不用在 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



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31524777/viewspace-2215802/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
八年IT互联从业经历,专注网络营销、大数据、人工智能等领域的知识分享

注册时间:2018-03-09

  • 博文量
    70
  • 访问量
    23818