////
   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.
////
= Powered by Apache OpenNLP
:jbake-type: page
:jbake-tags: download
:jbake-status: published
:idprefix:

Are you using Apache OpenNLP to do Natural Language Processing? Please do share your use cases. Developers of the project always are happy to learn about
 new happy users with interesting use cases.

## Commercial Use

### Air New Zealand Oscar chat bot

image::/img/use-cases/air_nz_wordmark-02_0.jpg["Air New Zealand logo",width=300px,link=https://www.airnewzealand.co.nz/]

========================================================================================
&ldquo;Air New Zealand uses OpenNLP to power its chatbot, Oscar. Launched in February 2017,
Oscar provides a conversational interface for customers to ask questions about flights,
amenities and policies. Using OpenNLP, we've been able to consistently provide over 50%
conversational success and support hundreds of intents.&rdquo;
========================================================================================

## Academic/Research Use

* https://memex.jpl.nasa.gov/IRI16-Gazetteer.pdf[An Automatic Approach for Discovering and Geocoding Locations in
   Domain-Specific Web Data] Chris A. Mattmann, Madhav Sharan

* https://arxiv.org/pdf/1610.00852.pdf[Ensemble Maximum Entropy Classification and Linear
                                       Regression for Author Age Prediction] Chris A. Mattmann, Paul Ramirez, Joey Hong

* https://arxiv.org/pdf/1701.09123.pdf[Robust Multilingual Named Entity Recognition with Shallow Semi-Supervised Features]
Rodrigo Agerri, German Rigau

* http://www.lrec-conf.org/proceedings/lrec2014/pdf/775_Paper.pdf[IXA pipeline: Efficient and Ready to Use
Multilingual NLP tools] Rodrigo Agerri, German Rigau, Josu Bermudez

* http://www.aclweb.org/anthology/S15-2127[EliXa: A modular and flexible ABSA platform] Rodrigo Agerri,
Inaki San Vicente, Xabier Saralegi

* http://www.aclweb.org/anthology/E14-1010[Simple, Robust and (almost) Unsupervised Generation of Polarity
                                           Lexicons for Multiple Languages] Rodrigo Agerri, Inaki San Vincente, German Rigau

* https://soccer.nci.nih.gov/soccer/[SOCcer (Standardized Occupation Coding for Computer-assisted Epidemiological Research)]
Russ DE, Ho K-Y, Colt JS, Freisen MC et.al

## Powered by Logos

Feel free to use our Powered by logos on your web sites:

image::/img/opennlp-poweredby.png[width=300px]

image::/img/opennlp-poweredby.svg[width=300px]
