5

私はnlpを初めて使用します。スタンフォードパーサーを使用して、テキストから(NP)文を抽出しようとしています。テキストのタグ付けされた部分(NP)を取得したいと思います。

パーツにタグが付けられ(NP)、その中の小さなパーツにもタグが付けられている場合(NP)、小さなパーツを取得したいと思います。

今まで、私は次の方法でやりたいことを何とかできました:

private static ArrayList<Tree> extract(Tree t) 
{
    ArrayList<Tree> wanted = new ArrayList<Tree>();
   if (t.label().value().equals("NP") )
    {
       wanted.add(t);
        for (Tree child : t.children())
        {
            ArrayList<Tree> temp = new ArrayList<Tree>();
            temp=extract(child);
            if(temp.size()>0)
            {
                int o=-1;
                o=wanted.indexOf(t);
                if(o!=-1)
                    wanted.remove(o);
            }
            wanted.addAll(temp);
        }
    }

    else
        for (Tree child : t.children())
            wanted.addAll(extract(child));
    return wanted;
}

このメソッドの戻り値のタイプは、ツリーのリストです。次のようにすると、次のようになります。

     LexicalizedParser parser = LexicalizedParser.loadModel();
        x = parser.apply("Who owns club barcelona?");
     outs=extract(x);
    for(int i=0;i<outs.size();i++){System.out.println("tree #"+i+": "+outs.get(i));}

は :

tree #0: (NP (NN club) (NN barcelona))

"club barcelona"タグなしですぐに出力したいのですが、.labels();プロパティを試してみたところ、.label().value();代わりにタグが返されました

4

1 に答える 1

10

サブツリーtrの下の単語のリストを取得できます。

tr.yield()

Sentenceの便利なメソッドを使用して、これを文字列形式に変換できます。

Sentence.listToString(tr.yield())

木を歩きながら歩くこともできますが、このようなことをたくさん行う場合は、NPなどの宣言型パターンを介して木の特定のノードを簡単に見つけることができるtregexを確認することをお勧めします。それらの下にNPはありません。あなたが探していることをするためのきちんとした方法はこれです:

Tree x = lp.apply("Christopher Manning owns club barcelona?");
TregexPattern NPpattern = TregexPattern.compile("@NP !<< @NP");
TregexMatcher matcher = NPpattern.matcher(x);
while (matcher.findNextMatchingNode()) {
  Tree match = matcher.getMatch();
  System.out.println(Sentence.listToString(match.yield()));
}
于 2012-09-21T05:37:13.623 に答える