如何从stanford解析器的输出中提取名词及其对应的形容词

时间:2013-01-18 05:24:30

标签: java stanford-nlp

我使用 Stanford Core-NLP解析器获得以下输出。现在我如何从输出中提取名词及其相应的形容词或任何与该特定名词相关的必要信息。我希望所有的名词都应该按顺序提取出来,以便我知道哪个形容词与文本中的哪个名词有关

例如:

我需要从下面的输出中提取名词“Santosh”及其相应的形容词“帅气”

nn(Santosh-2, Kosgi-1)
nsubj(handsome-4, Santosh-2)
cop(handsome-4, is-3)
root(ROOT-0, handsome-4)
aux(sent-6, has-5)
rcmod(handsome-4, sent-6)
det(email-8, an-7)
dobj(sent-6, email-8)
nn(University-11, Stanford-10)
prep_to(sent-6, University-11 

1 个答案:

答案 0 :(得分:2)

我刚开始用stanford解析器搞砸了,所以带上一粒盐。

我要做什么提取名词及其相应的形容词或与该特定名词相关的任何必要信息

为句子生成解析树。 (请参阅ParserDemo.java以了解如何执行此操作)。

https://wiki.csc.calpoly.edu/CSC-581-S11-06/browser/trunk/Stanford/stanford-parser-2011-04-20/src/edu/stanford/nlp/parser/lexparser/demo/ParserDemo.java?rev=2

解析树将如下所示:

  (ROOT
    (S
     (NP (JJ handsome) (NNP Joe) (NNP Blow))
     (VP (VBD sent)
      (NP (DT an) (NN email))
      (PP (TO to)
        (NP (PRP$ his) (JJ congressional) (NN representative))))))

这样的句子: 英俊的Joe Blow给他的国会代表发了一封电子邮件

然后你编写一些代码以递归方式下降到解析树并挑出'NP'片段。

例如,一个这样的片段是(NP(JJ帅)(NNP Joe)(NNP Blow))

一旦你有了这个片段,你就可以收集你感兴趣的所有形容词和任何其他修饰语。了解代码的含义是有帮助的。 [http://bulba.sdsu.edu/jeanette/thesis/PennTags.html]

我编写了一些代码来抓取解析树并提取内容...这可能会帮助您开始使用>

不能给你所有的代码,但这里有一些......

static {
    nounNodeNames = new ArrayList<String>();

    nounNodeNames.add( "NP");
    nounNodeNames.add( "NPS");
    nounNodeNames.add( "FW");
    nounNodeNames.add( "NN");
    nounNodeNames.add( "NNS");
    nounNodeNames.add( "NNP");
    nounNodeNames.add( "NNPS");
}


public  List<NounPhrase> extractPhrasesFromString(Tree tree, String originalString) {
    List<NounPhrase> foundPhraseNodes = new ArrayList<NounPhrase>();

    collect(tree, foundPhraseNodes);
    logger.debug("parsing " + originalString + " yields " + foundPhraseNodes.size() + " noun node(s).");
    if (foundPhraseNodes.size() == 0) {
        foundPhraseNodes.add(new NounPhrase(tree, originalString));
    }
    return  foundPhraseNodes;
}

private void collect(Tree tree, List<NounPhrase> foundPhraseNodes) {
    if (tree == null || tree.isLeaf()) {
        return;
    }


    Label label = tree.label();
    if (label instanceof CoreLabel) {
        CoreLabel coreLabel = ((CoreLabel) label);

        String text = ((CoreLabel) label).getString(CoreAnnotations.OriginalTextAnnotation.class);
        logger.debug(" got text: " + text);
        if (text.equals("THE")) {
            logger.debug(" got THE text: " + text);
        }

        String category = coreLabel.getString(CoreAnnotations.CategoryAnnotation.class);
        if (nounNodeNames.contains(category)) {
            NounPhrase phrase = null;
            String phraseString = flatten(tree);
            if ((phrase = stringToNounPhrase.get(phraseString)) == null) {
                phrase = new NounPhrase(tree, phraseString);
                stringToNounPhrase.put(phraseString, phrase);
            }

            if (! foundPhraseNodes.contains(phrase)) {
                logger.debug("adding found noun phrase to list: {}", phrase.debug());
                foundPhraseNodes.add(phrase);
            } else {
                logger.debug("on list already, so skipping found noun phrase: {}", phrase.debug());
            }
        }
    }


    List<Tree> kids = tree.getChildrenAsList();
    for (Tree kid : kids) {
        collect(kid, foundPhraseNodes);
    }
}