我正在尝试在我的应用程序中实现智能搜索功能。用例:用户在文本框中输入搜索词
例如:给我找一个来自巴西的 28 岁的基督徒男性。
我需要将输入解析为地图,如下所示:
性别:男 年龄: 38 地点:巴西 宗教:基督教
已经看过了:OpenNLP、交叉验证、Java 模式匹配和正则表达式、信息提取。我很困惑我需要深入研究哪一个。
这个特定域是否已经有任何java lib 可用?
我正在尝试在我的应用程序中实现智能搜索功能。用例:用户在文本框中输入搜索词
例如:给我找一个来自巴西的 28 岁的基督徒男性。
我需要将输入解析为地图,如下所示:
性别:男 年龄: 38 地点:巴西 宗教:基督教
已经看过了:OpenNLP、交叉验证、Java 模式匹配和正则表达式、信息提取。我很困惑我需要深入研究哪一个。
这个特定域是否已经有任何java lib 可用?
有一个从自由文本中提取结构化信息 (JSON) 的 API:http ://wit.ai
你需要用一些你想要达到的目标来训练智慧。
只是一种方法(我认为有很多方法可以做到这一点):将你分成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 的距离。例如,如果有人将“巴西”而不是“巴西”或“克里斯蒂安”而不是“基督教”,它将对您有所帮助。