从字符串中提取信息的Java算法

时间:2013-08-08 13:22:54

标签: java machine-learning nlp opennlp information-extraction

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

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

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

性别:男性 年龄: 38 位置:巴西 Relegion: Christian

已经看过:OpenNLP,Cross Validate,Java Pattern Matching和Regex,Information Extraction。我很困惑哪一个我需要深入研究。

此特定域是否已有 java lib可用?

3 个答案:

答案 0 :(得分:5)

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

你需要用一些你希望实现的例子来训练Wit。

enter image description here

答案 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”或“c​​ristian”而不是“christian”,那将会对你有所帮助。

答案 2 :(得分:1)

这是一个非常庞大的语言处理研究领域:它被称为Information Extraction。如果它是你想要的Java,GATE对IE有非常广泛的支持。