Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
lv.semti.morphology.analyzer.Mijas Maven / Gradle / Ivy
/*******************************************************************************
* Copyright 2008, 2009, 2014 Institute of Mathematics and Computer Science, University of Latvia
* Author: Pēteris Paikens
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*******************************************************************************/
package lv.semti.morphology.analyzer;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import lv.semti.morphology.attributes.AttributeNames;
import javax.management.Attribute;
public abstract class Mijas {
public static ArrayList mijuVarianti (String stem, int stemChange, boolean properName) {
// procedūra, kas realizē visas celmu pārmaiņas - līdzskaņu mijas; darbības vārdu formas, utml.
// TODO - iznest 'varianti.add(new Variants(... kā miniprocedūriņu.
// TODO - iekļaut galotnē(?) kā metodi
ArrayList varianti = new ArrayList(1);
if (stem.trim().equals("")) return varianti;
int mija;
String celms;
try {
switch (stemChange) { //TODO - uz normālāku struktūru
case 4: // vajadzības izteiksmes jā-
if (stem.startsWith("jā") && stem.length() >= 4) {
celms = stem.substring(2,stem.length());
mija = 0;
} else return varianti;
break;
case 5: // vajadzības izteiksme 3. konjugācijai bez mijas
if (stem.startsWith("jā") && stem.length() >= 4) {
celms = stem.substring(2,stem.length());
mija = 9;
} else return varianti;
break;
case 12: // vajadzības izteiksme 3. konjugācijai atgriezeniskai bez mijas
if (stem.startsWith("jā") && stem.length() >= 4) {
celms = stem.substring(2,stem.length());
mija = 8;
} else return varianti;
break;
case 19: // vajadzības_vēlējuma izteiksme 3. konjugācijai bez mijas (jāmācot)
if (stem.startsWith("jā") && stem.length() >= 4) {
celms = stem.substring(2,stem.length());
mija = 2;
} else return varianti;
break;
case 28: // vajadzības_vēlējuma izteiksme 3. konjugācijai ar miju (jāmākot)
if (stem.startsWith("jā") && stem.length() >= 4) {
celms = stem.substring(2,stem.length());
mija = 20;
} else return varianti;
break;
case 29: // vajadzības izteiksme 3. konjugācijai atgriezeniskai ar miju
if (stem.startsWith("jā") && stem.length() >= 4) {
celms = stem.substring(2,stem.length());
mija = 27;
} else return varianti;
break;
case 31: // vajadzības izteiksme 3. konjugācijai ar miju
if (stem.startsWith("jā") && stem.length() >= 4) {
celms = stem.substring(2,stem.length());
mija = 30;
} else return varianti;
break;
case 37: // vajadzības izteiksme 1. konjugācijai ar miju (jāiet)
if (stem.startsWith("jā") && stem.length() >= 4) {
celms = stem.substring(2,stem.length());
mija = 36;
} else return varianti;
break;
default:
celms = stem;
mija = stemChange;
}
switch (mija) {
case 0: varianti.add(new Variants(celms)); break; // nav mijas
case 1: // lietvārdu līdzskaņu mija
// sākam ar izņēmumgadījumiem.
if (celms.endsWith("š")) {
if (celms.endsWith("kš")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "kst", "Mija", "kst -> kš"));
}
if (celms.endsWith("nš")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "nst", "Mija", "nst -> nš"));
}
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "s", "Mija", "s -> š"));
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "t", "Mija", "t -> š"));
}
else if (celms.endsWith("ž")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"z","Mija","z -> ž"));
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"d","Mija","d -> ž"));
}
// ... dž <> dd ?????
else if (celms.endsWith("č")) {varianti.add(new Variants(celms.substring(0,celms.length()-1)+"c","Mija","c -> č"));}
else if (celms.endsWith("ļ")) {
if (celms.endsWith("šļ")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"sl","Mija","sl -> šļ"));}
else if (celms.endsWith("žļ")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"zl","Mija","zl -> žļ"));}
else if (celms.endsWith("ļļ")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ll","Mija","ll -> ļļ"));}
else varianti.add(new Variants(celms.substring(0,celms.length()-1)+"l","Mija","l -> ļ"));
}
else if (celms.endsWith("ņ")) {
if (celms.endsWith("šņ")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"sn","Mija","sn -> šņ"));}
else if (celms.endsWith("žņ")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"zn","Mija","zn -> žņ"));}
else if (celms.endsWith("ļņ")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ln","Mija","ln -> ļņ"));}
else if (celms.endsWith("ņņ")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"nn","Mija","nn -> ņņ"));}
else if (!(celms.endsWith("zņ") || celms.endsWith("sņ") || celms.endsWith("lņ") || celms.endsWith("ņņ"))) {
//varianti.add(new Variants(celms.substring(0,celms.length()-1)+"l","Mija", "l -> ņ ??"));
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"n","Mija", "n -> ņ"));
}
}
else if (celms.endsWith("j")) {
if (celms.endsWith("pj") || celms.endsWith("bj") || celms.endsWith("mj") || celms.endsWith("vj"))
// ... nj <> n ??
{varianti.add(new Variants(celms.substring(0,celms.length()-1),"Mija","p->pj (u.c.)"));}
else if (celms.endsWith("fj")) { // žirafju -> žirafe; žirafu->žirafe
varianti.add(new Variants(celms.substring(0,celms.length()-1),"Mija","p->pj (u.c.)"));
varianti.add(new Variants(celms));
} else varianti.add(new Variants(celms));
}
else if (!(celms.endsWith("p") || celms.endsWith("b") || celms.endsWith("m") || celms.endsWith("v") ||
celms.endsWith("t") || celms.endsWith("d") || celms.endsWith("c") || celms.endsWith("z") ||
celms.endsWith("s") || celms.endsWith("z") || celms.endsWith("n") || celms.endsWith("l") ) )
varianti.add(new Variants(celms));
break;
case 2: // dv. 3. konjugācijas (bezmiju!) formas, kas noņem celma pēdējo burtu
varianti.add(new Variants(celms+"ā"));
varianti.add(new Variants(celms+"ī"));
varianti.add(new Variants(celms+"ē"));
break;
case 3: // īpašības vārdiem -āk- un vis-
if (celms.endsWith("āk") && celms.length() > 3) {
if (celms.startsWith("vis")) varianti.add(new Variants(celms.substring(3,celms.length()-2),AttributeNames.i_Degree,AttributeNames.v_Superlative));
else varianti.add(new Variants(celms.substring(0,celms.length()-2),AttributeNames.i_Degree,AttributeNames.v_Comparative));
}
varianti.add(new Variants(celms,AttributeNames.i_Degree, AttributeNames.v_Positive));
break;
case 6: // 1. konjugācijas nākotne
if (celms.endsWith("dī") || celms.endsWith("tī") || celms.endsWith("sī")) varianti.add(new Variants(celms.substring(0,celms.length()-2)+"s"));
else if (celms.endsWith("zī") || celms.endsWith("šī")) varianti.add(new Variants(celms.substring(0,celms.length()-1))); // lūzt, griezt
else if (!celms.endsWith("d") && !celms.endsWith("t") && !celms.endsWith("s") && !celms.endsWith("z")) varianti.add(new Variants(celms));
break;
case 7: // 1. konjugācijas 2. personas tagadne
case 23: // 1. konjugācijas 2. personas tagadne - ja pēc tam seko garā galotne kā -iet
if (celms.endsWith("s")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"š")); //pievēršu -> pievērs
varianti.add(new Variants(celms)); // atnest -> atnes
}
else if ((mija == 7) && (celms.endsWith("odi") || celms.endsWith("ūdi") || celms.endsWith("opi") || celms.endsWith("ūpi") ||
celms.endsWith("oti") || celms.endsWith("ūti") || celms.endsWith("īti") || celms.endsWith("ieti") || celms.endsWith("sti")))
varianti.add(new Variants(celms.substring(0,celms.length()-1)));
else if ((mija == 23) && (celms.endsWith("od") || celms.endsWith("ūd") || celms.endsWith("op") || celms.endsWith("ūp") ||
celms.endsWith("ot") || celms.endsWith("ūt") || celms.endsWith("īt") || celms.endsWith("st")))
varianti.add(new Variants(celms));
else if (celms.endsWith("t")) {
// tikai vārdiem 'mest' un 'cirst'. pārējiem visiem 2. personas tagadnei jābūt galā -i, piem. 'krīti', 'plūsti'
if (celms.endsWith("met") || celms.endsWith("cērt")) varianti.add(new Variants(celms));
else varianti.add(new Variants(celms.substring(0,celms.length()-1)+"š")); // pūšu -> pūt, ciešu -> ciet
}
else if (celms.endsWith("d")) {
//tikai attiecīgajiem vārdiem, pārējiem visiem 2. personas tagadnei jābūt galā -i, piem. 'pazūdi', 'atrodi'
if (celms.endsWith("dod") || celms.endsWith("ved") || celms.endsWith("ēd"))
varianti.add(new Variants(celms));
else varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ž")); // kožu -> kod
}
else if (celms.endsWith("l")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ļ"));
else if (celms.endsWith("s")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"š")); // elšu -> elsis
else if (!celms.endsWith("ņem") && (celms.endsWith("m") || celms.endsWith("b") || celms.endsWith("p"))) varianti.add(new Variants(celms+"j")); //stumju -> stum
else if (celms.endsWith("c")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"k")); // raku -> racis
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"c")); // veicu -> veicis
}
// else if (celms.endsWith("dz")) varianti.add(new Variants(celms.substring(0,celms.length()-2)+"g"));
else if (celms.endsWith("z") && !celms.endsWith("dz")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ž"));
//TODO - šī nākamā rinda ir jātestē vai tok visos gadījumos. pielikta, jo "rok" overģenerēja kā arī bez mijas.
else if (!(celms.endsWith("š") || celms.endsWith("ž") || celms.endsWith("ļ") //|| celms.endsWith("j")
|| celms.endsWith("k") || celms.endsWith("g") ))
varianti.add(new Variants(celms));
break;
case 8: // -ams -āms 3. konjugācijai bezmiju gadījumam, un arī mēs/jūs formas
if (celms.endsWith("inā")) varianti.add(new Variants(celms)); // nav else, jo piemēram vārdam "mainās" arī ir beigās -inās, bet tam vajag -īties likumu;
if (celms.endsWith("ā")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ī"));
if (celms.endsWith("a")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ē"));
if (!celms.endsWith("ina")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ā"));
}
break;
case 9: // 3. konjugācija 3. pers. tagadne bez mijas
if (celms.endsWith("ina")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ā")); // nav else, jo piemēram vārdam "jāmaina" arī ir beigās -ina, bet tam vajag -a nevis -ina likumu;
if (celms.endsWith("a")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ī"));
else {
varianti.add(new Variants(celms+"ē")); // if (celms.endsWith("i")) varianti.add(celms.substring(0,celms.length()-1)+"ē");
varianti.add(new Variants(celms+"ā"));
}
break;
case 10: // īpašības vārds -āk- un vis-, -i apstākļa formai
if (celms.endsWith("i")) varianti.add(new Variants(celms.substring(0,celms.length()-1),AttributeNames.i_Degree, AttributeNames.v_Positive));
if (celms.endsWith("āk")) {
if (celms.startsWith("vis")) varianti.add(new Variants(celms.substring(3,celms.length()-2),AttributeNames.i_Degree,AttributeNames.v_Superlative));
else varianti.add(new Variants(celms.substring(0,celms.length()-2),AttributeNames.i_Degree,AttributeNames.v_Comparative));
}
break;
case 11: // -uša, arī mijas pie 1. konj noteiktās formas: veicu -> veikušais, beidzu->beigušais; raku -> rakušais; sarūgu -> sarūgušais;
if (!celms.endsWith("c") && !celms.endsWith("dz")) {
varianti.add(new Variants(celms));
}
if (celms.endsWith("k")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"c"));
if (celms.endsWith("g")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"dz"));
break;
case 13: // īpašības vārdiem -āk- un vis-, ar š->s nominatīva formā (zaļš -> zaļāks) ?? Lexicon.xml izskatās tikai pēc apstākļvārdu atvasināšanas?? FIXME, nešķiet tīri
if (celms.endsWith("āk")) {
if (celms.startsWith("vis")) varianti.add(new Variants(celms.substring(3,celms.length()-2),AttributeNames.i_Degree,AttributeNames.v_Superlative));
else varianti.add(new Variants(celms.substring(0,celms.length()-2),AttributeNames.i_Degree,AttributeNames.v_Comparative));
}
break;
case 14: // 1. konjugācijas "-is" forma
if (celms.endsWith("c")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"k")); // raku -> racis
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"c")); // veicu -> veicis
}
else if (celms.endsWith("dz")) {
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"g")); // sarūgu -> sarūdzis
varianti.add(new Variants(celms)); // lūdzu -> lūdzis
}
else varianti.add(new Variants(celms));
break;
case 15: // pūst->pūzdams nopūzdamies s -> z mija
varianti.add(new Variants(celms)); // šis pievienos arī pūst -> pūsdams; taču to pēc tam atpakaļlocīšana (kam būs info par pagātnes celmu) nofiltrēs
if (celms.endsWith("z")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"s"));
}
break;
case 16: // 1. konjugācijas "-šana" atvasināšana
if (!celms.endsWith("s") && !celms.endsWith("z")) {
varianti.add(new Variants(celms));
varianti.add(new Variants(celms+"s")); // nest -> nešana
varianti.add(new Variants(celms+"z")); // mēzt -> mēšana
}
break;
case 17: // īsā sieviešu dzimtes vokatīva forma "kristīnīt!" "margriet!"
if (syllables(celms) >= 2 || celms.endsWith("iņ") || celms.endsWith("īt"))
varianti.add(new Variants(celms));
break;
case 18: // garā sieviešu dzimtes vokatīva forma "laura!" "margrieta!"
if (syllables(celms) <= 2 && !celms.endsWith("iņ") && !celms.endsWith("īt"))
varianti.add(new Variants(celms));
if (syllables(celms) > 1 && (celms.endsWith("kāj") || celms.endsWith("māj")))
varianti.add(new Variants(celms));
break;
case 20: // dv. 3. konjugācijas tagadnes mija 1. personas tagadnei, -ot divdabim un vajadzībai - atšķiras no 26. mijas 'gulēt' un 'tecēt'
if (celms.endsWith("guļ") || celms.endsWith("gul")) // FIXME - dēļ 'gulošs' pieļaujam formu 'es gulu' ????
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"lē")); //gulēt -> guļošs un arī gulošs
if (celms.endsWith("k")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "cī")); //sacīt -> saku
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"cē")); //mācēt -> māku
} else if (celms.endsWith("g") ) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "dzī")); //slodzīt -> slogu
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"dzē")); //vajadzēt -> vajag
} else if (celms.endsWith("ž") ) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "dē")); //sēdēt -> sēžu
}
if (celms.endsWith("loc") || celms.endsWith("moc") || celms.endsWith("urc"))
varianti.add(new Variants(celms+"ī")); // alternatīvā forma
break;
case 21: // -is -ušais pārākā un vispārākā pakāpe - visizkusušākais saldējums
if (celms.startsWith("vis")) {
varianti.add(new Variants(celms.substring(3,celms.length()), AttributeNames.i_Degree, AttributeNames.v_Superlative));
} else {
varianti.add(new Variants(celms, AttributeNames.i_Degree, AttributeNames.v_Comparative));
}
break;
case 22: // jaundzimušais -> jaundzimusī
if (celms.endsWith("us"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"uš"));
break;
case 24: // analoģiski case 2, bet ar pārāko / vispārāko pakāpi - visizsakošākais
String pakāpe = AttributeNames.v_Comparative;
if (celms.startsWith("vis")) {
pakāpe = AttributeNames.v_Superlative;
celms = celms.substring(3,celms.length());
}
varianti.add(new Variants(celms+"ā", AttributeNames.i_Degree, pakāpe));
varianti.add(new Variants(celms+"ī", AttributeNames.i_Degree, pakāpe));
varianti.add(new Variants(celms+"ē", AttributeNames.i_Degree, pakāpe));
break;
case 25: // analoģiski #8, bet ar pārākajām pakāpēm priekš -amāks formām
pakāpe = AttributeNames.v_Comparative;
if (celms.startsWith("vis")) {
pakāpe = AttributeNames.v_Superlative;
celms = celms.substring(3,celms.length());
}
if (celms.endsWith("inā")) varianti.add(new Variants(celms, AttributeNames.i_Degree, pakāpe)); // nav else, jo piemēram vārdam "mainās" arī ir beigās -inās, bet tam vajag -īties likumu;
if (celms.endsWith("ā")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ī", AttributeNames.i_Degree, pakāpe));
else if (celms.endsWith("a")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ē", AttributeNames.i_Degree, pakāpe));
if (!celms.endsWith("ina")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ā", AttributeNames.i_Degree, pakāpe));
}
break;
case 26: // dv. 3. konjugācijas miju gadījuma formas - otrās personas tagadne, pavēles izteiksme
if (celms.endsWith("gul"))
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"lē")); // guli -> gulēt
if (celms.endsWith("tec")) {
varianti.add(new Variants(celms+"ē")); // teci -> tecēt
} else if (celms.endsWith("k") && !celms.endsWith("tek")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "cī")); // saki -> sacīt
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"cē")); //māki -> mācēt
} else if (celms.endsWith("g") ) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "dzī")); //slogi -> slodzīt
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"dzē")); //vajag -> vajadzēt
} else if (celms.endsWith("loc") || celms.endsWith("moc") || celms.endsWith("urc"))
varianti.add(new Variants(celms+"ī")); // alternatīvā forma
else varianti.add(new Variants(celms+"ē")); // sēdies -> sēdēties
break;
case 27: // -ams -āms 3. konjugācijai miju gadījumam, un arī mēs/jūs formas
if (celms.endsWith("kā"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"cī")); //sacīt
else if (celms.endsWith("gā") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"dzī")); //slodzīt -> slogu
else if (celms.endsWith("ka") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"cē")); //mācēt -> mākam
else if (celms.endsWith("ža") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"dē")); //sēdēt -> sēžam
else if (celms.endsWith("ļa")) varianti.add(new Variants(celms.substring(0,celms.length()-2)+"lē")); //gulēt -> guļam
else if (celms.endsWith("ga")) varianti.add(new Variants(celms.substring(0,celms.length()-2)+"dzē")); //vajadzēt -> vajag
break;
case 30: // 3. konjugācija 3. pers. tagadne ar miju
if (celms.endsWith("vajadz")) break; //izņēmums - lai korekti ir 'vajadzēt' -> 'vajag'
else if (celms.endsWith("ka") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"cī")); //sacīt
else if (celms.endsWith("ga"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"dzī")); //slodzīt -> sloga
else if (celms.endsWith("k") )
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"cē")); //mācēt -> māk
else if (celms.endsWith("ž") )
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"dē")); //sēdēt -> sēž
else if (celms.endsWith("ļ")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"lē")); // "guļ"->"gulēt"
else if (celms.endsWith("vajag")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"dzē")); //vajadzēt -> vajag
break;
case 32: // analoģiski case 20, bet ar pārāko / vispārāko pakāpi - visizsakošākais
pakāpe = AttributeNames.v_Comparative;
if (celms.startsWith("vis")) {
pakāpe = AttributeNames.v_Superlative;
celms = celms.substring(3,celms.length());
}
if (celms.endsWith("k") ) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "cī", AttributeNames.i_Degree, pakāpe)); //sacīt -> sakošākais
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"cē", AttributeNames.i_Degree, pakāpe)); //mācēt -> mākošākais
} else if (celms.endsWith("g")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "dzī", AttributeNames.i_Degree, pakāpe)); //slodzīt -> slogošākais
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "dzē", AttributeNames.i_Degree, pakāpe)); //vajadzēt -> vajagošākais
} else if (celms.endsWith("ž") ) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "dē", AttributeNames.i_Degree, pakāpe)); //sēdēt -> sēžu
} else if (celms.endsWith("ļ")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"lē", AttributeNames.i_Degree, pakāpe)); //gulēt -> guļošākais un arī gulošākais
break;
case 33: // analoģiski #27, bet ar pārākajām pakāpēm priekš -amāks formām
pakāpe = AttributeNames.v_Comparative;
if (celms.startsWith("vis")) {
pakāpe = AttributeNames.v_Superlative;
celms = celms.substring(3,celms.length());
}
if (celms.endsWith("kā"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"cī", AttributeNames.i_Degree, pakāpe)); //sacīt
else if (celms.endsWith("gā"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"dzī", AttributeNames.i_Degree, pakāpe)); //slodzīt -> slogu
else if (celms.endsWith("ka"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"cē", AttributeNames.i_Degree, pakāpe)); //mācēt -> mākam
else if (celms.endsWith("ga"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"dzē", AttributeNames.i_Degree, pakāpe)); //vajadzēt -> vajag
else if (celms.endsWith("ža") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"dē", AttributeNames.i_Degree, pakāpe)); //sēdēt -> sēžam
else if (celms.endsWith("guļa"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"lē", AttributeNames.i_Degree, pakāpe)); //gulēt -> guļam
break;
case 34: // īpašības vārdiem -āk- un vis- izskaņām kā -ajam: liekam nevis zaļ-š->zaļ-ajam, bet zaļ-š->zaļ-a-jam, bet pēdēj-ais -> pēdē-jam/pēdēj-a-jam
if (celms.endsWith("āka") && celms.length() > 4) {
if (celms.startsWith("vis")) varianti.add(new Variants(celms.substring(3,celms.length()-3),AttributeNames.i_Degree,AttributeNames.v_Superlative));
else varianti.add(new Variants(celms.substring(0,celms.length()-3),AttributeNames.i_Degree,AttributeNames.v_Comparative));
}
if (celms.endsWith("a")) // zaļa-jam -> zaļ; pēdēja-jam -> pēdēj
varianti.add(new Variants(celms.substring(0,celms.length()-1) ,AttributeNames.i_Degree, AttributeNames.v_Positive));
else if (celms.endsWith("ē")) // pēdē-jam -> pēdēj
varianti.add(new Variants(celms+"j",AttributeNames.i_Degree, AttributeNames.v_Positive));
break;
case 35: // substantivizējušos "īpašības vārdu" izskaņas kā -ajam: liekam nevis zaļ-š->zaļ-ajam, bet zaļ-š->zaļ-a-jam, bet pēdēj-ais -> pēdē-jam/pēdēj-a-jam; bez pārākās/vispārākās pakāpes
if (celms.endsWith("a")) // zaļa-jam -> zaļ; pēdēja-jam -> pēdēj
varianti.add(new Variants(celms.substring(0,celms.length()-1) ,AttributeNames.i_Degree, AttributeNames.v_Positive));
else if (celms.endsWith("ē")) // pēdē-jam -> pēdēj
varianti.add(new Variants(celms+"j",AttributeNames.i_Degree, AttributeNames.v_Positive));
// citiem pareiziem variantiem IMHO te nevajadzētu būt
break;
case 36: // 'iet' speciālgadījums - normāli 3. personas tagadnei atbilstošais celms būtu 'ej', bet ir 'iet'.
varianti.add(new Variants(celms));
if (celms.endsWith("iet"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"ej"));
break;
case 38: // Apstākļa vārdi ar gradāciju
if (celms.endsWith("āk") && celms.length() > 3) {
if (celms.startsWith("vis")) {
varianti.add(new Variants(celms.substring(3,celms.length()-2),AttributeNames.i_Degree,AttributeNames.v_Superlative));
varianti.add(new Variants(celms.substring(3,celms.length()-2) + "i",AttributeNames.i_Degree,AttributeNames.v_Superlative));
varianti.add(new Variants(celms.substring(3,celms.length()-2) + "u",AttributeNames.i_Degree,AttributeNames.v_Superlative));
} else {
varianti.add(new Variants(celms.substring(0,celms.length()-2),AttributeNames.i_Degree,AttributeNames.v_Comparative));
varianti.add(new Variants(celms.substring(0,celms.length()-2) + "i",AttributeNames.i_Degree,AttributeNames.v_Comparative));
varianti.add(new Variants(celms.substring(0,celms.length()-2) + "u",AttributeNames.i_Degree,AttributeNames.v_Comparative));
}
} else varianti.add(new Variants(celms,AttributeNames.i_Degree, AttributeNames.v_Positive));
break;
// ------ LATGALIAN from here -----
case 100: // latgaliešu 'burtu mija', kur pirms -e, -i, -ī, -ē, -ie ļ, ņ, ķ, ģ kļūst par l, n, k, g
if (celms.endsWith("l")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ļ", "Mija", "ļ -> l"));
} else if (celms.endsWith("n")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ņ", "Mija", "ņ -> n"));
} else if (celms.endsWith("k")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ķ", "Mija", "ķ -> k"));
} else if (celms.endsWith("g")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ģ", "Mija", "ģ -> g"));
} else {
varianti.add(new Variants(celms));
}
break;
case 101: // latgaliešu līdzskaņu mija lietvārdiem, parastās galotnes (izņemot -i, -e, -ī, -ē, -ie, -ei)
// Mijas no Leikumas "Vasals!"
if (celms.endsWith("šļ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "sl", "Mija", "sl -> šļ"));
} else if (celms.endsWith("žļ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "zl", "Mija", "zl -> žļ"));
} else if (celms.endsWith("šņ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "sn", "Mija", "sn -> šņ"));
} else if (celms.endsWith("žņ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "zn", "Mija", "zn -> žņ"));
} else if (celms.endsWith("č")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "c", "Mija", "c -> č"));
} else if (celms.endsWith("ž")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "d", "Mija", "d -> ž"));
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "z", "Mija", "z -> ž"));
} else if (celms.endsWith("š")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "t", "Mija", "t -> š"));
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "s", "Mija", "s -> š"));
// Citas mijas
} else if (celms.endsWith("ķ")) { // Andronovs?
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "k", "Mija", "k -> ķ"));
} else if (celms.endsWith("ļ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "l", "Mija", "l -> ļ"));
} else if (celms.endsWith("ņ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "n", "Mija", "n -> ņ"));
} else {
varianti.add(new Variants(celms));
}
break;
case 102: // latgaliešu līdzskaņu mīkstināšana lietvārdiem, e, i, ē, ī, ie galotnes
// Burtu miju ietekmētās vairāksimbolu mijas
if (celms.endsWith("šl")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "šļ", "Mija", "šļ -> šl"));
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "sl", "Mija", "sl -> šl"));
} else if (celms.endsWith("žl")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "žļ", "Mija", "žļ -> žl"));
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "zl", "Mija", "zl -> žl"));
} else if (celms.endsWith("šn")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "šņ", "Mija", "šņ -> šn"));
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "sn", "Mija", "sn -> šn"));
} else if (celms.endsWith("žn")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "žņ", "Mija", "žņ -> žn"));
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "zn", "Mija", "zn -> žn"));
// Parastās, mijīgās, mijas
} else if (celms.endsWith("č")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "c", "Mija", "c -> č"));
} else if (celms.endsWith("š")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "t", "Mija", "t -> š"));
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "s", "Mija", "s -> š"));
} else if (celms.endsWith("ž")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "d", "Mija", "d -> ž"));
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "z", "Mija", "z -> ž"));
// Burtu miju ietekmētās viensimbola mijas
} else if (celms.endsWith("l")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ļ", "Mija", "ļ -> l"));
} else if (celms.endsWith("n")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ņ", "Mija", "ņ -> n"));
} else if (celms.endsWith("k")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ķ", "Mija", "ķ -> k"));
} else if (celms.endsWith("g")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ģ", "Mija", "ģ -> g"));
} else {
varianti.add(new Variants(celms));
}
break;
default:
System.err.printf("Invalid StemChange ID, stem '%s', stemchange %d\n", celms, mija);
}
} catch (StringIndexOutOfBoundsException e){
try {
new PrintStream(System.err, true, "UTF-8").printf(
"StringIndexOutOfBounds, celms '%s', mija %d\n", stem, stemChange);
e.printStackTrace();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}
return varianti;
}
public static boolean atpakaļlocīšanasVerifikācija(Variants variants, String stem, int stemChange, String trešāSakne, boolean properName) {
// Verifikācija, vai variantu izlokot tiešām sanāk tas kas vajag.
if (Arrays.asList(18,20,34,35).contains(stemChange)) {
// 18. mijā neierobežojam, jo tur ir nesimetrija - vokatīvu silvij! atpazīstam bet neģenerējam.
// 20. mijā ir arī alternatīvas - guļošs un gulošs
// 34/35 mijā - pēdējajam, zaļoksnējajam atpazīstam bet neģenerējam
return true;
}
if (stemChange == 6 && trešāSakne.endsWith("ī")) trešāSakne = trešāSakne.substring(0, trešāSakne.length()-1);
ArrayList atpakaļlocīti = MijasLocīšanai(variants.celms, stemChange, trešāSakne, variants.isMatchingStrong(AttributeNames.i_Degree, AttributeNames.v_Superlative), properName);
boolean atrasts = false;
for (Variants locītais : atpakaļlocīti) {
if (locītais.celms.equalsIgnoreCase(stem)) atrasts = true;
}
if (!atrasts && Arrays.asList(1,2,5,6,7,8,9,14,15,17,23,26,36,37).contains(stemChange)) {
if (stemChange == 7 && variants.celms.endsWith("dod")) return true; // izņēmums, ka "dodi" atpazīst bet neģenerē
if (properName) {
// pie atpazīšanas properName var būt nepareizs, jo lielie burti ir arī citos gadījumos - teikuma sākumā utt
return atpakaļlocīšanasVerifikācija(variants, stem, stemChange, trešāSakne, false);
}
// System.err.printf("Celmam '%s' ar miju %d sanāca '%s' - noraidījām dēļ atpakaļlocīšanas verifikācijas.\n", stem, stemChange, variants.celms);
return false;
} else {
if (!atrasts) { //debuginfo.
// FIXME - šo principā vajadzētu realizēt kā karodziņu - ka ieliekam Variant klasē zīmi, ka šis ir neiesakāms, un tad nebrīnamies, ja ģenerācija to neiedod; vai arī lai ģenerācija dod tos variantus ar tādu karodziņu un tad šeit tos ieraugam
System.err.printf("Celms '%s' ar miju %d sanāca '%s'. Bet atpakaļ lokot:\n", stem, stemChange, variants.celms);
for (Variants locītais : atpakaļlocīti) {
System.err.printf("\t'%s'\n", locītais.celms);
}
}
return true;
}
}
private static int syllables(String word) {
int counter = 0;
boolean in_vowel = false;
HashSet vowels = new HashSet( Arrays.asList(new Character[] {'a','ā','e','ē','i','ī','o','u','ū'}));
for (char c : word.toCharArray()) {
if (!in_vowel && vowels.contains(c))
counter++;
in_vowel = vowels.contains(c);
}
return counter;
}
/***
* procedūra, kas realizē visas celmu pārmaiņas - līdzskaņu mijas; darbības vārdu formas, utml. *vārdu ģenerēšanai*
* @param stem
* @param stemChange
* @param trešāSakne
* @param pieliktVisPārākoPak
* @param properName
* @return masīvs ar variantiem - FIXME - principā vajadzētu būt vienam; izņēmums ir pārākās/vispārākās formas
*/
public static ArrayList MijasLocīšanai (String stem, int stemChange, String trešāSakne, boolean pieliktVisPārākoPak, boolean properName) {
ArrayList varianti = new ArrayList(1);
if (stem.trim().equals("")) return varianti;
int mija;
String celms;
try {
switch (stemChange) { //TODO - uz normālāku struktūru
case 4: // vajadzības izteiksmes jā-
celms = "jā" + stem;
mija = 0;
break;
case 5: // vajadzības izteiksme 3. konjugācijai bez mijas
celms = "jā" + stem;
mija = 9;
break;
case 12: // vajadzības izteiksme 3. konjugācijai atgriezeniskai bez mijas
celms = "jā" + stem;
mija = 8;
break;
case 19: // vajadzības_vēlējuma izteiksme 3. konjugācijai bez mijas (jāmācot)
celms = "jā" + stem;
mija = 2;
break;
case 28: // vajadzības_vēlējuma izteiksme 3. konjugācijai ar miju (jāmākot)
celms = "jā" + stem;
mija = 20;
break;
case 29: // vajadzības izteiksme 3. konjugācijai atgriezeniskai ar miju
celms = "jā" + stem;
mija = 27;
break;
case 31: // vajadzības izteiksme 3. konjugācijai ar miju
celms = "jā" + stem;
mija = 30;
break;
case 37: // vajadzības izteiksme 1. konjugācijai ar miju
celms = "jā" + stem;
mija = 36;
break;
default:
celms = stem;
mija = stemChange;
}
switch (mija) {
case 0: varianti.add(new Variants(celms)); break; // nav mijas
case 1: // lietvārdu līdzskaņu mija
// Personvārdu mijas - Valdis-Valda; Gatis-Gata. Eglīts - Eglīša. Vēl ir literatūrā minēts izņēmums -skis -ckis (Čaikovskis, Visockis), taču tiem tāpat viss šķiet ok.
if (properName && celms.endsWith("t") && !celms.endsWith("īt")) {
varianti.add(new Variants(celms));
if (syllables(celms) > 1) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"š","Mija","t -> š"));
}
else if (properName && celms.endsWith("d") ) {
if (syllables(celms) > 1)
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ž","Mija","d -> ž"));
else varianti.add(new Variants(celms));
}
else if (celms.endsWith("s") || celms.endsWith("t")) {
if (celms.endsWith("kst")) {
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"kš","Mija","kst -> kš"));
} else if (celms.endsWith("nst")) { // skansts -> skanšu
varianti.add(new Variants(celms.substring(0, celms.length() - 3) + "nš", "Mija", "nst -> nš"));
} else if (celms.endsWith("s")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"š","Mija","s -> š"));
}
else if (celms.endsWith("t")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"š","Mija","t -> š"));
}
}
else if (celms.endsWith("z")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ž","Mija","z -> ž"));
}
else if (celms.endsWith("d")) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ž","Mija","d -> ž"));
}
else if (celms.endsWith("c")) {varianti.add(new Variants(celms.substring(0,celms.length()-1)+"č","Mija","c -> č"));}
else if (celms.endsWith("l")) {
if (celms.endsWith("sl")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"šļ","Mija","sl -> šļ"));}
else if (celms.endsWith("zl")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"žļ","Mija","zl -> žļ"));}
else if (celms.endsWith("ll")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ļļ","Mija","ll -> ļļ"));}
else varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ļ","Mija","l -> ļ"));
}
else if (celms.endsWith("n")) {
if (celms.endsWith("sn")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"šņ","Mija","sn -> šņ"));}
else if (celms.endsWith("zn")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"žņ","Mija","zn -> žņ"));}
else if (celms.endsWith("ln")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ļņ","Mija","ln -> ļņ"));}
else if (celms.endsWith("nn")) {varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ņņ","Mija","nn -> ņņ"));}
else /*if (!(celms.endsWith("zņ") || celms.endsWith("sņ") || celms.endsWith("lņ")))*/ {
//varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ņ","Mija", "l -> ņ ??"));
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ņ","Mija", "n -> ņ"));
}
}
else if (celms.endsWith("p") || celms.endsWith("b") || celms.endsWith("m") || celms.endsWith("v")) {
varianti.add(new Variants(celms+"j","Mija","p->pj (u.c.)"));
}
else if (celms.endsWith("f")) { // Žirafu -> žirafju, žirafu
Variants v = new Variants(celms+"j","Mija","p->pj (u.c.)");
v.addAttribute(AttributeNames.i_Recommended, AttributeNames.v_Yes);
varianti.add(v);
varianti.add(new Variants(celms));
}
else if (!(celms.endsWith("p") || celms.endsWith("b") || celms.endsWith("m") || celms.endsWith("v") ||
celms.endsWith("t") || celms.endsWith("d") || celms.endsWith("c") || celms.endsWith("z") ||
celms.endsWith("s") || celms.endsWith("z") || celms.endsWith("n") || celms.endsWith("l") ) )
varianti.add(new Variants(celms));
break;
case 2: // dv. 3. konjugācijas tagadne, kas noņem celma pēdējo burtu
if (celms.endsWith("ī") || celms.endsWith("inā"))
varianti.add(new Variants(celms.substring(0,celms.length()-1), "Garā", "ā"));
else varianti.add(new Variants(celms.substring(0,celms.length()-1)));
break;
case 3: // īpašības vārdiem pieliekam -āk- un vis-
varianti.add(new Variants(celms,AttributeNames.i_Degree,AttributeNames.v_Positive));
if (!celms.endsWith("āk")) {
varianti.add(new Variants(celms + "āk", AttributeNames.i_Degree, AttributeNames.v_Comparative));
if (pieliktVisPārākoPak)
varianti.add(new Variants("vis" + celms + "āk", AttributeNames.i_Degree, AttributeNames.v_Superlative));
}
break;
case 6: // 1. konjugācijas nākotne
if (celms.endsWith("s")) {
if (trešāSakne.endsWith("d")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"dī"));
else if (trešāSakne.endsWith("t")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"tī"));
else if (trešāSakne.endsWith("s")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"sī"));
else varianti.add(new Variants(celms));
} else if (celms.endsWith("z") || celms.endsWith("š")) {
varianti.add(new Variants(celms+"ī"));
}
else varianti.add(new Variants(celms));
break;
case 7: // 1. konjugācijas 2. personas tagadne
case 23: // 1. konjugācijas 2. personas tagadne - ja pēc tam seko garā galotne kā -iet
if (celms.endsWith("š") && trešāSakne.endsWith("s")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"s"));
else if (celms.endsWith("š") && trešāSakne.endsWith("t")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"t"));
else if ( (celms.endsWith("od") && !celms.endsWith("dod")) || celms.endsWith("ūd") || celms.endsWith("op") || celms.endsWith("ūp") || celms.endsWith("ot") || celms.endsWith("ūt") || celms.endsWith("īt") || celms.endsWith("iet") || celms.endsWith("st")) {
if (mija == 7)
varianti.add(new Variants(celms+"i"));
else varianti.add(new Variants(celms));
}
else if (celms.endsWith("ļ")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"l"));
else if (celms.endsWith("mj") || celms.endsWith("bj") || celms.endsWith("pj")) varianti.add(new Variants(celms.substring(0,celms.length()-1)));
else if (celms.endsWith("k")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"c"));
else if (celms.endsWith("g")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"dz"));
else if (celms.endsWith("ž")) {
// varianti.add(new Variants(celms.substring(0,celms.length()-1)+"z")); // griez -> griežu
varianti.add(new Variants(trešāSakne)); // skaužu -> skaud, laužu -> lauz; sanāk atbilstoši pagātnes celmam
} else varianti.add(new Variants(celms));
break;
case 8: // -ams -āms 3. konjugācijai bezmiju gadījums
if (celms.endsWith("inā")) varianti.add(new Variants(celms, "Garā", "ā"));
else if (celms.endsWith("ī")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ā", "Garā", "ā"));
else if (celms.endsWith("ē")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"a"));
else if (celms.endsWith("ā")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"a"));
else varianti.add(new Variants(celms));
break;
case 9: // 3. konjugācija 3. pers. tagadne bez mijas
if (celms.endsWith("dā")) varianti.add(new Variants(celms.substring(0,celms.length()-1))); // dzied, raud
else if (celms.endsWith("ā") || celms.endsWith("ī"))
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"a"));
else varianti.add(new Variants(celms.substring(0,celms.length()-1)));
break;
case 10: // īpašības vārds -āk- un vis-, -i apstākļa formai
varianti.add(new Variants(celms,AttributeNames.i_Degree,AttributeNames.v_Positive));
varianti.add(new Variants(celms + "āk",AttributeNames.i_Degree,AttributeNames.v_Comparative));
if (pieliktVisPārākoPak)
varianti.add(new Variants("vis" + celms + "āk",AttributeNames.i_Degree,AttributeNames.v_Superlative));
break;
case 11: // -uša formas
if (celms.endsWith("c")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"k"));
else if (celms.endsWith("dz")) varianti.add(new Variants(celms.substring(0,celms.length()-2)+"g"));
else varianti.add(new Variants(celms));
break;
case 13: // īpašības vārdiem -āk-, ar š->s nominatīva formā (zaļš -> zaļāks
varianti.add(new Variants(celms+"āk", AttributeNames.i_Degree, AttributeNames.v_Comparative));
if (pieliktVisPārākoPak)
varianti.add(new Variants("vis" + celms + "āk",AttributeNames.i_Degree, AttributeNames.v_Superlative));
break;
case 14: // 1. konjugācijas "-is" forma
if (celms.endsWith("k")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"c"));
else if (celms.endsWith("g")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"dz"));
else varianti.add(new Variants(celms));
break;
case 15: // pūst -> pūzdams nopūzdamies s -> z mija tad, ja 3. sakne (pagātnes sakne) beidzas ar t/d
if (celms.endsWith("s") && (trešāSakne.endsWith("t") || trešāSakne.endsWith("d"))) {
varianti.add(new Variants(celms.substring(0,celms.length()-1)+"z"));
} else varianti.add(new Variants(celms));
break;
case 16: // 1. konjugācijas "-šana" atvasināšana
if (celms.endsWith("s") || celms.endsWith("z"))
varianti.add(new Variants(celms.substring(0,celms.length()-1))); // nest -> nešana
else varianti.add(new Variants(celms));
break;
case 17: // īsā sieviešu dzimtes vokatīva forma "kristīnīt!" "margriet!"
if (syllables(celms) >= 2 &&
!(celms.endsWith("kāj") || celms.endsWith("māj")) )
varianti.add(new Variants(celms));
break;
case 18: // garā sieviešu dzimtes vokatīva forma "laura!" "margrieta!"
if (syllables(celms) < 2 || // NB! te ir < 2 bet pie atpazīšanas <= 2 - ar 2 zilbēm pagaidām atpazīst abus un ģenerē vienu
!(celms.endsWith("ij") || celms.endsWith("īn") || celms.endsWith("īt") || celms.endsWith("ān") || celms.endsWith("iņ") || celms.endsWith("ēn") || celms.endsWith("niec") || celms.endsWith("āj")) )
varianti.add(new Variants(celms));
if (syllables(celms) > 1 && (celms.endsWith("kāj") || celms.endsWith("māj")))
varianti.add(new Variants(celms));
break;
case 20: // dv. 3. konjugācijas tagadnes mija 1. personas tagadnei, -ot divdabim un vajadzībai - atšķiras no 26. mijas 'gulēt' un 'tecēt'
if (celms.endsWith("gulē")) {
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ļ")); //gulēt -> guļu
// variantu ar -l (gulošs) atpazīstam bet neģenerējam
} else if (celms.endsWith("cī") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"k", "Garā", "ā")); //sacīt
else if (celms.endsWith("cē") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"k")); //mācēt -> māku
else if (celms.endsWith("dē") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ž")); //sēdēt -> sēžu
else if (celms.endsWith("dzē") || celms.endsWith("dzī"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"g")); //vajadzēt -> vajag, slodzīt -> slogu
break;
case 21: // divdabju formas ar pārāko/vispārāko pakāpi
varianti.add(new Variants(celms, AttributeNames.i_Degree, AttributeNames.v_Comparative));
if (pieliktVisPārākoPak)
varianti.add(new Variants("vis" + celms, AttributeNames.i_Degree, AttributeNames.v_Superlative));
break;
case 22: // jaundzimušais -> jaundzimusī
if (celms.endsWith("uš"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"us"));
break;
case 24: // analoģiski 2, bet ar pārākajām / vispārākajām pakāpēm
if (celms.endsWith("ī") || celms.endsWith("inā"))
varianti.add(new Variants(celms.substring(0,celms.length()-1), AttributeNames.i_Degree, AttributeNames.v_Comparative));
else varianti.add(new Variants(celms.substring(0,celms.length()-1), AttributeNames.i_Degree, AttributeNames.v_Comparative));
if (pieliktVisPārākoPak) {
if (celms.endsWith("ī") || celms.endsWith("inā"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-1), AttributeNames.i_Degree, AttributeNames.v_Superlative));
else varianti.add(new Variants("vis" + celms.substring(0,celms.length()-1), AttributeNames.i_Degree, AttributeNames.v_Superlative));
}
break;
case 25: // analoģiski 8, bet ar pārākajām / vispārākajām pakāpēm. DRY :( :(
if (celms.endsWith("inā")) varianti.add(new Variants(celms, AttributeNames.i_Degree, AttributeNames.v_Comparative));
else if (celms.endsWith("ī")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"ā", AttributeNames.i_Degree, AttributeNames.v_Comparative));
else if (celms.endsWith("ē")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"a", AttributeNames.i_Degree, AttributeNames.v_Comparative));
else if (celms.endsWith("ā")) varianti.add(new Variants(celms.substring(0,celms.length()-1)+"a", AttributeNames.i_Degree, AttributeNames.v_Comparative));
else varianti.add(new Variants(celms, AttributeNames.i_Degree, AttributeNames.v_Comparative));
if (pieliktVisPārākoPak) {
if (celms.endsWith("inā")) varianti.add(new Variants("vis" + celms, AttributeNames.i_Degree, AttributeNames.v_Superlative));
else if (celms.endsWith("ī")) varianti.add(new Variants("vis" + celms.substring(0,celms.length()-1)+"ā", AttributeNames.i_Degree, AttributeNames.v_Superlative));
else if (celms.endsWith("ē")) varianti.add(new Variants("vis" + celms.substring(0,celms.length()-1)+"a", AttributeNames.i_Degree, AttributeNames.v_Superlative));
else if (celms.endsWith("ā")) varianti.add(new Variants("vis" + celms.substring(0,celms.length()-1)+"a", AttributeNames.i_Degree, AttributeNames.v_Superlative));
else varianti.add(new Variants("vis" + celms, AttributeNames.i_Degree, AttributeNames.v_Superlative));
}
break;
case 26: // dv. 3. konjugācijas miju gadījuma formas - otrās personas tagadne, pavēles izteiksme
if (celms.endsWith("lē")) varianti.add(new Variants(celms.substring(0,celms.length()-1))); //gulēt -> guli
else if (celms.endsWith("cī") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"k", "Garā", "ā")); //sacīt->saki
else if (celms.endsWith("tecē"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"c")); //tecēt -> teci
else if (celms.endsWith("cē"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"k")); //mācēt -> māki
else if (celms.endsWith("dzē") || celms.endsWith("dzī"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"g")); //vajadzēt -> vajag, slodzīt -> slogi
else
varianti.add(new Variants(celms.substring(0,celms.length()-1))); // sēdē-ties -> sēd-ies
break;
case 27: // -ams -āms 3. konjugācijai miju gadījums
if (celms.endsWith("cī"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"kā", "Garā", "ā")); //sacīt->sakām
else if (celms.endsWith("dzī"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"gā")); //slodzīt -> slogām
else if (celms.endsWith("cē"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ka")); //mācēt -> mākam
else if (celms.endsWith("gulē")) varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ļa")); //gulēt -> guļam
else if (celms.endsWith("dē") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ža")); //sēdēt -> sēžam
else if (celms.endsWith("dzē"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"ga")); //vajadzēt -> vajagam
break;
case 30: // 3. konjugācija 3. pers. tagadne ar miju
if (celms.endsWith("cī"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ka")); // "saka"
else if (celms.endsWith("dzī"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"ga")); //slodzīt -> sloga
else if (celms.endsWith("cē"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"k")); //mācēt -> māk
else if (celms.endsWith("dē") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ž")); //sēdēt -> sēž
else if (celms.endsWith("dzē"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"g")); //vajadzēt -> vajag
else if (celms.endsWith("lē")) varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ļ")); //gulēt -> guļ
break;
case 32: // analoģiski 20, bet ar pārākajām / vispārākajām pakāpēm
if (celms.endsWith("cī") || celms.endsWith("cē"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"k", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //sacīt
else if (celms.endsWith("dzī") || celms.endsWith("dzē"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"g", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //slodzīt -> slogu
else if (celms.endsWith("dē") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ž", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //sēdēt -> sēž
else if (celms.endsWith("lē"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ļ", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //gulēt -> guļu
else
varianti.add(new Variants(celms.substring(0,celms.length()-1), AttributeNames.i_Degree, AttributeNames.v_Comparative));
if (pieliktVisPārākoPak) {
// TODO :( :( DRY
if (celms.endsWith("cī") || celms.endsWith("cē"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-2)+"k", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //sacīt
else if (celms.endsWith("vajadzē"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-3)+"g", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //vajadzēt -> vajag
else if (celms.endsWith("dzī") || celms.endsWith("dzē"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-3)+"g", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //slodzīt -> slogu
else if (celms.endsWith("dē") )
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-2)+"ž", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //sēdēt -> sēž
else if (celms.endsWith("gulē"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-2)+"ļ")); //gulēt -> guļu
else
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-1), AttributeNames.i_Degree, AttributeNames.v_Superlative));
}
break;
case 33: // analoģiski 27, bet ar pārākajām / vispārākajām pakāpēm. DRY :( :(
if (celms.endsWith("cī"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"kā", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //sacīt
else if (celms.endsWith("dzī"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"gā", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //slodzīt -> slogu
else if (celms.endsWith("cē"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ka", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //mācēt -> māk
else if (celms.endsWith("lē"))
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ļa", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //gulēt -> guļam
else if (celms.endsWith("dē") )
varianti.add(new Variants(celms.substring(0,celms.length()-2)+"ža", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //sēdēt -> sēž
else if (celms.endsWith("dzē"))
varianti.add(new Variants(celms.substring(0,celms.length()-3)+"ga", AttributeNames.i_Degree, AttributeNames.v_Comparative)); //vajadzēt -> vajag
if (pieliktVisPārākoPak) {
if (celms.endsWith("cī"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-2)+"kā", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //sacīt
else if (celms.endsWith("dzī"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-3)+"gā", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //slodzīt -> slogu
else if (celms.endsWith("cē"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-2)+"ka", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //mācēt -> māk
else if (celms.endsWith("lē"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-2)+"ļa", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //gulēt -> guļam
else if (celms.endsWith("dē") )
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-2)+"ža", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //sēdēt -> sēž
else if (celms.endsWith("dzē"))
varianti.add(new Variants("vis" + celms.substring(0,celms.length()-3)+"ga", AttributeNames.i_Degree, AttributeNames.v_Superlative)); //vajadzēt -> vajag
}
break;
case 34: // īpašības vārdiem -āk- un vis- izskaņām kā -ajam: liekam nevis zaļ-š->zaļ-ajam, bet zaļ-š->zaļ-a-jam, bet pēdēj-ais -> pēdē-jam/pēdēj-a-jam
if (celms.endsWith("ēj")) // pēdēj-ais -> pēdē-jam
varianti.add(new Variants(celms.substring(0, celms.length()-1),AttributeNames.i_Degree,AttributeNames.v_Positive));
else // zaļ-š -> zaļa-jam
varianti.add(new Variants(celms+"a",AttributeNames.i_Degree,AttributeNames.v_Positive));
varianti.add(new Variants(celms + "āka",AttributeNames.i_Degree,AttributeNames.v_Comparative));
if (pieliktVisPārākoPak)
varianti.add(new Variants("vis" + celms + "āka",AttributeNames.i_Degree,AttributeNames.v_Superlative));
break;
case 35: // Substantivizējušamies "īpašības vārdiem" izskaņām kā -ajam: liekam nevis zaļ-š->zaļ-ajam, bet zaļ-š->zaļ-a-jam, bet pēdēj-ais -> pēdē-jam/pēdēj-a-jam; bez pārākās/vispārākās pakāpes
if (celms.endsWith("ēj")) // pēdēj-ais -> pēdē-jam
varianti.add(new Variants(celms.substring(0, celms.length()-1),AttributeNames.i_Degree,AttributeNames.v_Positive));
else // zaļ-š -> zaļa-jam
varianti.add(new Variants(celms+"a",AttributeNames.i_Degree,AttributeNames.v_Positive));
break;
case 36: // 'iet' speciālgadījums - normāli 3. personas tagadnei atbilstošais celms būtu 'ej', bet ir 'iet'.
if (celms.endsWith("ej") && trešāSakne.endsWith("gāj"))
varianti.add(new Variants(celms.substring(0, celms.length()-2)+"iet"));
else varianti.add(new Variants(celms));
break;
case 38: // apstākļa vārdi ar gradāciju
varianti.add(new Variants(celms,AttributeNames.i_Degree,AttributeNames.v_Positive));
if (celms.endsWith("i") || celms.endsWith("u")) {
celms = celms.substring(0, celms.length()-1);
}
varianti.add(new Variants(celms + "āk",AttributeNames.i_Degree,AttributeNames.v_Comparative));
if (pieliktVisPārākoPak)
varianti.add(new Variants("vis" + celms + "āk",AttributeNames.i_Degree,AttributeNames.v_Superlative));
break;
// ------ LATGALIAN from here -----
case 100: // // latgaliešu 'burtu mija', kur pirms -e, -i, -ī, -ē, -ie ļ, ņ, ķ, ģ kļūst par l, n, k, g (bruoļs -> bruoli)
if (celms.endsWith("ļ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "l"));
} else if (celms.endsWith("ņ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "n"));
} else if (celms.endsWith("ķ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "k"));
} else if (celms.endsWith("ģ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ģ"));
} else {
varianti.add(new Variants(celms));
}
break;
case 101: // latgaliešu līdzskaņu mija lietvārdiem, parastās galotnes (izņemot -i, -e, -ī, -ē, -ie, -ei)
// Mijas no Leikumas "Vasals!"
if (celms.endsWith("sl")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "šļ"));
} else if (celms.endsWith("zl")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "žļ"));
} else if (celms.endsWith("sn")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "šņ"));
} else if (celms.endsWith("zn")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "žņ"));
} else if (celms.endsWith("c")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "č"));
} else if (celms.endsWith("d")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ž"));
} else if (celms.endsWith("s")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "š"));
} else if (celms.endsWith("t")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "š"));
} else if (celms.endsWith("z")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ž"));
// Citas mijas
} else if (celms.endsWith("k")) { // Andronovs?
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ķ"));
} else if (celms.endsWith("l")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ļ"));
} else if (celms.endsWith("n")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ņ"));
} else {
varianti.add(new Variants(celms));
}
break;
case 102: // // latgaliešu līdzskaņu mīkstināšana lietvārdiem, e, i, ē, ī, ie galotnes
// Burtu miju ietekmētās vairāksimbolu mijas
if (celms.endsWith("šļ") || celms.endsWith("sl")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "šl"));
} else if (celms.endsWith("žļ") || celms.endsWith("zl")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "žl"));
} else if (celms.endsWith("šņ") || celms.endsWith("sn")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "šn"));
} else if (celms.endsWith("žņ") || celms.endsWith("zn")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 2) + "žn"));
// Parastās, mijīgās, mijas
} else if (celms.endsWith("c")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "č"));
} else if (celms.endsWith("s")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "š"));
} else if (celms.endsWith("t")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "š"));
} else if (celms.endsWith("z")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ž"));
} else if (celms.endsWith("d")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "ž"));
// Burtu miju ietekmētās viensimbola mijas
} else if (celms.endsWith("ļ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "l"));
} else if (celms.endsWith("ņ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "n"));
} else if (celms.endsWith("ķ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "k"));
} else if (celms.endsWith("ģ")) {
varianti.add(new Variants(celms.substring(0, celms.length() - 1) + "g"));
} else {
varianti.add(new Variants(celms));
}
break;
default:
System.err.printf("Invalid StemChange ID, stem '%s', stemchange %d\n", celms, mija);
}
} catch (StringIndexOutOfBoundsException e){
try {
new PrintWriter(new OutputStreamWriter(System.err, "UTF-8")).printf(
"StringIndexOutOfBounds, celms '%s', mija %d\n", stem, stemChange);
e.printStackTrace();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}
return varianti;
}
}