Apache OpenNLP库是一种基于机器学习的工具包,用于处理自然语言文本。

它支持最常见的NLP任务,如标记化,句子分割,词性标记,命名实体提取,分块,解析和参考解析。 通常需要这些任务来构建更高级的文本处理服务。 OpenNLP还包括基于最大熵和感知器的机器学习。

功能:

一、语句检测器

1、句子检测

OpenNLP句子检测器可以检测标点符号是否标记句子的结尾。 在这个意义上,句子被定义为两个标点符号之间的最长的白色空间修剪字符序列。 第一句和最后一句是这条规则的例外。 第一个非空白字符假定为一个句子的开头,最后一个非空白字符假定为一个句子结尾。下面的示例文本应该被分割成句子。

在检测到句子边界之后,每个句子被写在其自己的行中。

通常在文本被标记化之前完成语句检测,这是网站上预训练模型的训练方式,但也可以首先执行标记化,并让SentenceDetector处理已经标记化的文本。OpenNLP句子检测器不能基于句子的内容来识别句子边界。一个突出的例子是文章中的第一句,其中标题被错误地识别为第一句的第一部分。OpenNLP中的大多数组件期望输入被分段为句子。

2、句子检测工具

尝试Sentence Detector的最简单的方法是命令行工具。 该工具仅用于演示和测试。下载英语句子检测器型号,并使用以下命令启动Sentence Detector工具:

  $ opennlp SentenceDetector en-sent.bin

只需将示例文本从上面复制到控制台。Sentence Detector将读取它,并且每行回一个句子到控制台。 通常输入从文件读取,输出重定向到另一个文件。这可以通过以下命令实现。

 $ opennlp SentenceDetector en-sent.bin < input.txt > output.txt

         对于来自网站的英语句子模型,输入文本不应被标记化。
     3、句子检查API
         句子检测器可以通过其API轻松集成到应用程序中。要实例化Sentence Detector,必须首先加载句子模型。
         InputStream modelIn = new FileInputStream("en-sent.bin");

try {
               SentenceModel model = new SentenceModel(modelIn);
              }
              catch (IOException e) {
                      e.printStackTrace();
           }
        finally {
               if (modelIn != null) {
               try {
                    modelIn.close();
                    }
               catch (IOException e) {
            }
          }
       }

      加载模型后,SentenceDetectorME可以实例化。
      SentenceDetectorME sentenceDetector = new SentenceDetectorME(model);

      Sentence检测器可以输出一个字符串数组,其中每个String是一个句子。
     String sentences[] = sentenceDetector.sentDetect("  First sentence. Second sentence. ");
       
       结果数组现在包含两个条目。 第一个字符串是“第一句”。 第二个字符串是“第二个句子”。 删除输入字符串之前,之间和之后的空格。 API还提供了一种简单地返回输入字符串中句子的跨度的方法。
     
       Span sentences[] = sentenceDetector.sentPosDetect("  First sentence. Second sentence. ");
    
       结果数组还包含两个条目。第一个span位于索引2处,结束于17.第二个span从18开始,结束于34.实用程序方法Span.getCoveredText可用于创建仅覆盖该span中的字符的子字符串。
   二、句子检测器培训
1、培训工具
OpenNLP有一个命令行工具,用于训练各种语料库的模型下载页面提供的模型。 数据必须转换为OpenNLP Sentence Detector训练格式。每行一句。 空行表示文档边界。 在文档边界未知的情况下,其建议每隔十个句子具有空行。完全像上面的示例中的输出。 工具的用途:
             $ opennlp SentenceDetectorTrainer
 
             Usage: opennlp SentenceDetectorTrainer[.namefinder|.conllx|.pos] [-abbDict path] \
         
                [-params paramsFile] [-iterations num] [-cutoff num] -model modelFile \
            
                -lang language -data sampleData [-encoding charsetName]

Arguments description:


                       -abbDict path
                              abbreviation dictionary in XML format.
                      -params paramsFile
                             training parameters file.
                      -iterations num
                             number of training iterations, ignored if -params is used.
                      -cutoff num
                             minimal number of times a feature must be seen, ignored if -params is used.
                     -model modelFile
                             output model file.
                     -lang language
                             language which is being processed.
                    -data sampleData
                            data to be used, usually a file name.
                   -encoding charsetName
                           encoding for reading and writing text, if absent the system default is used.
          
        要训练英语句子检测器,请使用以下命令:
           $ opennlp SentenceDetectorTrainer -model en-sent.bin -lang en -data en-sent.train -encoding UTF-8

它应该产生以下输出:
 Indexing events using cutoff of 5

Computing event counts...  done. 4883 events
       Indexing...  done.
     Sorting and merging events... done. Reduced 4883 events to 2945.
     Done indexing.
     Incorporating indexed data for training...  
     done.
            Number of Event Tokens: 2945
   Number of Outcomes: 2
    Number of Predicates: 467
     ...done.
     Computing model parameters...
     Performing 100 iterations.
         1:  .. loglikelihood=-3384.6376826743144 0.38951464263772273
         2:  .. loglikelihood=-2191.9266688597672 0.9397911120212984
         3:  .. loglikelihood=-1645.8640771555981 0.9643661683391358
         4:  .. loglikelihood=-1340.386303774519 0.9739913987302887
         5:  .. loglikelihood=-1148.4141548519624 0.9748105672742167

...<skipping a bunch of iterations>...

95:  .. loglikelihood=-288.25556805874436 0.9834118369854598
         96:  .. loglikelihood=-287.2283680343481 0.9834118369854598
         97:  .. loglikelihood=-286.2174830344526 0.9834118369854598
         98:  .. loglikelihood=-285.222486981048 0.9834118369854598
         99:  .. loglikelihood=-284.24296917223916 0.9834118369854598
        100:  .. loglikelihood=-283.2785335773966 0.9834118369854598
     Wrote sentence detector model.
     Path: en-sent.bin

2、Training  API
   
      Sentence Detector还提供了一个API来训练新的句子检测模型。 基本上需要三个步骤来训练它:

应用程序必须打开示例数据流
 
          调用SentenceDetectorME.train方法

将SentenceModel保存到文件或直接使用它

以下示例代码说明了这些步骤:



       Charset charset = Charset.forName("UTF-8");
       ObjectStream<String> lineStream =
                 new PlainTextByLineStream(new FileInputStream("en-sent.train"), charset);
       ObjectStream<SentenceSample> sampleStream = new SentenceSampleStream(lineStream);

SentenceModel model;

try {
                 model = SentenceDetectorME.train("en", sampleStream, true, null, TrainingParameters.defaultParams());
      }
     finally {
                sampleStream.close();
     }

OutputStream modelOut = null;
    try {
              modelOut = new BufferedOutputStream(new FileOutputStream(modelFile));
              model.serialize(modelOut);
     } finally {
   if (modelOut != null) 
              modelOut.close();      
}

三、 Detokenizing

         Detokenizing是简单的相反的标记化,原始的非tokenized字符串应该从token的序列构造。 创建了OpenNLP实现以撤销令牌化器的训练数据的令牌化。 它也可以用于撤销这种训练的分词器的令牌化。 实现是严格基于规则的,并且定义如何将令牌附加到句子明智的字符序列。

规则字典向每个令牌分配一个操作,该操作描述如何将其附加到一个连续字符序列。

可以将以下规则分配给令牌:

MERGE_TO_LEFT - 将令牌合并到左侧。

MERGE_TO_RIGHT - 将令牌合并到右侧。

RIGHT_LEFT_MATCHING - 将令牌合并到第一次出现的右侧和第二次出现的左侧。

下面的示例将演示如何使用小规则字典(插图格式,而不是xml数据格式)的detokenizer:

        . MERGE_TO_LEFT
        " RIGHT_LEFT_MATCHING
      
                  该字典应该用于对以下空格标记化句子进行标记:
         
          He said " This is a test " .
          令牌将基于字典获得这些标签:

          He -> NO_OPERATION
          said -> NO_OPERATION
          " -> MERGE_TO_RIGHT
          This -> NO_OPERATION
          is -> NO_OPERATION
         a -> NO_OPERATION
         test -> NO_OPERATION
         " -> MERGE_TO_LEFT
         . -> MERGE_TO_LEFT

          这将导致以下字符序列:
          He said "This is a test".
       
          TODO:添加关于字典格式的文档以及如何使用API。
四、Detokenizing  API
五、

Apache OpenNLP相关推荐

  1. Apache OpenNLP提供的文档

    Apache OpenNLP提供了一个手册和Javadoc API文档. 本手册介绍了如何使用和培训各种OpenNLP组件. Apache OpenNLP 1.7.2文档 Apache OpenNLP ...

  2. Apache OpenNLP介绍(一)

    一.介绍 1.描述       Apache OpenNLP库是一种基于机器学习的工具包,用于处理自然语言文本.它支持最常见的NLP任务,如标记化,句子分割,词性标记,命名实体提取,分块,解析和参考解 ...

  3. Apache OpenNlp的初探

    Nlp:nature language processing.自然语言识别. 最近正好再做一个跟nlp有关的项目,正好就跟着了解了一下nlp的学习和使用以及原理. 先来说下使用.在这里笔者以在IDE中 ...

  4. Apache OpenNLP下载

    1.   进入官网  http://opennlp.apache.org/ (有时候早上可能访问不到,可以多刷新几次或者等一会儿在进入) 2.点击 download 注意:tar.gz归档包含长度超过 ...

  5. Apache OpenNLP(二)

    二.标记生成器 Tokenizer 1. 标记化 OpenNLP令牌器将输入字符序列分段成令牌. 令牌通常是字词,标点符号,数字等. 以下结果显示了以空格分隔表示的各个标记. OpenNLP提供多种t ...

  6. [NLP]OpenNLP Maven工程的依赖

    目录 OpenNLP Tools依赖 OpenNLP UIMA Annotators 依赖 OpenNLP Morfologik AddOn依赖 OpenNLP Brat Annotator依赖 Op ...

  7. OPENNLP——java的NLP工具

    Apache OpenNLP库是一个基于机器学习的自然语言文本处理的开发工具包,它支持自然语言处理中一些共有的任务,例如:标记化.句子分割.词性标注.固有实体提取(指在句子中辨认出专有名词,例如:人名 ...

  8. R+openNLP︱openNLP的六大可实现功能及其在R语言中的应用

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- openNLP是NLP中比较好的开源工具,R语 ...

  9. GitHub上整理的一些工具【转载】

    技术站点Hacker News:非常棒的针对编程的链接聚合网站Programming reddit:同上MSDN:微软相关的官方技术集中地,主要是文档类infoq:企业级应用,关注软件开发领域OSCh ...

最新文章

  1. seaborn系列(1) | 关系类图relplot用法
  2. ML之ECS:利用ECS的PAI进行傻瓜式操作机器学习的算法
  3. ds18b20温度转换指令_【Proteus】DS18B20简易温控器
  4. c++头文件包含技巧
  5. matlab resample上采样,resample matlab实现
  6. 发现Diolar 的边缘检测程序好像也有缺点
  7. Altium Designer入门教程:软件安装、中文设置与原件库配置
  8. 吉林大学计算机专硕和学硕的区别,在吉林大学在职研究生项目中专硕和学硕的区别是什么...
  9. google书签找回
  10. vue-路由篇页面跳转和页面参数传递
  11. gorm增删查改json_go基于echo、gorm实现增删改查,从请求到落库
  12. 星际争霸游戏战队案例分析
  13. 国信证券学习系列(4)
  14. Esp8266的Flash读写操作以及Flash上传文件
  15. 交叉编译生成可以在ARM64平台上运行的gcc
  16. Win10下安装Spark的尝试总结(尚未出坑)
  17. html页面推送功能的实现,想实现Web页面内容自动更新?你需要了解WEB实时推送技术!...
  18. 如何对多个版本的Word文档对比,查找变动删减的内容
  19. 《小说朗读器》又增新功能
  20. SQL Server 2000 安装文件挂起错误的解决办法

热门文章

  1. 「新手向」koa2从起步到填坑
  2. hdu 1251 统计难题 (字典树入门题)
  3. vmware虚拟机Centos安装samba全过程
  4. [Java]进程与线程的区别(转)
  5. WebForm与MVC模式优缺点
  6. DS博客作业02--线性表
  7. 使用seaborn制图(箱型图)
  8. Codeforces Round #413(Div. 1 + Div. 2, combined)——ABCD
  9. centos7使用记录
  10. 设计模式系列-代理模式