Apache OpenNLP ${pom.version} | |
=============================== | |
Building from the Source Distribution | |
------------------------------------- | |
At least Maven 3.0.0 is required for building. | |
To build everything go into the opennlp directory and run the following command: | |
mvn clean install | |
The results of the build will be placed in: | |
opennlp-distr/target/apache-opennlp-[version]-bin.tar-gz (or .zip) | |
What is in Similarity component in Apache OpenNLP ${pom.version} | |
--------------------------------------- | |
SIMILARITY COMPONENT of OpenNLP | |
1. Introduction | |
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. | |
2. Installation | |
Please refer to OpenNLP installation instructions | |
3. First use case of Similarity component: search | |
To start with this component, please refer to SearchResultsProcessorTest.java in package opennlp.tools.similarity.apps | |
public void testSearchOrder() runs web search using Bing API and improves search relevance. | |
Look at the code of | |
public List<HitBase> runSearch(String query) | |
and then at | |
private BingResponse calculateMatchScoreResortHits(BingResponse resp, String searchQuery) | |
which gets search results from Bing and re-ranks them based on computed similarity score. | |
The main entry to Similarity component is | |
SentencePairMatchResult matchRes = sm.assessRelevance(snapshot, searchQuery); | |
where we pass the search query and the snapshot and obtain the similarity assessment structure which includes the similarity score. | |
To run this test you need to obtain search API key from Bing at www.bing.com/developers/s/APIBasics.html and specify it in public class BingQueryRunner in | |
protected static final String APP_ID. | |
4. Solving a unique problem: content generation | |
To demonstrate the usability of Similarity component to tackle a problem which is hard to solve without a linguistic-based technology, | |
we introduce a content generation component: | |
RelatedSentenceFinder.java | |
The entry point here is the function call | |
hits = f.generateContentAbout("Albert Einstein"); | |
which writes a biography of Albert Einstein by finding sentences on the web about various kinds of his activities (such as 'born', 'graduate', 'invented' etc.). | |
The key here is to compute similarity between the seed expression like "Albert Einstein invented relativity theory" and search result like | |
"Albert Einstein College of Medicine | Medical Education | Biomedical ... | |
www.einstein.yu.edu/Albert Einstein College of Medicine is one of the nation's premier institutions for medical education, ..." | |
and filter out irrelevant search results. | |
This is done in function | |
public HitBase augmentWithMinedSentencesAndVerifyRelevance(HitBase item, String originalSentence, | |
List<String> sentsAll) | |
SentencePairMatchResult matchRes = sm.assessRelevance(pageSentence + " " + title, originalSentence); | |
You can consult the results in gen.txt, where an essay on Einstein bio is written. | |
These are examples of generated articles, given the article title | |
http://www.allvoices.com/contributed-news/9423860/content/81937916-ichie-sings-jazz-blues-contemporary-tunes | |
http://www.allvoices.com/contributed-news/9415063-britney-spears-femme-fatale-in-north-sf-bay-area | |
5. Solving a high-importance problem: filtering out meaningless speech recognition results. | |
Speech recognitions SDKs usually produce a number of phrases as results, such as | |
"remember to buy milk tomorrow from trader joes", | |
"remember to buy milk tomorrow from 3 to jones" | |
One can see that the former is meaningful, and the latter is meaningless (although similar in terms of how it is pronounced). | |
We use web mining and Similarity component to detect a meaningful option (a mistake caused by trying to interpret meaningless | |
request by a query understanding system such as Siri for iPhone can be costly). | |
SpeechRecognitionResultsProcessor.java does the job: | |
public List<SentenceMeaningfullnessScore> runSearchAndScoreMeaningfulness(List<String> sents) | |
re-ranks the phrases in the order of decrease of meaningfulness. | |
6. Similarity component internals | |
in the package opennlp.tools.textsimilarity.chunker2matcher | |
ParserChunker2MatcherProcessor.java does parsing of two portions of text and matching the resultant parse trees to assess similarity between | |
these portions of text. | |
To run ParserChunker2MatcherProcessor | |
private static String MODEL_DIR = "resources/models"; | |
needs to be specified | |
The key function | |
public SentencePairMatchResult assessRelevance(String para1, String para2) | |
takes two portions of text and does similarity assessment by finding the set of all maximum common subtrees | |
of the set of parse trees for each portion of text | |
It splits paragraphs into sentences, parses them, obtained chunking information and produces grouped phrases (noun, evrn, prepositional etc.): | |
public synchronized List<List<ParseTreeChunk>> formGroupedPhrasesFromChunksForPara(String para) | |
and then attempts to find common subtrees: | |
in ParseTreeMatcherDeterministic.java | |
List<List<ParseTreeChunk>> res = md.matchTwoSentencesGroupedChunksDeterministic(sent1GrpLst, sent2GrpLst) | |
Phrase matching functionality is in package opennlp.tools.textsimilarity; | |
ParseTreeMatcherDeterministic.java: | |
Here's the key matching function which takes two phrases, aligns them and finds a set of maximum common sub-phrase | |
public List<ParseTreeChunk> generalizeTwoGroupedPhrasesDeterministic | |
7. Package structure | |
opennlp.tools.similarity.apps : 3 main applications | |
opennlp.tools.similarity.apps.utils: utilities for above applications | |
opennlp.tools.textsimilarity.chunker2matcher: parser which converts text into a form for matching parse trees | |
opennlp.tools.textsimilarity: parse tree matching functionality | |
Requirements | |
------------ | |
Java 1.5 is required to run OpenNLP | |
Maven 3.0.0 is required for building it | |
Known OSGi Issues | |
------------ | |
In an OSGi environment the following things are not supported: | |
- The coreference resolution component | |
- The ability to load a user provided feature generator class | |
Note | |
---- | |
The current API contains still many deprecated methods, these | |
will be removed in one of our next releases, please | |
migrate to our new API. |