2013-10-17 58 views
8

我將使用Stanford Corenlp 2013來查找短語頭。我看到了this thread使用Stanford Parser(CoreNLP)查找短語頭

但是,得到的答覆是,我不清楚,我不能添加任何評論繼續該線程。所以,我很抱歉重複。

我目前所面對的是什麼(使用斯坦福Corenlp)一個句子解析樹(我也試圖與它由斯坦福Corenlp創建CONLL格式)。而我所需要的正是名詞短語的頭腦。

我不知道我該如何使用依賴性和解析樹中提取nounphrases的頭。 我知道的是,如果我有nsubj (x, y),y是主題的頭。如果我有dobj(x,y),y是直接對象的頭部。 f我有iobj(x,y),y是間接對象的頭部。

不過,我不知道這辦法是找到所有短語頭的正確方法。如果是,我應該添加哪些規則以獲得所有名詞短語的頭像?

也許,這是值得一說的是,我需要名詞短語的頭在Java代碼。

回答

7

因爲我不能對切塔尼亞給出的答案評論,添加更多的他的答案在這裏。

斯坦福CoreNLP套房設有執行柯林斯頭取景啓發式和在

  1. 形式語義頭取景啓發式CollinsHeadFinder
  2. ModCollinsHeadFinder
  3. SemanticHeadFinder

所有你需要的是實例化三者之一併執行以下操作。

Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class); 
headFinder.determineHead(tree).pennPrint(out); 

您可以遍歷樹的節點並根據需要確定首字。

PS:我的答案是基於釋放的20140104.

這裏StanfordCoreNLP套件是一個簡單的DFS,可以讓你提取所有的名詞短語中心詞在句子中

public static void dfs(Tree node, Tree parent, HeadFinder headFinder) { 
     if (node == null || node.isLeaf()) { 
     return; 
     } 
     //if node is a NP - Get the terminal nodes to get the words in the NP  
     if(node.value().equals("NP")) { 

     System.out.println(" Noun Phrase is "); 
     List<Tree> leaves = node.getLeaves(); 

     for(Tree leaf : leaves) { 
      System.out.print(leaf.toString()+" "); 

     } 
     System.out.println(); 

     System.out.println(" Head string is "); 
     System.out.println(node.headTerminal(headFinder, parent)); 

    } 

    for(Tree child : node.children()) { 
     dfs(child, node, headFinder); 
    } 

} 
相關問題