2011-07-08 17 views
0

Tregexを使用してサブツリーを抽出するクラスを作成しました。 "TregexPattern.java"からいくつかのコードを使用しました。私は、プログラムにコンソールコマンドを使用させたくありません。スタンフォードTregexを使用してサブツリーを抽出する

一般に、文のツリーを持つので、私は特定のサブツリーを抽出したい(ユーザーとのやり取りなし)。

package edu.stanford.nlp.trees.tregex; 
import edu.stanford.nlp.ling.StringLabelFactory; 
import edu.stanford.nlp.trees.*; 
import java.io.*; 
import java.util.*; 
public abstract class Test { 
    abstract TregexMatcher matcher(Tree root, Tree tree, Map<String, Tree> namesToNodes, VariableStrings variableStrings); 
    public TregexMatcher matcher(Tree t) { 
     return matcher(t, t, new HashMap<String, Tree>(), new VariableStrings()); 
    } 
    public static void main(String[] args) throws ParseException, IOException { 
     String encoding = "UTF-8"; 
     TregexPattern p = TregexPattern.compile("NP < NN & <<DT"); //"/^MWV/" or "NP < (NP=np < NNS)" 
     TreeReader r = new PennTreeReader(new StringReader("(VP (VP (VBZ Try) (NP (NP (DT this) (NN wine)) (CC and) (NP (DT these) (NNS snails)))) (PUNCT .))"), new LabeledScoredTreeFactory(new StringLabelFactory())); 
     Tree t = r.readTree(); 
     treebank = new MemoryTreebank(); 
     treebank.add(t); 
     TRegexTreeVisitor vis = new TRegexTreeVisitor(p, encoding); 
     **treebank.apply(vis); //line 26** 
     if (TRegexTreeVisitor.printMatches) { 
      System.out.println("There were " + vis.numMatches() + " matches in total."); 
     } 
    } 
    private static Treebank treebank; // used by main method, must be accessible 
    static class TRegexTreeVisitor implements TreeVisitor { 
     private static boolean printNumMatchesToStdOut = false; 
     static boolean printNonMatchingTrees = false; 
     static boolean printSubtreeCode = false; 
     static boolean printTree = false; 
     static boolean printWholeTree = false; 
     static boolean printMatches = true; 
     static boolean printFilename = false; 
     static boolean oneMatchPerRootNode = false; 
     static boolean reportTreeNumbers = false; 
     static TreePrint tp; 
     PrintWriter pw; 
     int treeNumber = 0; 
     TregexPattern p; 
     //String[] handles; 
     int numMatches; 
     TRegexTreeVisitor(TregexPattern p, String encoding) { 
      this.p = p; 
      //this.handles = handles; 
      try { 
       pw = new PrintWriter(new OutputStreamWriter(System.out, encoding), true); 
      } catch (UnsupportedEncodingException e) { 
       System.err.println("Error -- encoding " + encoding + " is unsupported. Using ASCII print writer instead."); 
       pw = new PrintWriter(System.out, true); 
      } 
      // tp.setPrintWriter(pw); 
     } 
     public void visitTree(Tree t) { 
      treeNumber++; 
      if (printTree) { 
       pw.print(treeNumber + ":"); 
       pw.println("Next tree read:"); 
       tp.printTree(t, pw); 
      } 
      TregexMatcher match = p.matcher(t); 
      if (printNonMatchingTrees) { 
       if (match.find()) { 
        numMatches++; 
       } else { 
        tp.printTree(t, pw); 
       } 
       return; 
      } 
      Tree lastMatchingRootNode = null; 
      while (match.find()) { 
       if (oneMatchPerRootNode) { 
        if (lastMatchingRootNode == match.getMatch()) { 
         continue; 
        } else { 
         lastMatchingRootNode = match.getMatch(); 
        } 
       } 
       numMatches++; 
       if (printFilename && treebank instanceof DiskTreebank) { 
        DiskTreebank dtb = (DiskTreebank) treebank; 
        pw.print("# "); 
        pw.println(dtb.getCurrentFile()); 
       } 
       if (printSubtreeCode) { 
        pw.println(treeNumber + ":" + match.getMatch().nodeNumber(t)); 
       } 
       if (printMatches) { 
        if (reportTreeNumbers) { 
         pw.print(treeNumber + ": "); 
        } 
        if (printTree) { 
         pw.println("Found a full match:"); 
        } 
        if (printWholeTree) { 
         tp.printTree(t, pw); 
        } else { 
         **tp.printTree(match.getMatch(), pw); //line 108** 
        } 
        // pw.println(); // TreePrint already puts a blank line in 
       } // end if (printMatches) 
      } // end while match.find() 
     } // end visitTree 
     public int numMatches() { 
      return numMatches; 
     } 
    } // end class TRegexTreeVisitor 
} 

が、それは次のエラーを与える:

Exception in thread "main" java.lang.NullPointerException 
     at edu.stanford.nlp.trees.tregex.Test$TRegexTreeVisitor.visitTree(Test.java:108) 
     at edu.stanford.nlp.trees.MemoryTreebank.apply(MemoryTreebank.java:376) 
     at edu.stanford.nlp.trees.tregex.Test.main(Test.java:26) 
Java Result: 1 

任意の変更やアイデアを、私は今のところ、以下でなかったものを

答えて

1

通常、NullPointerExceptionはソフトウェアのバグを示す指標です。

私は過去に同じ仕事をしていました。文は依存関係パーサーで解析されました。 結果の解析ツリーをXML(DOM)に入れ、その上にXPathクエリを実行することにしました。

パフォーマンスを向上させるには、xmlをStringに入れる必要はありません。すべてのXML構造をDOMとしてメモリに保持するだけです(例:http://www.ibm.com/developerworks/xml/library/x-domjava/)。簡単に解析する文の

  1. 読み込み/保存/転送結果:ツリー状のデータ構造を照会するためのXPathを使用して

    は私に次のような利点を与えました。

  2. XPathの強力な構文/機能。
  3. 多くの人がXPathを知っています(誰でもあなたのクエリをカスタマイズできます)。
  4. XMLとXPathはクロスプラットフォームです。
  5. XPathおよびXML/DOMライブラリの安定した実装がたくさんあります。
  6. XSLTを使用する能力。
  7. 既存のXMLベースのパイプラインとの統合XSLT +のXPath - > XSD - >アクション(例えば、ユーザーがフリーテキスト苦情の中のどこかでそれをどうするか自分のメールアドレスやアクションを指定した)を行います。
関連する問題