<!--
    ***************************************************************
    * Licensed to the Apache Software Foundation (ASF) under one
    * or more contributor license agreements.  See the NOTICE file
    * distributed with this work for additional information
    * regarding copyright ownership.  The ASF licenses this file
    * to you under the Apache License, Version 2.0 (the
    * "License"); you may not use this file except in compliance
    * with the License.  You may obtain a copy of the License at
    *
    *   http://www.apache.org/licenses/LICENSE-2.0
    * 
    * Unless required by applicable law or agreed to in writing,
    * software distributed under the License is distributed on an
    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    * KIND, either express or implied.  See the License for the
    * specific language governing permissions and limitations
    * under the License.
    ***************************************************************
--> 

<html> 
<head> 
  <title>Apache OpenNLP ${pom.version} Release Notes</title> 
</head> 
<body> 
<h1>Apache OpenNLP ${pom.version} Release Notes</h1> 
 
<h2>Contents</h2> 
<p> 
<a href="#what.is.opennlp">What is Apache OpenNLP?</a><br/> 
<a href="#major.changes">Major Changes in this Release</a><br/> 
<a href="#get.involved">How to Get Involved</a><br/> 
<a href="#report.issues">How to Report Issues</a><br/> 
<a href="#list.issues">List of JIRA Issues Fixed in this Release</a><br/> 
</p>  
   
<h2><a name="what.is.opennlp">1. What is Apache OpenNLP?</a></h2> 
<p>
The Apache OpenNLP library is a machine learning based toolkit for the processing of natural language text.
It supports the most common NLP tasks, such as tokenization, sentence segmentation,
part-of-speech tagging, named entity extraction, chunking, parsing, and coreference resolution.
These tasks are usually required to build more advanced text processing services.
OpenNLP also included maximum entropy and perceptron based machine learning.
</p>
<p>
The goal of the Apache OpenNLP project will be to create a mature toolkit for the above mentioned tasks.
An additional goal is to provide a large number of pre-built models for a variety of languages,
as well as the annotated text resources that those models are derived from.
</p>
<h2><a name="major.changes">Major Changes in this Release</a></h2> 
<p> 
Please see the <a href="README">README</a> for this information.
</p> 
  
<h2><a name="get.involved">How to Get Involved</a></h2> 
<p> 
The Apache OpenNLP project really needs and appreciates any contributions, 
including documentation help, source code and feedback.  If you are interested
in contributing, please visit <a href="http://opennlp.apache.org/">http://opennlp.apache.org/</a>
</p>
  
<h2><a name="report.issues">How to Report Issues</a></h2> 
<p> 
The Apache OpenNLP project uses JIRA for issue tracking.  Please report any 
issues you find at 
<a href="http://issues.apache.org/jira/browse/opennlp">http://issues.apache.org/jira/browse/opennlp</a> 
</p> 
  
<h2><a name="list.issues">List of JIRA Issues Fixed in this Release</a></h2>
<p>
Click <a href="issuesFixed/jira-report.html">issuesFixed/jira-report.html</a> for the list of 
issues fixed in this release.
</p>
</body> 
</html>