2012-09-20 12 views
5

Sono nuovo di nlp, sto cercando di usare stanford parser per estrarre la frase (NP) da un testo, voglio recuperare le parti del testo dove è taggato (NP)Estrazione del testo dall'analisi di output Albero

se una parte è codificata (NP) e una parte più piccola al suo interno viene anche etichettata (NP) Voglio prendere la parte più piccola.

fino ad ora sono riuscito a fare quello che volevo nel seguente metodo:

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

Il tipo di ritorno di questo metodo è un elenco di alberi, Quando faccio la seguente:

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

voglio l'uscita di essere "club barcelona" subito, senza i tag, ho trie d la proprietà .labels(); e .label().value(); tornano i tag invece

risposta

10

È possibile ottenere una lista delle parole in una sottostruttura tr con

tr.yield() 

È possibile convertire che semplicemente la forma String con metodi di convenienza a frase:

Sentence.listToString(tr.yield()) 

è possibile solo a piedi un albero come si sta facendo, ma se avete intenzione di fare questo genere di cose molto, si potrebbe desiderare di guardare tregex che rende più facile l'individuazione di determinate nodi negli alberi tramite modelli dichiarativi, suc h come NP senza NP sotto di loro. Un modo efficace per fare ciò che stai cercando è questo:

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())); 
} 
Problemi correlati