美文网首页
HanLP代码与词典分离方案与流程

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

作者: 惠洋热熔胶网膜 | 来源:发表于2018-10-10 09:32 被阅读41次

    之前在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

    转载自cicido的个人空间

    相关文章

      网友评论

          本文标题:HanLP代码与词典分离方案与流程

          本文链接:https://www.haomeiwen.com/subject/ozouaftx.html