2012-05-06 19 views
3

我正在通過Hobbs算法處理涉及照應解析的項目。我使用斯坦福分析器解析了我的文本,現在我想操作節點以實現我的算法。從解析樹中獲取某些節點

此刻,我不知道如何:

  • 訪問基於其POS標籤節點(例如我要開始用代詞 - 我如何得到所有代詞?)。

  • 使用遊客。我是一個Java的noob,但在C++中,我需要實現一個Visitor函數,然後處理它的鉤子。儘管我找不到斯坦福大學Parser's Tree的結構。那是jgrapht嗎?如果是這樣,你能給我提供一些指向代碼片段的指針嗎?

回答

10

@ DH​​G的回答能正常工作,但這裏有其他兩個選項,這也可能是有用的瞭解:

  • Tree類實現Iterable。您可以通過Tree的所有節點重複,或者嚴格地說,子樹的每個節點爲首,在一個前序遍歷,具有:

    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); 
    } 
    
+0

謝謝! .children()方法足以讓我在其上編寫一個BFS迭代器,但爲了將來的參考,爲什麼我jgrapht不兼容?我讀過你使用該庫建立你的樹結構,所以我認爲它應該是! 我需要的最後一件事就是獲取POS標籤標記的單詞 - 比如說我有t =(PRP他)。用t.label().value()我可以得到PRP,我怎麼得到「他」? 再次感謝您! =) – Tex

+0

哦,明白了。這只是孩子。都好! :D – Tex

+0

Tree類不使用jgrapht。 (雖然它已經以各種方式進行了改進,例如實現Iterable,但Tree類最初是針對JDK 1.1編寫的,在jgrapht存在之前,並且在某些方面顯示了它的年齡......)之前我們在依賴圖背後使用了jgrapht ,但最近已經離開它。我們的印象是,許多人傾向於較少的圖書館依賴。爲了得到這個單詞,你需要向'subtree.firstChild()。label()。value()'下一級。 –

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)] 
+0

謝謝!你能給我一些關於訪問這棵樹的更多信息嗎? 例如,t.children()是一次BFS訪問嗎? – Tex

+1

@Davide:'children'只返回孩子,所以你需要自己構建一個DFS或者BFS遍歷。請參閱[API文檔](http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/Tree.html)。 –

+0

還有一個問題:我用t.label()。value()得到POS標籤。我如何得到實際的單詞?即說我有t =(PRP he)。用t.label().value()我可以得到PRP,我怎麼得到「他」? – Tex