如何比较下面使用开放NLP的数据库列值的标记化文本?

时间:2017-05-23 11:21:25

标签: java mysql hibernate lucene opennlp

在我的java Web应用程序(Jsp + Servlet + hibernate)中,用户可以请求书籍。请求作为文本进入数据库。之后,我使用Apache Open NLP对文本进行标记。然后我需要将这些标记化的文本与书籍表(书籍表具有书籍ID,书名,作者,描述)进行比较,并向用户提供大多数相关的建议。大多数情况下,我需要将其与书名列和书籍描述栏进行比较。这可能吗?

import opennlp.tools.tokenize.SimpleTokenizer;  

public class SimpleTokenizerExample { 
    public static void main(String args[]){ 

        String sentence = "Hello Guys , I like to read horror stories. If you have any horror story books please share with us. Also my favorite author is Stephen King"; 

        //Instantiating SimpleTokenizer class 
        SimpleTokenizer simpleTokenizer = SimpleTokenizer.INSTANCE;  

        //Tokenizing the given sentence 
        String tokens[] = simpleTokenizer.tokenize(sentence);  

        //Printing the tokens 
        for(String token : tokens) {         
            System.out.println(token);  
        }       
    }  
}

2 个答案:

答案 0 :(得分:5)

Apache OpenNLP可以执行自然语言处理,但您描述的任务是信息检索。看看http://lucene.apache.org/solr/

如果您确实只需要使用数据库,则可以尝试使用LIKE sql关键字对每个令牌进行查询:

SELECT DISTINCT FROM mytable WHERE token IN description;

并对匹配较高的行进行排名。

OpenNLP如何为您提供帮助?

您可以使用OpenNLP Stemmer。在这种情况下,您可以在将其添加到数据库的列之前获取书籍描述和标题的主干。您还需要阻止查询。这将帮助你改变:“汽车”将匹配“汽车”,“汽车”。

您可以使用OpenNLP Lemmatizer完成相同的操作,但是您需要经过培训的模型,该模型目前无法用于该模块。

答案 1 :(得分:2)

只是为了补充@wcolen所说的内容,Lucene中的各种语言也存在一些开箱即用的词干。

OpenNLP可以帮助的另一件事是通过NameFinderTool识别书籍作者姓名(例如Stephen King),以便您可以调整查询,以便您的代码为这些实体创建短语查询,而不是基于普通关键字查询(结果是你不会得到包含斯蒂芬或金的结果,但只包含斯蒂芬金的结果)。