在我的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);
}
}
}
答案 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),以便您可以调整查询,以便您的代码为这些实体创建短语查询,而不是基于普通关键字查询(结果是你不会得到包含斯蒂芬或金的结果,但只包含斯蒂芬金的结果)。