package clear.experiment; import clear.dep.DepNode; import clear.dep.DepTree; import clear.reader.DepReader; import clear.treebank.TBEnLib; public class CheckNonPorjective { int total = 0, totalSen = 0; int nproj = 0, nprojSen = 0; public CheckNonPorjective(String inputFile) { DepReader reader = new DepReader(inputFile, true); DepTree tree; // PrintStream fout = IOUtil.createPrintFileStream(inputFile+".np"); int i; for (i = 0; (tree = reader.nextTree()) != null; i++) { // total += tree.size() - 1; if (!isProjective(tree)) { nprojSen++; } totalSen++; // fout.println(tree.toStringNonProj()+"\n"); } // System.out.println((double)total/i); System.out.printf("Dependency: %d / %d = %4.2f\n", nproj, total, (double) nproj / total * 100); System.out.printf("Sentence : %d / %d = %4.2f\n", nprojSen, totalSen, (double) nprojSen / totalSen * 100); } private boolean isProjective(DepTree tree) { total += tree.size() - 1; boolean isProj = true; for (int i = 1; i < tree.size(); i++) { DepNode curr = tree.get(i); if (TBEnLib.isPunctuation(curr.pos)) { continue; } DepNode head = tree.get(curr.headId); int sId = (curr.id < head.id) ? curr.id : head.id; int eId = (curr.id < head.id) ? head.id : curr.id; for (int j = sId + 1; j < eId; j++) { DepNode node = tree.get(j); // if (TBEnLib.isPunctuation(node.pos)) continue; if (node.headId < sId || node.headId > eId) { // curr.nonProj = 1; nproj++; isProj = false; break; } } } return isProj; } static public void main(String[] args) { new CheckNonPorjective(args[0]); } }