2013-10-17 8 views
8

私はフレーズヘッドを見つけるためにスタンフォードCorenlp 2013を使用します。私はthis threadを見た。スタンフォードパーサー(CoreNLP)を使用してフレーズヘッドを検索

しかし、その答えは私には分かりませんでした。そのスレッドを続行するためのコメントは追加できませんでした。だから、重複して申し訳ありません。

私は現時点で文章の解析木です(Stanford Corenlpを使用しています)(私もStanford Corenlpによって作成されたCONLL形式で試しました)。そして私が必要とするのは、正確に名詞句の頭です。

依存関係と構文解析ツリーを使用して名詞句の頭を抽出する方法がわかりません。 私が知っているのは、もし私がnsubj (x, y)を持っていれば、yは主題の頭であるということです。 dobj(x,y)がある場合、yは直接オブジェクトの先頭です。 f私はiobj(x,y)を持っています、yは間接的なオブジェクトの頭です。

しかし、この方法がすべてのフレーズヘッドを見つける正しい方法であるかどうかはわかりません。それがあれば、名詞句のすべての頭を得るためにどのルールを追加するべきですか?

多分、私はJavaコードで名詞句の頭を必要とすることは価値があると思います。

答えて

4

クラスのオブジェクトであるように対象のフレーズを抽出することができますTreeHeadFinderを実装するクラスのいずれかからdetermineHead(Tree t)メソッドを使用できます。

7

私はChaitanyaによって与えられた答えにコメントできませんでしたので、ここで彼の答えにもっと加えてください。

スタンフォードCoreNLPスイートは、あなたが必要となるすべてがあるコリンズヘッドファインダーヒューリスティックと

  1. CollinsHeadFinder
  2. ModCollinsHeadFinder
  3. SemanticHeadFinder

の形でセマンティックヘッドファインダーヒューリスティックの実装を持っています3つのうちの1つをインスタンス化し、以下を実行します。

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

} 
関連する問題