извлечение текста из выходного дерева синтаксического анализа

Я новичок в nlp, я пытаюсь использовать синтаксический анализатор Stanford для извлечения предложения (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));}

is :

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

Я хочу, чтобы вывод был "club barcelona" сразу, без тегов, я попробовал свойство .labels(); и .label().value(); вместо этого они возвращают теги


person smohamed    schedule 20.09.2012    source источник


Ответы (1)


Вы можете получить список слов в поддереве tr с помощью

tr.yield()

Вы можете преобразовать это только в форму String с помощью удобных методов в Sentence:

Sentence.listToString(tr.yield())

Вы можете просто ходить по дереву, как вы делаете, но если вы собираетесь делать такие вещи много, вы можете посмотреть на tregex, который упрощает поиск определенных узлов в деревьях с помощью декларативных шаблонов, таких как NP. без 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()));
}
person Christopher Manning    schedule 21.09.2012