3

Hobbs アルゴリズムによる照応解決を含むプロジェクトに取り組んでいます。スタンフォード パーサーを使用してテキストを解析しましたが、アルゴリズムを実装するためにノードを操作したいと考えています。

現時点では、次の方法がわかりません。

  • POS タグに基づいてノードにアクセスします (たとえば、代名詞から始める必要があります。すべての代名詞を取得するにはどうすればよいですか?)。

  • 訪問者を使用します。私は Java の初心者ですが、C++ では、Visitor ファンクターを実装してから、そのフックに取り組む必要がありました。ただし、Stanford Parser のツリー構造についてはあまり見つけられませんでした。それはjgraphtですか?もしそうなら、コード スニペットのポイントをいくつか教えていただけますか?

4

2 に答える 2

10

@dhgの答えはうまくいきますが、知っておくと役立つ可能性のある他の2つのオプションを次に示します。

  • Treeクラスは を実装しますIterableTreea のすべてのノード、または厳密には各ノードが先頭にあるサブツリーを、次の順序で走査して反復処理できます。

    for (Tree subtree : t) { 
        if (subtree.label().value().equals("PRP")) {
            pronouns.add(subtree);
        }
    }
    
  • tregexを使用して、いくつかの (潜在的に非常に複雑なパターン) を満たすノードだけを取得することもできますjava.util.regex。次のようなものがあります。

    TregexPattern tgrepPattern = TregexPattern.compile("PRP");
    TregexMatcher m = tgrepPattern.matcher(t);
    while (m.find()) {
        Tree subtree = m.getMatch();
        pronouns.add(subtree);
    }
    
于 2012-05-08T04:13:05.150 に答える
5

これは、文を解析してすべての代名詞を見つける簡単な例です。

private static ArrayList<Tree> findPro(Tree t) {
    ArrayList<Tree> pronouns = new ArrayList<Tree>();
    if (t.label().value().equals("PRP"))
        pronouns.add(t);
    else
        for (Tree child : t.children())
            pronouns.addAll(findPro(child));
    return pronouns;
}

public static void main(String[] args) {

    LexicalizedParser parser = LexicalizedParser.loadModel();
    Tree x = parser.apply("The dog walks and he barks .");
    System.out.println(x);
    ArrayList<Tree> pronouns = findPro(x);
    System.out.println("All Pronouns: " + pronouns);

}

これは印刷します:

    (ROOT (S (S (NP (DT The) (NN dog)) (VP (VBZ walks))) (CC and) (S (NP (PRP he)) (VP (VBZ barks))) (. .)))
    All Pronouns: [(PRP he)]
于 2012-05-07T02:43:02.200 に答える