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(); }
新闻热点
疑难解答