专栏首页码匠的流水账使用opennlp自定义命名实体

使用opennlp自定义命名实体

本文主要研究一下如何使用opennlp自定义命名实体,标注训练及模型运用。

maven

        <dependency>
            <groupId>org.apache.opennlp</groupId>
            <artifactId>opennlp-tools</artifactId>
            <version>1.8.4</version>
        </dependency>

实践

训练模型

// train the name finder
        String typedEntities = "<START:organization> NATO <END>\n" +
                "<START:location> United States <END>\n" +
                "<START:organization> NATO Parliamentary Assembly <END>\n" +
                "<START:location> Edinburgh <END>\n" +
                "<START:location> Britain <END>\n" +
                "<START:person> Anders Fogh Rasmussen <END>\n" +
                "<START:location> U . S . <END>\n" +
                "<START:person> Barack Obama <END>\n" +
                "<START:location> Afghanistan <END>\n" +
                "<START:person> Rasmussen <END>\n" +
                "<START:location> Afghanistan <END>\n" +
                "<START:date> 2010 <END>";
        ObjectStream<NameSample> sampleStream = new NameSampleDataStream(
                new PlainTextByLineStream(new MockInputStreamFactory(typedEntities), "UTF-8"));

        TrainingParameters params = new TrainingParameters();
        params.put(TrainingParameters.ALGORITHM_PARAM, "MAXENT");
        params.put(TrainingParameters.ITERATIONS_PARAM, 70);
        params.put(TrainingParameters.CUTOFF_PARAM, 1);

        TokenNameFinderModel nameFinderModel = NameFinderME.train("eng", null, sampleStream,
                params, TokenNameFinderFactory.create(null, null, Collections.emptyMap(), new BioCodec()));

opennlp使用<START>及 <END>来进行自定义标注实体,命名实体的话则在START之后用冒号标明,比如<START:person>

参数说明

  • ALGORITHM_PARAMOn the engineering level, using maxent is an excellent way of creating programs which perform very difficult classification tasks very well.
  • ITERATIONS_PARAMnumber of training iterations, ignored if -params is used.
  • CUTOFF_PARAMminimal number of times a feature must be seen

使用模型

上面训练完模型之后,就可以使用该模型进行解析

      NameFinderME nameFinder = new NameFinderME(nameFinderModel);

        // now test if it can detect the sample sentences

        String[] sentence = "NATO United States Barack Obama".split("\\s+");

        Span[] names = nameFinder.find(sentence);

        Stream.of(names)
                .forEach(span -> {
                    String named = IntStream.range(span.getStart(),span.getEnd())
                            .mapToObj(i -> sentence[i])
                            .collect(Collectors.joining(" "));
                    System.out.println("find type: "+ span.getType()+",name: " + named);
                });

输出如下:

find type: organization,name: NATO
find type: location,name: United States
find type: person,name: Barack Obama

小结

opennlp的自定义命名实体的标注,给以了一定定制空间,方便开发者定制各自领域特殊的命名实体,以提高特定命名实体分词的准确性。

doc

  • opennlp-1.8.4-docs
  • OpenNLP进行中文命名实体识别(上:预处理及训练模型)
  • OpenNLP进行中文命名实体识别(下:载入模型识别实体)

本文分享自微信公众号 - 码匠的流水账(geek_luandun)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊artemis的ConnectionLoadBalancingPolicy

    本文主要研究一下artemis的ConnectionLoadBalancingPolicy

    codecraft
  • 聊聊nacos ServiceManager的UpdatedServiceProcessor

    本文主要研究一下nacos ServiceManager的UpdatedServiceProcessor

    codecraft
  • 聊聊nacos ServiceManager的UpdatedServiceProcessor

    本文主要研究一下nacos ServiceManager的UpdatedServiceProcessor

    codecraft
  • 使用plink进行连锁不平衡分析

    plink是进行连锁不平衡分析的常用工具之一,需要两个基本的输入文件,后缀分别为ped和map。ped文件格式在之前的文章中已经详细介绍过,这里只介绍map文件...

    生信修炼手册
  • 【快学springboot】1.快速创建springboot项目

    IDEA专业版默认集成了此工具,eclipse或者vs code等可以自行搜索安装。如果不希望安装此插件,也可直接通过官网创建spring boot项目,然后下...

    Happyjava
  • 【快学springboot】在springboot中写单元测试

    很多公司都有写单元测试的硬性要求,在提交代码的时候,如果单测通不过或者说单元测试各种覆盖率不达标,会被拒绝合并代码。写单元测试,也是保证代码质量的一种方式。

    Happyjava
  • 启动图第一篇教程

    对于基本的工程设置我就不多说了,可以参考我一键替换测试和正式key的专题,那里有介绍。

    君赏
  • VB.NET jsscript和vbscript脚本之间数据传递操作

    jsscript和vbscript脚本的数据传递的方法是一样的;只是脚本里面的对象稍有不同,需要深入学习请自行百度!

    巴西_prince
  • JavaEE中资源注入松耦合的实现 | 从开发角度看应用架构13

    上下文和依赖注入(CDI)规范是Java EE规范中的许多从属规范之一。虽然CDI是在Java EE 6中引入的,但CDI背后的概念已经出现在各种框架中,包括S...

    魏新宇
  • 数据库介绍以及使用

    第1章 数据库介绍 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以...

    Java学习

扫码关注云+社区

领取腾讯云代金券