在NLP的帮助下分析句子并提取人名,组织和位置

时间:2013-08-01 09:50:29

标签: java nlp stanford-nlp opennlp

我需要使用NLP解决以下问题,您能否指点一下如何使用OpenNLP API实现这一目标

一个。如何判断某句话是否暗示过去,现在或将来的某种行为。

(e.g.) I was very sad last week - past
       I feel like hitting my neighbor - present
       I am planning to go to New York next week - future

湾如何找到与个人,公司或国家相对应的单词

(e.g.) John is planning to specialize in Electrical Engineering in UC Berkley and pursue a career with IBM).

Person = John

公司= IBM

位置=伯克利

由于

2 个答案:

答案 0 :(得分:8)

我可以提供

的解决方案

解决方案b。

这是代码:

    public class tikaOpenIntro {

    public String Tokens[];

    public static void main(String[] args) throws IOException, SAXException,
            TikaException {

        tikaOpenIntro toi = new tikaOpenIntro();


        String cnt;

        cnt="John is planning to specialize in Electrical Engineering in UC Berkley and pursue a career with IBM.";

                toi.tokenization(cnt);

        String names = toi.namefind(toi.Tokens);
        String org = toi.orgfind(toi.Tokens);

                System.out.println("person name is : "+names);
        System.out.println("organization name is: "+org);

    }
        public String namefind(String cnt[]) {
        InputStream is;
        TokenNameFinderModel tnf;
        NameFinderME nf;
        String sd = "";
        try {
            is = new FileInputStream(
                    "/home/rahul/opennlp/model/en-ner-person.bin");
            tnf = new TokenNameFinderModel(is);
            nf = new NameFinderME(tnf);

            Span sp[] = nf.find(cnt);

            String a[] = Span.spansToStrings(sp, cnt);
            StringBuilder fd = new StringBuilder();
            int l = a.length;

            for (int j = 0; j < l; j++) {
                fd = fd.append(a[j] + "\n");

            }
            sd = fd.toString();

        } catch (FileNotFoundException e) {

            e.printStackTrace();
        } catch (InvalidFormatException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }
        return sd;
    }

    public String orgfind(String cnt[]) {
        InputStream is;
        TokenNameFinderModel tnf;
        NameFinderME nf;
        String sd = "";
        try {
            is = new FileInputStream(
                    "/home/rahul/opennlp/model/en-ner-organization.bin");
            tnf = new TokenNameFinderModel(is);
            nf = new NameFinderME(tnf);
            Span sp[] = nf.find(cnt);
            String a[] = Span.spansToStrings(sp, cnt);
            StringBuilder fd = new StringBuilder();
            int l = a.length;

            for (int j = 0; j < l; j++) {
                fd = fd.append(a[j] + "\n");

            }

            sd = fd.toString();

        } catch (FileNotFoundException e) {

            e.printStackTrace();
        } catch (InvalidFormatException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }
        return sd;

    }


    public void tokenization(String tokens) {

        InputStream is;
        TokenizerModel tm;

        try {
            is = new FileInputStream("/home/rahul/opennlp/model/en-token.bin");
            tm = new TokenizerModel(is);
            Tokenizer tz = new TokenizerME(tm);
            Tokens = tz.tokenize(tokens);
            // System.out.println(Tokens[1]);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

并且您想要位置,然后导入openNLP source Forge上可用的位置模型。您可以下载并可以使用它们。

我不确定名称,位置和组织提取的可能性,但几乎可识别所有名称,位置和组织。

如果找不到openNLP,那么使用Stanford Parser进行名称实体识别。

答案 1 :(得分:0)

找出句子的字面时态并不简单,但在某些情况下可行。 OpenNLP解析器将创建一个句子结构,您可以从中尝试提取头部动词,并且一些形态分析将告诉您动词是存在还是过去(英语),并且对于模型和#34;将&#34;在某些情况下会给你将来的时态。但它并不总是那么简单。例如,在&#34;去巴黎耗尽了我的银行账号&#34;,你有一个嵌入式事件(去巴黎),这在过去发生过,但要弄明白这一点很棘手。而你未来的例子(&#34;我正在计划......&#34;)需要对“&#34;计划&#34;”这个词有什么现实的理解。意思是,这很复杂。这类事情是自然语言处理研究的主题。