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
try {
SentenceModel model = new SentenceModel(modelIn);
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (modelIn != null) {
try {
modelIn.close();
}
catch (IOException e) {
}
}
}
Usage: opennlp SentenceDetectorTrainer[.namefinder|.conllx|.pos] [-abbDict path] \
Arguments description:
-abbDict path
abbreviation dictionary in XML format.
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.
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
应用程序必须打开示例数据流
调用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
规则字典向每个令牌分配一个操作,该操作描述如何将其附加到一个连续字符序列。
可以将以下规则分配给令牌:
MERGE_TO_LEFT - 将令牌合并到左侧。
MERGE_TO_RIGHT - 将令牌合并到右侧。
RIGHT_LEFT_MATCHING - 将令牌合并到第一次出现的右侧和第二次出现的左侧。
下面的示例将演示如何使用小规则字典(插图格式,而不是xml数据格式)的detokenizer:
" RIGHT_LEFT_MATCHING
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