如何编写有效的代码来提取名词短语?

时间:2012-12-13 01:31:43

标签: nlp

我正在尝试使用下面提到的带有POS标记的文本的规则来提取短语

1)NNP - > NNP( - >表示后面跟着) 2)NNP - > CC - > NNP 3)VP - > NP  等。

我已经用这种方式编写代码,有人可以告诉我如何以更好的方式做。

    List<String> nounPhrases = new ArrayList<String>();
    for (List<HasWord> sentence : documentPreprocessor) {

        //System.out.println(sentence.toString());
        System.out.println(Sentence.listToString(sentence, false));
        List<TaggedWord> tSentence = tagger.tagSentence(sentence);


        String lastTag = null, lastWord = null;
        for (TaggedWord taggedWord : tSentence) {
            if (lastTag != null && taggedWord.tag().equalsIgnoreCase("NNP") && lastTag.equalsIgnoreCase("NNP")) {
                nounPhrases.add(taggedWord.word() + " " + lastWord);
                //System.out.println(taggedWord.word() + " " + lastWord);

            }
            lastTag = taggedWord.tag();
            lastWord = taggedWord.word();
        }

    }

在上面的代码中,我只为NNP做了后续NNP提取,我如何推广它,以便我也可以添加其他规则。我知道有可用的库,但是想手动完成。

2 个答案:

答案 0 :(得分:1)

也许你应该尝试使用Chunker。您可以尝试OpenNLP Chunker。看起来你对POS使用相同的标签集。你可以在这里找到用法:

http://opennlp.apache.org/documentation/1.5.2-incubating/manual/opennlp.html#tools.chunker

输入示例:

Rockwell_NNP International_NNP Corp._NNP 's_POS Tulsa_NNP unit_NN said_VBD it_PRP signed_VBD a_DT tentative_JJ agreement_NN extending_VBG its_PRP$ contract_NN with_IN Boeing_NNP Co._NNP to_TO provide_VB structural_JJ parts_NNS for_IN Boeing_NNP 's_POS 747_CD jetliners_NNS ._.

输出:

[NP Rockwell_NNP International_NNP Corp._NNP ] [NP 's_POS Tulsa_NNP unit_NN ] [VP said_VBD ] [NP it_PRP ] [VP signed_VBD ] [NP a_DT tentative_JJ agreement_NN ] [VP extending_VBG ] [NP its_PRP$ contract_NN ] [PP with_IN ] [NP Boeing_NNP Co._NNP ] [VP to_TO provide_VB ] [NP structural_JJ parts_NNS ] [PP for_IN ] [NP Boeing_NNP ] [NP 's_POS 747_CD jetliners_NNS ] ._.

答案 1 :(得分:0)

现有的大多数库实现都会创建一个有限状态机来实现此功能。它们可靠,高效且开放。然而,一个非常天真的实现思路可以是在POS-Tag数组上制定正则表达式,然后使用偏移来标记短语。听起来合乎逻辑且简单,但可能不正确。