Apache OpenNLP

本文介绍了 Apache OpenNLP 库,一种基于机器学习的自然语言处理工具包,支持常见的 NLP 任务如标记化、句子分割等。文中详细阐述了句子检测器的功能和使用方法,包括命令行工具及 API 的使用,同时还介绍了模型训练流程。
部署运行你感兴趣的模型镜像

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

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### Apache OpenNLP 介绍 Apache OpenNLP 是一套基于 Java 的机器学习工具包,用于处理自然语言文本。该库提供了多种功能来解析和理解人类语言,包括分词、句法分析、命名实体识别等功能[^1]。 ### 使用教程 为了更好地利用 Apache OpenNLP 进行开发工作,官方文档提供了一系列详细的指南帮助开发者快速上手。这些资源涵盖了从环境搭建到具体应用场景实现等多个方面的内容[^2]。 ### 下载与安装 对于希望使用预训练模型或参与贡献新模型的用户来说,可以从指定仓库获取所需文件。项目地址位于 [GitCode](https://gitcode.com/gh_mirrors/ope/opennlp-models),这里包含了多个版本的选择以及相关说明文档。 #### Maven依赖配置 如果是在Maven工程中集成OpenNLP,则可以在`pom.xml`加入如下依赖: ```xml <dependency> <groupId>org.apache.opennlp</groupId> <artifactId>opennlp-tools</artifactId> <version>1.9.3</version> </dependency> ``` ### 配置方法 完成下载之后,按照个人需求加载相应的模型文件即可开始调用API接口执行特定任务。通常情况下只需要确保JVM能够找到路径下的`.bin`格式的数据集就可以正常运行了。 ### 示例代码 下面给出一段简单的Java程序片段展示如何初始化并应用一个英语分词器实例: ```java import opennlp.tools.tokenize.TokenizerME; import opennlp.tools.tokenize.TokenizerModel; import java.io.InputStream; public class TokenizationExample { public static void main(String[] args)throws Exception{ // 加载模型流 InputStream modelIn = TokenizationExample.class.getResourceAsStream("/en-token.bin"); try (TokenizerModel model = new TokenizerModel(modelIn)) { TokenizerME tokenizer = new TokenizerME(model); String sentence = "This is a simple test."; String tokens[] = tokenizer.tokenize(sentence); System.out.println("Tokenized Output:"); for (String token : tokens){ System.out.print(token + " "); } } finally { if (modelIn != null) { modelIn.close(); } } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值