////
   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.   
////
= Apache OpenNLP 1.7.1 released
Apache OpenNLP
2017-01-23
:jbake-type: post
:jbake-tags: community
:jbake-status: published
:category: news
:idprefix:

The Apache OpenNLP team is pleased to announce the release of version 1.7.1 of Apache OpenNLP.

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.

The OpenNLP 1.7.1 binary and source distributions are available for download from our download page: <http://opennlp.apache.org/cgi-bin/download.cgi>

The OpenNLP library is distributed by Maven Central as well. See the Maven Dependency page for more details: <http://opennlp.apache.org/maven-dependency.html>

Requirements
------------

Java 1.8 is required to run OpenNLP
Maven 3.3.9 is required for building it

Building from the Source Distribution
-------------------------------------

To build everything execute the following command in the root folder:

   mvn clean install

The results of the build will be placed  in:
   opennlp-distr/target/apache-opennlp-1.7.1-bin.tar-gz (or .zip)

What is new in Apache OpenNLP 1.7.1
---------------------------------------

This release introduces many new features, improvements and bug fixes. 

Additionally the release contains the following noteworthy changes:

- Travis CI Integration
- Added support to LETSMT format
- All stdout can be disabled during training via verbose parameter
- Improved and extended evaluation tests
- Refactoring and cleanup of code base
- Code fully migrated to Java 8
- Added an improved GitHub README page

For a complete list of fixed bugs and improvements please see the RELEASE_NOTES file included in the distribution.


--The Apache OpenNLP Team