<!--
   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.
-->
README
=======
To install this Engine. 
Maven should be installed.

 dir/: the directory where it was code is present

1. Have a Stanbol running. 
2. Open terminal and go to /dir/.
3. run:  mvn clean compile install
4. Open a browser and open link  http://localhost:8080/system/console/bundles . 
5. then click install/Update button
6. on the pop up, check start bundle, click on browse and go to directory, select /dir/target/org.apache.stanbol.enhancer.engine.disambiguation.mlt-0.0.1-SNAPSHOT.jar  

you can see that entity disambiguation engine is installed.


TEST
------------------------

Before Installation of Engine if you input text

"Paris is a small city in the state of Texas".

It identifies Texas as state of US and Paris as Paris, France.


When the Entity disambiguation engine works on it to it correctly identifies Paris as Paris, Texas.

