2

StanfordCore-NLPパーサーを使用して次の出力を取得しています。次に、名詞とそれに対応する形容詞、またはその特定の名詞に関連する必要な情報を出力から抽出するにはどうすればよいですか。すべての名詞を形容詞とともに順番に抽出して、テキスト内のどの形容詞がどの名詞に関連しているかがわかるようにします。

例えば:

以下の出力から、名詞「Santosh」とそれに対応する形容詞「handsome」を抽出する必要があります。

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 
4

1 に答える 1

2

私はちょうどスタンフォード パーサーをいじり始めたばかりなので、これを一粒の塩と考えてください。

名詞とそれに対応する形容詞、またはその特定の名詞に関連する必要な情報を抽出するには、次のようにします。

文の構文木を生成します。(これを行う方法については、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」フラグメントを選択するコードを記述します。

たとえば、そのようなフラグメントの 1 つは (NP (JJ ハンサム) (NNP ジョー) (NNP ブロー)) です。

そのフラグメントを取得したら、関心のあるすべての形容詞とその他の修飾子を収集できます。コードの意味を知っておくと役に立ちます [ 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);
    }
}
于 2013-01-25T01:32:13.393 に答える