Apache OpenNLP

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
五、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值