我试图在我的应用程序中实现一个智能搜索功能。Usecase:用户在文本框中输入搜索词
给我找一个来自巴西的28岁的基督教男性。
我需要将输入解析为一个映射,如下所示:
性别:男性年龄: 38 Location: Brazil: Christian
已经看了一眼: OpenNLP,交叉验证,Java模式匹配和Regex,信息提取。我搞不懂我需要更深入地研究哪一个。
对于这个特定的域,是否已经有java库可用?
发布于 2013-08-10 18:32:37
有一个从自由文本中提取结构化信息的API:http://wit.ai
你需要用一些你想要达到的目标来训练Wit。

发布于 2013-08-08 13:32:12
只是一种方法(我认为有很多方法可以做到这一点):将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当然你能做得更好。这只是一种方法。如果你想要做更准确的搜索,读一读莱文的距离。例如,如果有人将“巴西”改为“巴西”或“克里斯蒂安”,这将对你有所帮助。
发布于 2013-08-12 10:39:51
这是语言处理领域的一个相当大的研究领域:它被称为信息提取。如果是您想要的Java,门对IE有相当广泛的支持。
https://stackoverflow.com/questions/18127183
复制相似问题