2012-09-20 13 views
5

Nlp için yeni, Bir metinden (NP) tümceyi ayıklamak için stanford ayrıştırıcısını kullanmaya çalışıyorum, etiketlendiğinde (NP) metnin bölümlerini almak istiyorum (NP)çıkış ayrıştırmasını ağacından ayıklanıyor Ağacı

Eğer bir parça etiketlenmişse (NP) ve içindeki daha küçük bir parça da etiketlenmişse (NP) daha küçük parçayı almak istiyorum. Ben ne zaman aşağıdaki

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

Bu yöntemin dönüş türü, ağaçların bir listesi::

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

şu ana kadar aşağıdaki yönteminde ne istediğini yapmak başardı geçerli:

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

Ben etiketleri olmadan, ben trie, hemen çıkış "club barcelona" olmak istiyorum d .labels(); mülkiyet ve .label().value(); onlar etiketleri döndürmek yerine

Sen

tr.yield() 

Sen Cümle içinde kolaylık yöntemleri ile sadece dize forma o dönüştürebilirsiniz bir alt ağacı tr altında kelimelerin bir listesini alabilirsiniz

cevap

10

:

Sentence.listToString(tr.yield()) 

sadece yaptığınızı olarak bir ağaç yürüyebilir, ama çok bu tür şeyleri yapmaya gidiyoruz, sen daha kolay ağaçlarında özellikle düğümleri bulmanızı kolaylaştırır tregex bakmak isteyebilirsiniz bildirim desenleri ile, suc bunların altında NP bulunmayan NP'ler olarak. Aradığınızı yapmak için temiz bir yol şudur:

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