package pl.zbronk.nlp.gr; import java.util.ArrayList; import java.util.TreeSet; import pl.zbronk.nlp.gr.GrammarCategory.*; /** * Fleksem * - podzbiór form fleksyjnych leksemu, które zaliczane są do tej samej klasy gramatycznej. * Np. leksem czasownikowy składa się z fleksemów: form czasu przeszłego (praet), form osobowych, nieprzeszłych (fin), bezokolicznika (inf)... * * @author Zbigniew Bronk */ public class Flexem { public Flexem() { } public Flexem(FlexemClass fclass, String lemma, GrammarCategory[] scats) { super(); this.fclass = fclass; this.lemma = lemma; for (GrammarCategory c : scats) this.scats.add(c); } public Flexem(FlexemClass fclass, String lemma, GrammarCategory scat,FlexForm... forms) { super(); this.fclass = fclass; this.lemma = lemma; for (FlexForm ff : forms) { ff.ownerFlexem=this; this.forms.add(ff); } if (scat!=null) scats.add(scat); } public Flexem(FlexemClass fclass, String lemma, int vers,GrammarCategory scat,String common,FlexForm... forms) { super(); this.fclass = fclass; this.lemma = lemma; this.vers=vers; this.common=common; for (FlexForm ff : forms) { ff.ownerFlexem=this; this.forms.add(ff); } if (scat!=null) scats.add(scat); } public Flexem(FlexemClass fclass, String lemma, GrammarCategory scat,String common,ArrayList forms) { super(); this.fclass = fclass; this.lemma = lemma; this.forms=forms; for (FlexForm ff : forms) { ff.ownerFlexem=this; } this.common=common; if (scat!=null) scats.add(scat); } public FlexemClass getFlexemClass() { return fclass; } public String getLemma() { return lemma; } public ArrayList getSelCategories() { return scats; } public ArrayList getForms() { return forms; } public void addForm (FlexForm ff) { ff.ownerFlexem=this; forms.add(ff); } FlexemClass fclass; public void setLemma(String lemma) { this.lemma = lemma; } String lemma; int vers=1; public ArrayList scats=new ArrayList<>(); public ArrayList forms=new ArrayList<>(); public String getCommon() { return common; } public String common=null; public ArrayList getForms (GrammarCategory... c) { ArrayList forms1=new ArrayList<>(); for (FlexForm ff : forms) { boolean a=true; for (GrammarCategory c1 : c) { if (!ff.hasFlexCategory(c1)) a=false; } if (a) forms1.add(ff); } return forms1; } /** * Forma fleksyjna (forma wyrazowa) - składnik fleksemu, * np. psa, psom */ public static class FlexForm { public FlexForm() { } public Flexem getOwnerFlexem() { return ownerFlexem; } protected Flexem ownerFlexem; public FlexForm(String form, GrammarCategory... fcats) { super(); this.form = form; for (GrammarCategory c : fcats) { this.fcats.add(c); } } public boolean isArch() { return qualifs.contains("daw.")||qualifs.contains("przest.")||qualifs.contains("arch."); } public boolean isRare() { return qualifs.contains("rzad."); } public FlexForm(String form, String squalifs,GrammarCategory... fcats) { super(); this.form = form; for (GrammarCategory c : fcats) { this.fcats.add(c); } if (squalifs!=null && !squalifs.isEmpty()) { String[] qt = squalifs.replace('|', ',').split(","); for (String q : qt) { qualifs.add(q); } } } public FlexForm(String form, ArrayList fcats) { super(); this.form = form; this.fcats=fcats; } public FlexForm(String form, ArrayList fcats, TreeSet qualifs) { super(); this.form = form; this.fcats=fcats; this.qualifs=qualifs; } public String getForm() { return form; } public ArrayList getFlexCategories() { return fcats; } public void setForm(String form) { this.form = form; } String form; ArrayList fcats=new ArrayList<>(); TreeSet qualifs=new TreeSet<>(); public TreeSet getQualifs() { return qualifs; }; public String getQualifString() { String qs=""; for (String q:qualifs) { if (qs.length()>0) qs+="|"; qs+=q; } return qs; }; public boolean hasFlexCategory (GrammarCategory c) { for (GrammarCategory c0 : getFlexCategories()) { if (c==c0) return true; } return false; } @Override public String toString() { String ret = form+" ("; if (ownerFlexem!=null) ret+=ownerFlexem.getLemma()+":"+ownerFlexem.getFlexemClass().name(); for (GrammarCategory c0 : getFlexCategories()) { ret+=":"; ret+=c0.name(); } ret+=")"; return ret; } } public int getVersion() { return vers; } public void setVersion(int vers) { this.vers=vers; } public static class NumFlexem extends Flexem{ public NumFlexem(String lemma,FlexForm... forms) { super(FlexemClass.num,lemma,null,forms); } } public static class AdjFlexem extends Flexem{ public AdjFlexem(String lemma,FlexForm... forms) { super(FlexemClass.adj,lemma,null,forms); } } public static class SubstFlexem extends Flexem{ public SubstFlexem(String lemma,GrammarCategory.Gender g,FlexForm... forms) { super(FlexemClass.subst,lemma,g,forms); } } public static class PraetFlexem extends Flexem{ public PraetFlexem(String lemma,GrammarCategory.Aspect a,FlexForm... forms) { super(FlexemClass.praet,lemma,a,forms); } } public static class FinFlexem extends Flexem{ public FinFlexem(String lemma,GrammarCategory.Aspect a,FlexForm... forms) { super(FlexemClass.fin,lemma,a,forms); } } public static void main(String[] args) { Flexem pies_subst = new Flexem(FlexemClass.subst,"pies", Gender.m2 , new FlexForm("pies", Numberc.sg, Case.nom) , new FlexForm("psach", Numberc.pl, Case.loc) , new FlexForm("psami", Numberc.pl, Case.inst) , new FlexForm("psa", Numberc.sg, Case.gen, Case.acc) , new FlexForm("psem", Numberc.sg, Case.inst) , new FlexForm("psie", Numberc.sg, Case.loc) , new FlexForm("psie", Numberc.sg, Case.voc) , new FlexForm("psom", Numberc.pl, Case.dat) , new FlexForm("psów", Numberc.pl, Case.gen) , new FlexForm("psu", Numberc.sg, Case.dat) , new FlexForm("psy", Numberc.pl, Case.nom, Case.acc, Case.voc) ); Flexem pies_subst2 = new Flexem(FlexemClass.subst,"pies", Gender.m1 , new FlexForm("pies", Numberc.sg, Case.nom) , new FlexForm("psach", Numberc.pl, Case.loc) , new FlexForm("psami", Numberc.pl, Case.inst) , new FlexForm("psa", Numberc.sg, Case.gen, Case.acc) , new FlexForm("psem", Numberc.sg, Case.inst) , new FlexForm("psie", Numberc.sg, Case.loc) , new FlexForm("psie", Numberc.sg, Case.voc) , new FlexForm("psom", Numberc.pl, Case.dat) , new FlexForm("psowie", Numberc.pl, Case.nom, Case.voc) , new FlexForm("psów", Numberc.pl, Case.gen, Case.acc) , new FlexForm("psu", Numberc.sg, Case.dat) ); System.out.println(pies_subst.getForms(GrammarCategory.Case.dat)); } }