首页 > 学院 > 开发设计 > 正文

Apache OpenNLP

2019-11-08 20:20:44
字体:
来源:转载
供稿:网友

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表