<!--
    ***************************************************************
    * 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 Similarity component of Apache OpenNLP?</a><br/> 
<a href="#major.changes">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>
This component does text relevance assessment. It takes two portions of texts (phrases, sentences, paragraphs) and returns a similarity score.
Similarity component can be used on top of search to improve relevance, computing similarity score between a question and all search results (snippets). 
Also, this component is useful for web mining of images, videos, forums, blogs, and other media with textual descriptions. Such applications as content generation 
and filtering meaningless speech recognition results are included in the sample applications of this component.
   Relevance assessment is based on machine learning of syntactic parse trees (constituency trees, http://en.wikipedia.org/wiki/Parse_tree). 
The similarity score is calculated as the size of all maximal common sub-trees for sentences from a pair of texts (
www.aaai.org/ocs/index.php/WS/AAAIW11/paper/download/3971/4187, www.aaai.org/ocs/index.php/FLAIRS/FLAIRS11/paper/download/2573/3018,
www.aaai.org/ocs/index.php/SSS/SSS10/paper/download/1146/1448).
   The objective of Similarity component is to give an application engineer as tool for text relevance which can be used as a black box, no need to understand 
 computational linguistics or machine learning. 
</p>

<h2><a name="major.changes">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.hmtl</a> for the list of 
issues fixed in this release.
</p>
</body> 
</html>