【问题标题】:How to write efficient code for extracting Noun phrases?如何编写高效的代码来提取名词短语?
【发布时间】:2012-12-17 14:37:14
【问题描述】:

我正在尝试使用下面提到的规则来提取短语,这些规则已被 POS 标记

1) NNP -> NNP (-> 表示后跟) 2) NNP -> CC -> NNP 3) 副总裁 -> 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 提取,我如何对其进行概括,以便我也可以添加其他规则。我知道有库可用于执行此操作,但想手动执行此操作。

【问题讨论】:

    标签: nlp


    【解决方案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 ] ._.
    

    【讨论】:

    • 是的。正如我之前所说,想要手动进行而不使用这些库进行短语检测。
    • 是的,对不起。我没有阅读完整的问题。一旦我尝试手动执行此操作。我创建了一个可以识别葡萄牙语 NP 的有限状态机。与使用机器学习相比,结果并没有那么好。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2013-12-08
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多