3

我正在尝试在我的应用程序中实现智能搜索功能。用例:用户在文本框中输入搜索词

例如:给我找一个来自巴西的 28 岁的基督徒男性。

我需要将输入解析为地图,如下所示:

性别:年龄: 38 地点:巴西 宗教:基督教

已经看过了:OpenNLP、交叉验证、Java 模式匹配和正则表达式、信息提取。我很困惑我需要深入研究哪一个。

这个特定域是否已经有任何java lib 可用?

4

3 回答 3

5

有一个从自由文本中提取结构化信息 (JSON) 的 API:http ://wit.ai

你需要用一些你想要达到的目标来训练智慧。

在此处输入图像描述

于 2013-08-10T18:32:37.320 回答
1

只是一种方法(我认为有很多方法可以做到这一点):将你分成String一个String[]并根据需要处理每个单词:

String str = "Find me a christian male 28 years old from Brazil";
for(String s : str.split(" ")){ //splits your String using space char
    processWord(s);
}

根据您的业务规则,应该在哪里processWord(s)做一些事情来确定是否s是关键字。

编辑:好吧,由于许多人认为这个答案不够,我将添加更多提示。

假设您有一个类,您在其中放置了一些搜索条件(假设您希望获得符合这些条件的人):

public class SearchCriteria {
    public void setGender(String gender){...}
    public void setCountry(String country){...}
    public void setReligion(String religion){...}
    ...
    public void setWatheverYouThinkIsImportant(String str){...}
}

正如@Sotirios 在他的评论中指出的那样,您可能需要一个匹配词池。假设您可以使用List<String>基本匹配词:

List<String> gender = Arrays.asList(new String[]{"MALE","FEMALE","BOY","GIRL"...});
List<String> country = Arrays.asList(new String[]{"ALGERIA","ARGENTINA","AUSTRIA"...});
List<String> religion = Arrays.asList(new String[]{"CHRISTIAN","JEWISH","MUSLIM"...});

现在我稍微修改processWord(s)一下(假设这个方法可以访问上面的列表):

public void processWord(String word, SearchCriteria sc){
    if(gender.contains(word.toUpperCase()){
        sc.setGender(word.toUpperCase());
        return;
    }
    if(country.contains(word.toUpperCase()){
        sc.setCountry(word.toUpperCase());
        return;
    }
    if(religion.contains(word.toUpperCase()){
        sc.setReligion(word.toUpperCase());
        return;
    }
    ....
}

最后,您需要处理用户的输入:

String usersInput = "Find me a christian girl 28 years old from Brazil"; //sorry I change "male" for "girl" but I like girls :P
SearchCriteria sc = new SearchCriteria();
for(String word : usersInput.split(" "){
    processWord(word, sc);
}
// do something with your SearchCriteria object

当然,您可以做得更好。这只是一种方法。如果您想更准确地进行搜索,请阅读有关 Levenshtein 的距离。例如,如果有人将“巴西”而不是“巴西”或“克里斯蒂安”而不是“基督教”,它将对您有所帮助。

于 2013-08-08T13:32:12.007 回答
1

这是语言处理中一个相当大的研究领域:它被称为信息提取。如果你想要的是 Java,GATE对 IE 有相当广泛的支持。

于 2013-08-12T10:39:51.403 回答