我正在尝试在我的应用程序中实现智能搜索功能。 用例:用户在文本框中输入搜索词
例如:找一位来自巴西的28岁基督徒男性。
我需要将输入解析为地图,如下所示:
性别:男性 年龄: 38 位置:巴西 Relegion: Christian
已经看过:OpenNLP,Cross Validate,Java Pattern Matching和Regex,Information Extraction。我很困惑哪一个我需要深入研究。
此特定域是否已有 java lib可用?
答案 0 :(得分:5)
答案 1 :(得分: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的距离。例如,如果有人将“Brasil”改为“Brazil”或“cristian”而不是“christian”,那将会对你有所帮助。
答案 2 :(得分:1)
这是一个非常庞大的语言处理研究领域:它被称为Information Extraction。如果它是你想要的Java,GATE对IE有非常广泛的支持。