////
   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.   
////
= FAQ
:jbake-type: page
:jbake-tags: maven
:jbake-status: published
:idprefix:

This list contains common questions asked in link:mailing-lists.html[mailing lists] and
https://stackoverflow.com/questions/tagged/opennlp[forums].

++++
<dl>

  <dt>Where can I download the models used in OpenNLP?</dt>
  <dd>They are hosted <a href="http://opennlp.sourceforge.net/models-1.5/">at SourceForge</a>.</dd>

  <dt></dt>
  <dd></dd>

  <dt>How to train a Named Entity Recognition (NER) model?</dt>
  <dd>To train the name finder model you need training data that contains the entities you would
  like to detect.
Have a look at our manual, in special the sections under the
<a href="/docs/2.1.1/manual/opennlp.html#tools.namefind.training">Name Finder Training API</a>.
At the beginning of that section you can see how the data has to be marked up. Please note you that you need many sentences to successfully train the name finder.</dd>

  <dt>How can I speed up my MaxEnt training time</dt>
  <dd>Try tweaking the value of <a href="/docs/2.1.1/apidocs/opennlp-tools/opennlp/tools/util/TrainingParameters.html#THREADS_PARAM">TrainingParameters.THREADS_PARAM</a>.</dd>

  <dt>Will my models trained with a previous version of OpenNLP still work with a newer version?</dt>
  <dd>You should expect it to work. The corpora used is normally the same. However, the behavior may
change when we fix bugs or add new features. The test results in the
<a href="https://cwiki.apache.org/confluence/display/OPENNLP/Test+Plans">project Wiki</a> may contain useful
information about model compatibility.</dd>

  <dt><strong>Is there a commercial license for OpenNLP?</strong></dt>
  <dd>OpenNLP is licensed under the business-friendly Apache software license,
version 2.0. You can read the license
<a href="http://www.apache.org/licenses/LICENSE-2.0">here</a>
or <a href="https://en.wikipedia.org/wiki/Apache_License">its Wikipedia page</a>
for more information.</dd>

  <dt><strong>How can I start contributing to this project?</strong></dt>
  <dd>Have a look at our <a href="/get-involved.html">Getting Involved</a> page.
We have a list of issues needing help there, as well as instructions to get started
contributing to OpenNLP. You may also consider making
<a href="https://www.apache.org/foundation/contributing.html">a donation to the Apache Software Foundation</a>.</dd>

</dl>
++++

In case you have a suggestion of another question that could be added, please do not hesitate in
link:/mailing-lists.html[getting in contact].