2012-09-20 28 views
5

Soy nuevo en nlp, estoy tratando de usar stanford parser para extraer la oración (NP) de un texto, quiero recuperar las partes del texto donde está etiquetado (NP)extrayendo el texto del análisis de salida Árbol

si una parte está etiquetada (NP) y una parte más pequeña dentro también está etiquetada (NP) Quiero tomar la parte más pequeña.

hasta ahora he logrado hacer lo que quería en el siguiente método:

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

El tipo de retorno de este método es una lista de árboles, Cuando hago lo siguiente:

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

es decir:

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

quiero que la salida sea "club barcelona" de inmediato, sin las etiquetas, me trie d la propiedad .labels(); y .label().value(); regresan las etiquetas en lugar

Respuesta

10

Usted puede obtener una lista de las palabras bajo un tr subárbol con

tr.yield() 

Puede convertir de que sólo a la forma de cadena con los métodos de conveniencia en la oración:

Sentence.listToString(tr.yield()) 

se puede ir andando como un árbol que está haciendo, pero si vas a hacer este tipo de cosas tanto, es posible que desee ver en tregex lo que hace que sea más fácil encontrar nodos particulares en los árboles a través de patrones declarativos, suc h como NP sin NP debajo de ellos. Una buena manera de hacer lo que está buscando es esto:

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())); 
} 
Cuestiones relacionadas