1 什么是OpenNLP,其具有哪些"内功"?
OpenNLP是为何物?
维基百科:Apache OpenNLP库是一个基于机器学习的自然语言文本处理的开发工具包,它支持自然语言处理中一些共有的任务,例如:标记化、句子分割、词性标注、固有实体提取(指在句子中辨认出专有名词,例如:人名)、浅层分析(句字分块)、语法分析及指代。这些任务通常都需要较为先进的文字处理服务功能。
官方文档:Apache的OpenNLP库是自然语言文本的处理基于机器学习的工具包。它支持最常见的NLP任务,如断词,句子切分,部分词性标注,命名实体提取,分块,解析和指代消解。这些任务通常需要建立更先进的文字处理服务。OpenNLP还包括最大熵和基于感知机器学习。该OpenNLP项目的目标是创造上述任务的成熟工具包。一个附加的目的是提供一种大量预建模型为各种语言,以及这些模型衍生自注释文本资源。
- 开发者: Apache Software Foundation
- 稳定版本: 1.5.2-incubating(2011年11月28日,5年前)
- 开发状态: Active
- 编程语言: Java
- 类型: 自然语言处理
- 网站: http://incubator.apache.org/opennlp/
使用:其支持Windows、linux等多个操作系统,本文主要介绍Windows下:
1 命令行界面(CLI):OpenNLP脚本使用JAVA_CMD和JAVA_HOME变量,以确定哪些命令用来执行Java虚拟机。OpenNLP脚本使用OPENNLP_HOME变量来确定OpenNLP的二进制分发的位置。建议这个变量指向当前OpenNLP版本和更新PATH变量的二进制分发版包括$OPENNLP_HOME/bin or %OPENNLP_HOME%\bin。这样的配置允许方便调用OpenNLP。下面的例子假设这个配置已经完成。使用如下:当工具被执行这种方式,模型是装载和工具正在等待来自标准输入的输入。此输入处理,并打印到标准输出。
1 |
|
2 Java在控制台:进行其API的调用,以下代码演示均采用此法。
- 在官网(点击下载):apache-opennlp-1.5.3工具包
- 解压文件:(如:savepath\apache-opennlp-1.5.3\lib)将lib下文件拷贝项目中
- 去官网模型页面下载bin文件,下载需要的模型,具体如下:
- 然后去创建java程序做相应处理,诸如:分词、词性标注等。
3 示例:至此完成java配置,然后相对 "The quick, red fox jumped over the lazy, brown dogs." 一条句子进行分词,常规方法采用空格分词代码如下:
1 2 3 4 5 6 7 8 9 |
|
分词结果:
随着需求的改变,假如我想把标点也分开。实际这也是有意义的,可以通过标点确定句子的边界。下面OpenNLP将采用其方式完成,由此引入本文正题。
2 句子探测器
功能介绍:
句子检测器是用于检测句子边界。
句子探测器返回一个字符串数组。
API:句子探测器还提供了一个API来培养一个新的句子检测模型。三个基本步骤是必要的训练它:
- 应用程序必须打开一个示例数据流
- 调用SentenceDetectorME.train方法
- 保存SentenceModel到文件或直接使用它
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
运行结果:
3 标记生成器
功能介绍:该OpenNLP断词段输入字符序列为标记。常是这是由空格分隔的单词,但也有例外。例如,“isn't”被分割为“is”与“n't",因为它是AA简要格式”isn't“我们的句子分为以下标记:符号通常是词语,标点符号,数字等OpenNLP提供多种标记生成器的实现:
- 空白标记生成器 - 一个空白标记生成器,非空白序列被确定为符号
- 简单的标记生成器 - 一个字符类标记生成器,同样的字符类的序列标记
- 可学习标记生成器 - 一个最大熵标记生成器,检测基于概率模型符号边界
API:的断词可以被集成到由定义的API的应用程序。该WhitespaceTokenizer的共享实例可以从静态字段WhitespaceTokenizer.INSTANCE进行检索。该SimpleTokenizer的共享实例可以在从SimpleTokenizer.INSTANCE相同的方式进行检索。实例化TokenizerME(中可以学习标记生成器)符号模型必须先创建。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
运行结果:
4 名称搜索
功能介绍:名称查找器可检测文本命名实体和数字。为了能够检测实体名称搜索需要的模型。该模型是依赖于语言和实体类型这是训练。所述OpenNLP项目提供了许多这些各种免费提供的语料库训练有素预训练名取景模式。他们可以在我们的模型下载页进行下载。要查找原始文本的文本必须分割成符号和句子的名字。详细描述中的一句话探测器和标记生成器教程中给出。其重要的,对于训练数据和输入的文本的标记化是相同的。根据不同的模型可以查找人名、地名等实体名。
API:从应用程序中训练名字发现者的建议使用培训API而不是命令行工具。三个基本步骤是必要的训练它:
- 应用程序必须打开一个示例数据流
- 调用NameFinderME.train方法
- 保存TokenNameFinderModel到文件或数据库
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
运行结果:
5 POS标注器
功能介绍:语音标记器的部分标记符号与基于符号本身和符号的上下文中它们的相应字类型。符号可能取决于符号和上下文使用多个POS标签。该OpenNLP POS标注器使用的概率模型来预测正确的POS标记出了标签组。为了限制可能的标记的符号标记字典可以使用这增加了捉人者的标记和运行时性能。
API:部分的词类打标签训练API支持一个新的POS模式的培训。三个基本步骤是必要的训练它:
- 应用程序必须打开一个示例数据流
- 调用POSTagger.train方法
- 保存POSModel到文件或数据库
代码实现1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
运行结果1:
代码实现2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
运行结果2:
6 细节化
功能介绍:文本分块由除以单词句法相关部分,如名词基,动词基的文字,但没有指定其内部结构,也没有其在主句作用。
API:该概括化提供了一个API来培养新的概括化的模式。下面的示例代码演示了如何做到这一点:
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
运行结果:
7 分析器
功能介绍:尝试解析器最简单的方法是在命令行工具。该工具仅用于演示和测试。请从我们网站上的英文分块解析器模型,并用以下命令启动解析工具。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
运行结果: