package hu.u_szeged.nlp.pos; import java.util.LinkedList; import java.util.List; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Utils for KR codes * * @author zsjanos * */ public class KRUtils { /** * possible KR part of speech tags * * @author zsjanos * */ public enum KRPOS { VERB, NOUN, ADJ, NUM, ADV, PREV, ART, POSTP, UTT_INT, DET, CONJ, ONO, PREP, X; } /** * Search for a pattern in a text by group number. * * @param text * @param pattern * @param group * @return */ private static String findPattern(String text, String pattern, int group) { Pattern p = null; Matcher m = null; MatchResult mr = null; p = Pattern.compile(pattern); m = p.matcher(text); m.find(); mr = m.toMatchResult(); return mr.group(group); } /** * * Search for the first occurence of the pattern in the text. * * @param text * @param pattern * @return */ private static String findPattern(String text, String pattern) { return findPattern(text, pattern, 1); } private static List<String> findPatterns(String text, String pattern) { Pattern p = null; Matcher m = null; MatchResult mr = null; boolean find = false; List<String> found = null; found = new LinkedList<String>(); p = Pattern.compile(pattern); m = p.matcher(text); find = m.find(); while (find) { mr = m.toMatchResult(); found.add(mr.group(1)); find = m.find(); } return found; } public static String getRoot(String morph) { // több if (morph.startsWith("$sok/NUM[COMPAR]/NUM<CAS<")) { return "$több/NUM<CAS<ACC>>"; } // legtöbb if (morph.startsWith("$sok/NUM[SUPERLAT]/NUM<CAS<")) { return "$legtöbb/NUM<CAS<ACC>>"; } // legeslegtöbb if (morph.startsWith("$sok/NUM[SUPER-SUPERLAT]/NUM<CAS<")) { return "$legeslegtöbb/NUM<CAS<ACC>>"; } String root = null; String vegsoto = null; String igekoto = ""; String[] tovek; boolean ikes = false; if (!morph.contains("/")) { return morph; } else { // igekoto if (morph.contains("/PREV+")) { igekoto = morph.split("/PREV\\+")[0]; morph = morph.split("/PREV\\+")[1]; } tovek = morph.split("/"); tovek = preProcess(tovek); vegsoto = findPatterns(tovek[0], "^([^\\(\\/]*)").get(0); List<String> feladatok; if (tovek.length > 2) { for (int i = 0; i < tovek.length - 1; i++) { if (tovek[i].matches(".*\\(.*\\).*")) { feladatok = findPatterns(tovek[i], "\\((.*?)\\)"); int backValue = 0; for (String feladat : feladatok) { if (feladat.matches("^\\-\\d.*")) { // -1 -2ik backValue = Integer.parseInt(findPattern(feladat, "^\\-(\\d)")); vegsoto = vegsoto.substring(0, vegsoto.length() - backValue); ikes = false; if (feladat.matches(".*ik$")) { ikes = true; } // feladat.matches("^\\-\\.[\\d]" } else if (feladat.matches("^\\-\\.")) { // -. String firsPart; String secondPart; firsPart = findPattern(vegsoto, "^(.*?).([bcdfghjklmnpqrstvwxyz!]*)$", 1); secondPart = findPattern(vegsoto, "^(.*?).([bcdfghjklmnpqrstvwxyz!]*)$", 2); vegsoto = firsPart + "!" + secondPart; } else if (feladat.matches("^\\.(.*)")) { // .a .e .i .o .ö .u .ü String csere; csere = findPattern(feladat, "^\\.(.*)", 1); if (vegsoto.contains("!")) { vegsoto = vegsoto.replace("!", csere); } else { // TODO ez mikor van? } ikes = false; } else if (feladat.matches("^\\%.*")) { // TODO nem talátam ilyet } else if (feladat.matches("^[^\\.\\-\\%].*")) { // a, abb, ad, al, an, anként, anta, askodik, astul, astól, at, // az, azik, bb, beli, béli, e, ebb, ed, eget, el, en, enként, // ente, eskedik, estül, estől, et, ett, ez, ezik, gat, get, // hetnék, i, kedik, képp, képpen, lag, leg, n, nként, nta, nte, // nyi, od, odik, ogat, ol, on, onként, onta, oskodik, ostul, // ostól, ott, ov, oz, ozik, sodik, stól, stül, stől, sul, szer, // szerez, szeri, szerte, szor, szori, szoroz, szorta, ször, // szöri, szörte, szöröz, sít, södik, tat, tet, tt, ul, v, va, // ve, ván, vén, z, zik, á, é, ít, ó, ódik, ödik, öget, öl, // önként, ösködik, östül, östől, ött, öv, öz, özik, ül, ődik vegsoto = vegsoto + findPattern(feladat, "^([^\\.\\-\\%].*)", 1); ikes = false; } else { // System.out.println("HIBA: " + feladat); } } } } } String ikveg = ikes ? "ik" : ""; root = igekoto + vegsoto + ikveg + "/" + tovek[tovek.length - 1]; for (String rep : findPatterns(root, "(\\([^\\)]*\\))")) { root = root.replace(rep, ""); } } root = root.replace("!", ""); root = root.replace("@", ""); root = root.replace("$", ""); root = "$" + root; return root; } private static String[] preProcess(String[] tovek) { for (int i = 0; i < tovek.length; i++) { // gyorsan -> gyors // hallgatólag -> hallgató if (tovek[i].contains("ADJ[MANNER]")) { tovek[tovek.length - 1] = tovek[i]; } // mindenképp -> minden // mindenképpen -> minden if (tovek[i].contains("NOUN[ESS_FOR]")) { tovek[tovek.length - 1] = tovek[i]; } // apástul -> apa if (tovek[i].contains("NOUN") && tovek[i].contains("[COM]")) { tovek[tovek.length - 1] = tovek[i]; } // fejenként -> fej if (tovek[i].contains("NOUN[PERIOD1]")) { tovek[tovek.length - 1] = tovek[i]; } /* * szamnevek, amik KRben /ADV */ if (tovek[i].contains("NUM") && tovek[i].contains("[")) { tovek[tovek.length - 1] = tovek[i]; } // rosszabb -> rossz // legrosszabb -> rossz // legeslegrosszabb -> rossz // rosszabbik -> rossz // legrosszabbik -> rossz // legeslegrosszabbik -> rossz if (tovek[i].contains("ADJ")) { if (tovek[i].contains("[COMPAR") || tovek[i].contains("[SUPERLAT") || tovek[i].contains("[SUPERSUPERLAT")) { tovek[tovek.length - 1] = tovek[i]; } } // futva, futván -> fut if (tovek[i].contains("VERB[PART](va)") || tovek[i].contains("VERB[PART](ve)") || tovek[i].contains("VERB[PERF_PART](ván)") || tovek[i].contains("VERB[PERF_PART](vén)")) { tovek[tovek.length - 1] = tovek[i]; } } return tovek; } /* * "$fut/VERB[GERUND](ás)/NOUN<PLUR><POSS<1>><CAS<INS>>" */ public static KRPOS getPOS(String code) { int end1 = Integer.MAX_VALUE; int end2 = Integer.MAX_VALUE; int end = 0; if (code.contains("@")) { end = code.lastIndexOf("@"); } int start = code.lastIndexOf("/"); if (code.indexOf("<", start) > 0) { end1 = (code.indexOf("<", start)); } if (code.indexOf("[", start) > 0) { end2 = (code.indexOf("[", start)); } end = (end1 < end2) ? end1 : end2; if ((end > code.length())) { end = code.length(); } if (code.substring(start, end).equals("VERB")) { return KRPOS.VERB; } if (code.substring(start, end).equals("NOUN")) { return KRPOS.NOUN; } if (code.substring(start + 1, end).equals("ADJ")) { return KRPOS.ADJ; } if (code.substring(start + 1, end).equals("NUM")) { return KRPOS.NUM; } if (code.substring(start + 1, end).equals("ADV")) { return KRPOS.ADV; } if (code.substring(start + 1, end).equals("PREV")) { return KRPOS.PREV; } if (code.substring(start + 1, end).equals("ART")) { return KRPOS.ART; } if (code.substring(start + 1, end).equals("POSTP")) { return KRPOS.POSTP; } if (code.substring(start + 1, end).equals("UTT-INT")) { return KRPOS.UTT_INT; } if (code.substring(start + 1, end).equals("DET")) { return KRPOS.DET; } if (code.substring(start + 1, end).equals("CONJ")) { return KRPOS.CONJ; } if (code.substring(start + 1, end).equals("ONO")) { return KRPOS.ONO; } if (code.substring(start + 1, end).equals("PREP")) { return KRPOS.PREP; } return KRPOS.X; } }