Apache OpenNLP

2/22/2017来源:ASP.NET技巧人气:2024

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