2017-12-08 15 views
0

接続とコンマに基づいてツリーを分割したいと思います。たとえば、VP and VPまたはNP and NPまたはVP, VPまたはNP,NPの場合は、それぞれのVPまたはNPを別々に抽出したいと考えています。私は次のコードを持っています:スタンフォードパーサーのためにTregexを使用して接続詞で接続されたVP/NPを抽出する

List<Tree> subtrees = constituent.subTreeList(); 

       for (int i = 0; i < subtrees.size(); i++) { 
        String s = "@VP $+ CC $+ @VP"; 
        TregexPattern p = TregexPattern.compile(s); 
        TregexMatcher m = p.matcher(subtrees.get(i)); 
        while (m.find()) { 
         m.getMatch().pennPrint(); 
         Tree foundTree = m.getMatch(); 
         System.out.println(m.getMatch()); 
        } 
       } 

しかし、次のテキストでは機能しません。私のコードで何が間違っていますか?

(VP (VP (VB manage) (NP (NP (DT the) (JJ entire) (NN life) (NN cycle)) (PP (IN of) (NP (PRP$ your) (NNS APIs))))) (CC and) (VP (VB expose) (NP (PRP$ your) (NNS APIs)) (PP (TO to) (NP (JJ third-party) (NNS developers))))) 
+0

「動作しません」とはどういう意味ですか?どのような出力または例外が表示されますか?期待される成果は?また、なぜ各サブツリーに対してパターンをコンパイルしていますか? – dantiston

+0

@dantistonすべてのサブツリーに対してこれを繰り返すのは、すべてのVPまたはNPを連結詞と結びつけることを期待しているからです。問題は、コードが一致するものを見つけられないことです。パターンに何か問題がありますか? – user1419243

答えて

1

ここでの主な問題は、(tgrepとtgrep2の伝統以下)チェーンTregex関係は特別な非結合の意味を持っていることです:A r1 B r2 C [r3 D]A r1 BA r2 CA r3 Dを意味します。 (これは、通常、A < B < Cのコア使用例がB子とC子を持つAノードを意味することに意味があります。別のグループ化を得るには、括弧を使用する必要があります。"@VP $+ (CC $+ @VP)"

これは関係のリストの下にTregex Javadocで文書化されていますが、特に意味が典型的な数学的またはプログラミング言語の表現に比べて非常に非標準的であるため、これは簡単な間違いです。 @dantistonが指摘しているように、作成する必要があります。通常の正規表現のように、ループの外側でパターンをコンパイルする必要があります。また、Tregexをツリーのノードに対して反復処理するほうがはるかに優れています。すべてのサブツリーの完全なリストを作成します。ここにいくつかの良い例コードがあります:

Tree t2 = Tree.valueOf("(VP (VP (VB manage) (NP (NP (DT the) (JJ entire) (NN life) (NN cycle)) (PP (IN of) (NP (PRP$ your) (NNS APIs))))) (CC and) (VP (VB expose) (NP (PRP$ your) (NNS APIs)) (PP (TO to) (NP (JJ third-party) (NNS developers)))))"); 
List<Tree> trees = Collections.singletonList(t2); 

String s = "@VP $+ (@CONJP|CC $+ @VP)"; 
TregexPattern p = TregexPattern.compile(s); 
for (Tree t : trees) { 
    TregexMatcher m = p.matcher(t); 
    while (m.findNextMatchingNode()) { 
    Tree foundTree = m.getMatch(); 
    System.out.println(foundTree); 
    } 
} 
関連する問題