package senna; import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Senna { String[] lineArr; File sennaInstallationDir = new File("/Users/tejaswi/Documents/StanfordCourses/SRL/senna-v2.0"); public String getSennaOutput(String line) { try { String cmd = "echo " + line + " | " + sennaInstallationDir + "/senna "; ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd); pb.directory(sennaInstallationDir); Process shell = pb.start(); InputStream shellIn = shell.getInputStream(); int shellExitStatus = shell.waitFor(); int c; StringBuffer s = new StringBuffer(); while ((c = shellIn.read()) != -1) { s.append((char) c); } return s.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } public HashMap<String, Verb> parseSennaLines(String allText, String sentence){ lineArr = allText.split("\n"); HashMap<String, Verb> verbsToArgs = new HashMap<String, Verb>(); ArrayList<Verb> verbs = new ArrayList<Verb>(); int verbCount = 0; for(int i=0; i < lineArr.length; i++) { //String[] line = lineArr[i].trim().split("\t"); String line = lineArr[i].trim(); lineArr[i] = line; Pattern p = Pattern.compile("VB[A-Z]?\t"); //System.out.println(line); if(( !line.split("\\s+")[4].trim().equalsIgnoreCase("-")) ){ //Verb v = getVerbArguments(++verbCount, line.split("\\s+")[0].trim(), sentence); Verb v = getVerbArgumentNPs(++verbCount, line.split("\\s+")[0].trim(), sentence); verbs.add(v); verbsToArgs.put(v.text, v); } } return verbsToArgs; } public Verb getVerbArgumentNPs(int index, String verb, String sentence){ Verb v = new Verb(); v.text = verb; HashMap<String, List<String>> argumentToText = new HashMap<String, List<String>>(); index = index + 4; for(int i=0; i < lineArr.length; i++){ String[] lineTokens = lineArr[i].trim().split("\\s+"); String token = lineTokens[0].trim(); String pos = lineTokens[1].trim(); String value = lineTokens[index].trim(); if(value.equals("O")){ continue; } else if(value.startsWith("S-") && !value.contains("S-V") && pos.contains("NN")) { String arg = value.split("S-")[1]; ArrayList<String> arr_token = new ArrayList<String>(); arr_token.add(token); argumentToText.put(arg, arr_token); // } else if(value.startsWith("B-") && Character.isDigit(value.charAt(value.length()-1))) { } else if(value.startsWith("B-")) { String arg = value.split("B-")[1]; StringBuilder text = new StringBuilder(); boolean flag = false; if(pos.contains("NN")){ text.append(token); flag = true; } while(!value.startsWith("E-")){ i++; lineTokens = lineArr[i].trim().split("\\s+"); token = lineTokens[0].trim(); pos = lineTokens[1].trim(); value = lineTokens[index]; if(pos.contains("NN")){ text.append(" "+token); flag = true; } else if(flag==true){ if(argumentToText.containsKey(arg)) argumentToText.get(arg).add(text.toString().trim()); else{ ArrayList<String> nps = new ArrayList<String>(); nps.add(text.toString().trim()); argumentToText.put(arg, nps); } text = new StringBuilder(); flag = false; } } if(value.startsWith("E-") && flag==true){ if(argumentToText.containsKey(arg)) argumentToText.get(arg).add(text.toString().trim()); else{ ArrayList<String> nps = new ArrayList<String>(); nps.add(text.toString().trim()); argumentToText.put(arg, nps); } flag = false; } if(argumentToText.containsKey(arg)) arg = arg + "-1"; } } v.argumentToNPs = argumentToText; return v; } //get the arguments of a verb public Verb getVerbArguments(int index, String verb, String sentence){ List<String> words = Arrays.asList(sentence.trim().split("\\s+")); //System.out.println(sentence); Verb v = new Verb(); v.text = verb; HashMap<String, String> argumentToText = new HashMap<String, String>(); index = index + 4; //System.out.println("index "+index); for(int i=0; i < lineArr.length; i++){ //String[] arr = lineArr[i].split("\\s+"); String value = lineArr[i].trim().split("\\s+")[index].trim(); if(value.equals("O")){ continue; } else if(value.startsWith("S-") && !value.contains("S-V")){ String arg = value.split("S-")[1]; //String text = lineArr[i].trim().split("\\s+")[0].trim(); String text = words.get(i).trim(); argumentToText.put(arg, text); } else if(value.startsWith("B-") && Character.isDigit(value.charAt(value.length()))){ System.out.println(value); String arg = value.split("B-")[1]; //String text = lineArr[i].trim().split("\\s+")[0].trim(); String text = words.get(i).trim(); while(!value.startsWith("E-")){ i++; value = lineArr[i].trim().split("\\s+")[index].trim(); //text += (" "+lineArr[i].trim().split("\\s+")[0].trim()); text += (" "+words.get(i).trim()); } if(argumentToText.containsKey(arg)) arg = arg + "-1"; argumentToText.put(arg, text); } } v.argumentToText = argumentToText; return v; } }