#第一章 引言#
##概述##
Apache OpenNLP包是一个基于机器学习的工具,用于处理自然语言。它支持常用的NLP任务,例如分词(tokenization),句子切分(sentence segementation),命名试题提取(named entity extraction),chunking,句法分析(parsing),coreference resolution。要构建更加高级的文本处理服务,这些任务通常是必须的。OpenNLP还包括最大熵和基于感知的机器学习。
OpenNLP项目的目标是为上述任务创建一个成熟的工具集。另外一个目标是为各种各样的语言提供大量的预构建(pre-build)模型,和从这些模型派生的带注解的文本资源。
##通用包结构##
OpenNLP包括许多组件,让你可以构建一个完整的自然语言处理管道。这些组件包括:sentence detector, tokenizer, name finder, document categorizer, part-of-speech tagger, chunker, parser, coreference resolution。组件包含(不同的)部件,允许你执行独立的自然语言处理任务,例如训练一个模型,或者经常评估一个模型。通过他的API很容易理解他们的每一个工具。此外,(OpenNLP)提供了一个命令行(CLI),可以方便的进行试验和训练。
##API 通用例子##
OpenNLP组件具有相似的API。通常,执行一个任务,你应该提供一个模型和一个输入。
通常,通过为一个模型类的构造函数提供一个具有模型的FileInputStream来加载一个模型。
- InputStream modelIn = new FileInputStream("lang-model-name.bin");
-
- try {
- SomeModel model = new SomeModel(modelIn);
- }
- catch (IOException e) {
- //handle the exception
- }
- finally {
- if (null != modelIn) {
- try {
- modelIn.close();
- }
- catch (IOException e) {
- }
- }
- }
在模型被加载后,这个组件工具自身可以被实例化。
ToolName toolName = new ToolName(model);
在这个工具被实例化之后,这个处理任务可以被执行。对这个工具,输入输出格式是特定的,但是,通常,输出时一个String数组,输入是一个String或者String数组。
String output[] = toolName.executeTask("This is a sample text.");
##命令行接口 (CLI)##
###概述###
OpenNLP提供了一个命令行脚本,对它的所有工具来说作为一个独特的切入点。脚本位于OpenNLP二进制包的bin目录下。包含Windows版本:opennlp.bat和Linux以及Linux兼容的系统:opennlp。
###安装###
OpenNLP脚本使用JAVA_CMD和JAVA_HOME变量来决定使用哪一个命令来执行Java虚拟机。
OpenNLP脚本使用“OPENNLP_ HOME“变量来决定OpenNLP二进制包的位置。推荐使用这个变量指向当前OpenNLP版本二进制包,并且更新PATH变量,使其包含 $OPENNLP _HOME/bin 或者 %OPENNLP _ HOME%\bin 。
这样的配置允许方便的调用OpenNLP。下面的例子假设做了这样的配置。
###通用例子###
Apache OpenNLP提供了一个通用的命令行脚本来访问它所有的工具:
$ opennlp
这个脚本打印当前包的版本并且列出所有可用的工具:
- OpenNLP <VERSION>. Usage: opennlp TOOL
- where TOOL is one of:
- Doccat learnable document categorizer
- DoccatTrainer trainer for the learnable document categorizer
- DoccatConverter converts leipzig data format to native OpenNLP format
- DictionaryBuilder builds a new dictionary
- SimpleTokenizer character class tokenizer
- TokenizerME learnable tokenizer
- TokenizerTrainer trainer for the learnable tokenizer
- TokenizerMEEvaluator evaluator for the learnable tokenizer
- TokenizerCrossValidator K-fold cross validator for the learnable tokenizer
- TokenizerConverter converts foreign data formats (namefinder,conllx,pos) to native OpenNLP format
- DictionaryDetokenizer
- SentenceDetector learnable sentence detector
- SentenceDetectorTrainer trainer for the learnable sentence detector
- SentenceDetectorEvaluator evaluator for the learnable sentence detector
- SentenceDetectorCrossValidator K-fold cross validator for the learnable sentence detector
- SentenceDetectorConverter converts foreign data formats (namefinder,conllx,pos) to native OpenNLP format
- TokenNameFinder learnable name finder
- TokenNameFinderTrainer trainer for the learnable name finder
- TokenNameFinderEvaluator Measures the performance of the NameFinder model with the reference data
- TokenNameFinderCrossValidator K-fold cross validator for the learnable Name Finder
- TokenNameFinderConverter converts foreign data formats (bionlp2004,conll03,conll02,ad) to native OpenNLP format
- CensusDictionaryCreator Converts 1990 US Census names into a dictionary
- POSTagger learnable part of speech tagger
- POSTaggerTrainer trains a model for the part-of-speech tagger
- POSTaggerEvaluator Measures the performance of the POS tagger model with the reference data
- POSTaggerCrossValidator K-fold cross validator for the learnable POS tagger
- POSTaggerConverter converts conllx data format to native OpenNLP format
- ChunkerME learnable chunker
- ChunkerTrainerME trainer for the learnable chunker
- ChunkerEvaluator Measures the performance of the Chunker model with the reference data
- ChunkerCrossValidator K-fold cross validator for the chunker
- ChunkerConverter converts ad data format to native OpenNLP format
- Parser performs full syntactic parsing
- ParserTrainer trains the learnable parser
- BuildModelUpdater trains and updates the build model in a parser model
- CheckModelUpdater trains and updates the check model in a parser model
- TaggerModelReplacer replaces the tagger model in a parser model
- All tools print help when invoked with help parameter
- Example: opennlp SimpleTokenizer help
OpenNLP工具具有相似的命令行结构和选项。要发现工具选项,运行它,不带任务参数:
$ opennlp ToolName
这个工具将会输入两个帮助块。
第一块描述了这个命令行工具的通用结构:
Usage: opennlp TokenizerTrainer[.namefinder|.conllx|.pos] [-abbDict path] ... -model modelFile ...
这个命令行工具的通用结构包括必须的工具名(TokenizerTrainer),可选的格式参数([.namefinder|.conllx|.pos]),可选的参数([-abbDict path] ...)和必须的参数(-model modelFile ...)。
格式参数能够使直接处理非本地化数据,不用转换。每一个格式都有它自己的参数,如果相应的工具执行时不带参数或者带参数help,他们将会显示:
- $ opennlp TokenizerTrainer.conllx help
-
-
- Usage: opennlp TokenizerTrainer.conllx [-abbDict path] [-alphaNumOpt isAlphaNumOpt] ...
-
- Arguments description:
- -abbDict path
- abbreviation dictionary in XML format.
- ...
要转换当前格式,并制定一个特殊的格式,在工具名后面添加一个.,和格式的名字:
$ opennlp TokenizerTrainer.conllx -model en-pos.bin ...
第二个帮助信息块描述了独特的参数:
- Arguments description:
- -type maxent|perceptron|perceptron_sequence
- The type of the token name finder model. One of maxent|perceptron|perceptron_sequence.
- -dict dictionaryPath
- The XML tag dictionary file
- ...
大多数用于处理的工具都需要提供至少一个模型:
$ opennlp ToolName lang-model-name.bin
当工具通过这样方式执行,模型被加载,工具等待来自标准输入设备的输入。输入被处理,并且被打印到一个标准输出。
可以替代,或者说,最常用的使用方法是使用控制台输入输出重定向选项来提供一个输入或者输出文件:
$ opennlp ToolName lang-model-name.bin < input.txt > output.txt
大多数用于模型训练的工具需要首先提供一个模型名字,可选的一些训练选项(例如模型类型,迭代次数),和数据。
一个模型名称是一个文件名。
训练选项通常包括迭代次数,中断,abbreviations dictionary和其他一些东西。有时,可以通过一个训练选项文件提供这些选项。在这种情况下,这项选项将被忽略,并且来自文件的选项会被使用。
对于数据,你需要指定数据的路径(文件名),通常还需要指定语言和编码。
命令行下运行一个工具训练的通用例子大概是:
$ opennlp ToolNameTrainer -model en-model-name.bin -lang en -data input.train -encoding UTF-8
或者带格式:
- $ opennlp ToolNameTrainer.conll03 -model en-model-name.bin -lang en -data input.train \
- -types per -encoding UTF-8
大多数用于模型评估的工具类似于那些用于任务执行的工具,并且首先需要提供一个模型名字,可选的一些评估选项(例如是否打印被错误分类的例子),还有测试数据。命令行下运行一个评估的通用例子大概是:
$ opennlp ToolNameEvaluator -model en-model-name.bin -lang en -data input.test -encoding UTF-8