org.trnltk.morphology.contextless.parser.PredefinedPaths.java Source code

Java tutorial

Introduction

Here is the source code for org.trnltk.morphology.contextless.parser.PredefinedPaths.java

Source

/*
 * Copyright  2013  Ali Ok (aliokATapacheDOTorg)
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.trnltk.morphology.contextless.parser;

import com.google.common.base.Objects;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import org.apache.commons.lang3.Validate;
import org.trnltk.model.lexicon.Root;
import org.trnltk.model.lexicon.SecondaryPos;
import org.trnltk.model.morpheme.MorphemeContainer;
import org.trnltk.model.suffix.Suffix;
import org.trnltk.morphology.morphotactics.SuffixGraph;
import org.trnltk.model.lexicon.PrimaryPos;

import java.util.Collection;
import java.util.Collections;
import java.util.Set;

/**
 * Defines paths for special words / roots.
 * <p/>
 * There are phonetic and morphotactic exceptions for some special words in Turkish.
 * For these words, special suffixes or suffix forms are applied within this class. These exceptions are
 * separated from suffixes and forms defined in a {@link SuffixGraph} since they require a lot of new rules
 * to be created which are only applicable for these special words.
 * <p/>
 * One example is word "ben" whose one usage is <i>1st person <b>singular</b> personal pronoun</i>. Since there is another word
 * for <i>1st person <b>plural</b> personal pronoun</i>, "biz", this word should not accept the suffix <i>plural agreement</i>;
 * ie. "benler" is not valid. However, <i>plural agreement</i> suffix is normally applicable to all pronouns : "kimler", "neler", etc.
 * Thus, all possible paths that could be gone using this root is predefined in the system.
 * <p/>
 * Another example is word "onlar" which is <i>3rd person plural personal pronoun</i>. "onlar" is actually composed of
 * <i>3rd person singular personal pronoun</i>, "o", and the <i>plural agreement</i> "lar". However, suffix form "lar"
 * becomes "nlar" in this particular case. It doesn't make sense to add this as a new morphotactic rule in the
 * {@link SuffixGraph} since we have to define what is applicable (word "o") and what is not applicable (lots of words).
 * Thus, all possible paths in the {@link SuffixGraph} are build in advance for this root.
 * <p/>
 * Paths defined here must be checked when a new root is found for a surface. If found, predefined paths
 * ({@link MorphemeContainer}s) must be used as the starting point of the traversal in the {@link SuffixGraph}.
 * <p/>
 * There is a balance and trade off to define phonetic and morphotactic rules for these kind of words in here and defining
 * the rules in the {@link SuffixGraph}. More added here results in a more hardcoded system. More added in the
 * {@link SuffixGraph} results in a hard-to-maintain graph. Current approach is to define rules here if the exception is
 * for less than 3 roots and these roots are frequent ones in Turkish.
 */
public class PredefinedPaths {

    private final SuffixGraph suffixGraph;
    private final Multimap<String, ? extends Root> rootMap;
    private final SuffixApplier suffixApplier;

    private HashMultimap<Root, MorphemeContainer> morphemeContainerMap;

    public PredefinedPaths(SuffixGraph suffixGraph, Multimap<String, ? extends Root> rootMap,
            SuffixApplier suffixApplier) {
        this.suffixGraph = suffixGraph;
        this.rootMap = rootMap;
        this.suffixApplier = suffixApplier;
        this.morphemeContainerMap = HashMultimap.create();
    }

    public void initialize() {
        this.createPaths();
    }

    public boolean hasPathsForRoot(Root root) {
        if (this.morphemeContainerMap.isEmpty())
            throw new RuntimeException(
                    "Predefined paths are not yet created. Maybe you forgot to run 'initialize' ?");

        return this.morphemeContainerMap.containsKey(root);
    }

    public Set<MorphemeContainer> getPaths(Root root) {
        if (this.morphemeContainerMap.isEmpty())
            throw new RuntimeException(
                    "Predefined paths are not yet created. Maybe you forgot to run 'initialize' ?");

        return Collections.unmodifiableSet(this.morphemeContainerMap.get(root));
    }

    void createPaths() {
        this.createPredefinedPathOf_di();
        this.createPredefinedPathOf_yi();

        this.createPredefinedPathOf_su();

        this.createPredefinedPathOf_ben();
        this.createPredefinedPathOf_sen();
        this.createPredefinedPathOf_o_pron_pers();
        this.createPredefinedPathOf_biz();
        this.createPredefinedPathOf_siz();
        this.createPredefinedPathOf_onlar_pron_pers();

        this.createPredefinedPathOf_bu_pron_demons();
        this.createPredefinedPathOf_su_pron_demons();
        this.createPredefinedPathOf_o_pron_demons();
        this.createPredefinedPathOf_bunlar_pron_demons();
        this.createPredefinedPathOf_sunlar_pron_demons();
        this.createPredefinedPathOf_onlar_pron_demons();

        this.createPredefinedPathOf_kendi();
        this.createPredefinedPathOf_hepsi();
        this.createPredefinedPathOf_herkes();

        this.createPredefinedPathOf_question_particles();
        this.createPredefinedPathOf_ne();

        this.createPredefinedPathOf_ora_bura_sura_nere();

        this.createPredefinedPathOf_iceri_disari();

        this.createPredefinedPathOf_bazilari_bazisi();
        this.createPredefinedPathOf_kimileri_kimisi_kimi();
        this.createPredefinedPathOf_birileri_birisi_biri();
        this.createPredefinedPathOf_hicbirisi_hicbiri();
        this.createPredefinedPathOf_birbiri();
        this.createPredefinedPathOf_cogu_bircogu_coklari_bircoklari();
        this.createPredefinedPathOf_birkaci();
        this.createPredefinedPathOf_cumlesi();
        this.createPredefinedPathOf_digeri_digerleri();
    }

    void createPredefinedPathOf_di() {
        // the only documented one. you get the idea for the others ;)

        final Root root_di = this.findRoot("di", PrimaryPos.Verb, null);

        final Suffix Positive = this.suffixGraph.getSuffix("Pos");
        final Suffix Negative = this.suffixGraph.getSuffix("Neg");

        // all possible routes in the SuffixGraph for root "di" of dictionary item "demek"
        // since root "de" for the same item is not irregular, we don't define paths for it
        // --> it is traversed within the regular Turkish suffix graph with regular morhpotactics and phonetics

        //one path is di+Positive(EMPTY_STR)+Future("yecek") -> diyecek.
        // it is irregular since the regular form, demek+Future->"deyecek", is not valid
        this.pathBuilder(root_di).s(Positive).s("Fut", "yecek").add();
        //one path is di+Positive(EMPTY_STR)+Future("yece") -> diyece
        this.pathBuilder(root_di).s(Positive).s("Fut", "yece").add();
        //..
        this.pathBuilder(root_di).s(Positive).s("Future_to_Adj", "yecek").add();
        this.pathBuilder(root_di).s(Positive).s("Future_to_Adj", "yece").add();
        this.pathBuilder(root_di).s(Positive).s("FutPart_Noun", "yecek").add();
        this.pathBuilder(root_di).s(Positive).s("FutPart_Noun", "yece").add();
        this.pathBuilder(root_di).s(Positive).s("FutPart_Adj", "yecek").add();
        this.pathBuilder(root_di).s(Positive).s("FutPart_Adj", "yece").add();

        //one path is di+Positive(EMPTY_STR)+Progressive("yor") -> diyor
        this.pathBuilder(root_di).s(Positive).s("Prog", "yor").add();

        //one path is di+Positive(EMPTY_STR)+PresentParticle("yen") -> diyen
        this.pathBuilder(root_di).s(Positive).s("PresPart", "yen").add();

        //one path is di+Positive(EMPTY_STR)+Ability("yebil") -> diyebil
        this.pathBuilder(root_di).s("Able", "yebil").s(Positive).add();
        //one path is di+Ability(ye)+Negative("me") -> diyeme
        this.pathBuilder(root_di).s("Able", "ye").s(Negative, "me").add();
        //one path is di+Ability(ye)+WithoutHavingDoneSo("meden") -> diyemeden
        this.pathBuilder(root_di).s("Able", "ye").s(Negative, "").s("WithoutHavingDoneSo", "meden").add();

        //..
        this.pathBuilder(root_di).s(Positive).s("Opt", "ye").add();

        //..
        this.pathBuilder(root_di).s(Positive).s("ByDoingSo", "yerek").add();

    }

    void createPredefinedPathOf_yi() {
        final Root root_yi = this.findRoot("yi", PrimaryPos.Verb, null);

        final Suffix Positive = this.suffixGraph.getSuffix("Pos");
        final Suffix Negative = this.suffixGraph.getSuffix("Neg");

        this.pathBuilder(root_yi).s(Positive).s("Fut", "yecek").add();
        this.pathBuilder(root_yi).s(Positive).s("Fut", "yece").add();
        this.pathBuilder(root_yi).s(Positive).s("Future_to_Adj", "yecek").add();
        this.pathBuilder(root_yi).s(Positive).s("Future_to_Adj", "yece").add();
        this.pathBuilder(root_yi).s(Positive).s("FutPart_Noun", "yecek").add();
        this.pathBuilder(root_yi).s(Positive).s("FutPart_Noun", "yece").add();
        this.pathBuilder(root_yi).s(Positive).s("FutPart_Adj", "yecek").add();
        this.pathBuilder(root_yi).s(Positive).s("FutPart_Adj", "yece").add();

        this.pathBuilder(root_yi).s(Positive).s("Prog", "yor").add();

        this.pathBuilder(root_yi).s(Positive).s("PresPart", "yen").add();

        this.pathBuilder(root_yi).s("Able", "yebil").s(Positive).add();
        this.pathBuilder(root_yi).s("Able", "ye").s(Negative, "me").add();
        this.pathBuilder(root_yi).s("Able", "ye").s(Negative, "").s("WithoutHavingDoneSo", "meden").add();

        this.pathBuilder(root_yi).s(Positive).s("Opt", "ye").add();

        this.pathBuilder(root_yi).s(Positive).s("ByDoingSo", "yerek").add();

        // different from "demek"
        this.pathBuilder(root_yi).s(Positive).s("AfterDoingSo", "yip").add();
        this.pathBuilder(root_yi).s(Positive).s("Imp").s("A2Pl_Verb", "yin").add();
    }

    void createPredefinedPathOf_ben() {
        final Root root_ben = this.findRoot("ben", PrimaryPos.Pronoun, SecondaryPos.Personal);
        final Root root_ban = this.findRoot("ban", PrimaryPos.Pronoun, SecondaryPos.Personal);

        final Suffix A1Sg_Pron = this.suffixGraph.getSuffix("A1Sg_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_ben).s(A1Sg_Pron).s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_ben).s(A1Sg_Pron).s(Pnon_Pron).s("Acc_Pron", "i").add();
        this.pathBuilder(root_ban).s(A1Sg_Pron).s(Pnon_Pron).s("Dat_Pron", "a").add();
        this.pathBuilder(root_ben).s(A1Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "de").add();
        this.pathBuilder(root_ben).s(A1Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "den").add();
        this.pathBuilder(root_ben).s(A1Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "le").add();
        this.pathBuilder(root_ben).s(A1Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "imle").add();
        this.pathBuilder(root_ben).s(A1Sg_Pron).s(Pnon_Pron).s("Gen_Pron", "im").add();
        this.pathBuilder(root_ben).s(A1Sg_Pron).s(Pnon_Pron).s("AccordingTo", "ce").add();

        this.pathBuilder(root_ben).s(A1Sg_Pron).s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_sen() {
        final Root root_sen = this.findRoot("sen", PrimaryPos.Pronoun, SecondaryPos.Personal);
        final Root root_san = this.findRoot("san", PrimaryPos.Pronoun, SecondaryPos.Personal);

        final Suffix A2Sg_Pron = this.suffixGraph.getSuffix("A2Sg_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_sen).s(A2Sg_Pron).s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_sen).s(A2Sg_Pron).s(Pnon_Pron).s("Acc_Pron", "i").add();
        this.pathBuilder(root_san).s(A2Sg_Pron).s(Pnon_Pron).s("Dat_Pron", "a").add();
        this.pathBuilder(root_sen).s(A2Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "de").add();
        this.pathBuilder(root_sen).s(A2Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "den").add();
        this.pathBuilder(root_sen).s(A2Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "le").add();
        this.pathBuilder(root_sen).s(A2Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "inle").add();
        this.pathBuilder(root_sen).s(A2Sg_Pron).s(Pnon_Pron).s("Gen_Pron", "in").add();
        this.pathBuilder(root_sen).s(A2Sg_Pron).s(Pnon_Pron).s("AccordingTo", "ce").add();

        this.pathBuilder(root_sen).s(A2Sg_Pron).s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_o_pron_pers() {
        final Root root_o = this.findRoot("o", PrimaryPos.Pronoun, SecondaryPos.Personal);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Acc_Pron", "nu").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Dat_Pron", "na").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "nda").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "ndan").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "nla").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "nunla").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Gen_Pron", "nun").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("AccordingTo", "nca").add();

        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_biz() {
        final Root root_biz = this.findRoot("biz", PrimaryPos.Pronoun, SecondaryPos.Personal);

        final Suffix A1Pl_Pron = this.suffixGraph.getSuffix("A1Pl_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("Acc_Pron", "i").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("Dat_Pron", "e").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("Loc_Pron", "de").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("Abl_Pron", "den").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("Ins_Pron", "le").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("Ins_Pron", "imle").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("Gen_Pron", "im").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("AccordingTo", "ce").add();

        this.pathBuilder(root_biz).s(A1Pl_Pron).s(Pnon_Pron).s("Nom_Pron_Deriv").add();

        this.pathBuilder(root_biz).s(A1Pl_Pron, "ler").s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron, "ler").s(Pnon_Pron).s("Acc_Pron", "i").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron, "ler").s(Pnon_Pron).s("Dat_Pron", "e").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron, "ler").s(Pnon_Pron).s("Loc_Pron", "de").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron, "ler").s(Pnon_Pron).s("Abl_Pron", "den").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron, "ler").s(Pnon_Pron).s("Ins_Pron", "le").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron, "ler").s(Pnon_Pron).s("Gen_Pron", "in").add();
        this.pathBuilder(root_biz).s(A1Pl_Pron, "ler").s(Pnon_Pron).s("AccordingTo", "ce").add();

        this.pathBuilder(root_biz).s(A1Pl_Pron, "ler").s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_siz() {
        final Root root_siz = this.findRoot("siz", PrimaryPos.Pronoun, SecondaryPos.Personal);

        final Suffix A2Pl_Pron = this.suffixGraph.getSuffix("A2Pl_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("Acc_Pron", "i").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("Dat_Pron", "e").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("Loc_Pron", "de").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("Abl_Pron", "den").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("Ins_Pron", "le").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("Ins_Pron", "inle").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("Gen_Pron", "in").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("AccordingTo", "ce").add();

        this.pathBuilder(root_siz).s(A2Pl_Pron).s(Pnon_Pron).s("Nom_Pron_Deriv").add();

        this.pathBuilder(root_siz).s(A2Pl_Pron, "ler").s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron, "ler").s(Pnon_Pron).s("Acc_Pron", "i").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron, "ler").s(Pnon_Pron).s("Dat_Pron", "e").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron, "ler").s(Pnon_Pron).s("Loc_Pron", "de").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron, "ler").s(Pnon_Pron).s("Abl_Pron", "den").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron, "ler").s(Pnon_Pron).s("Ins_Pron", "le").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron, "ler").s(Pnon_Pron).s("Gen_Pron", "in").add();
        this.pathBuilder(root_siz).s(A2Pl_Pron, "ler").s(Pnon_Pron).s("AccordingTo", "ce").add();

        this.pathBuilder(root_siz).s(A2Pl_Pron, "ler").s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_onlar_pron_pers() {
        final Root root_o = this.findRoot("o", PrimaryPos.Pronoun, SecondaryPos.Personal);

        final Suffix A3Pl_Pron = this.suffixGraph.getSuffix("A3Pl_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Acc_Pron", "").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Dat_Pron", "a").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Loc_Pron", "da").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Abl_Pron", "dan").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Ins_Pron", "la").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Gen_Pron", "n").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("AccordingTo", "ca").add();

        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_bu_pron_demons() {
        final Root root_bu = this.findRoot("bu", PrimaryPos.Pronoun, SecondaryPos.Demonstrative);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_bu).s(A3Sg_Pron).s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_bu).s(A3Sg_Pron).s(Pnon_Pron).s("Acc_Pron", "nu").add();
        this.pathBuilder(root_bu).s(A3Sg_Pron).s(Pnon_Pron).s("Dat_Pron", "na").add();
        this.pathBuilder(root_bu).s(A3Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "nda").add();
        this.pathBuilder(root_bu).s(A3Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "ndan").add();
        this.pathBuilder(root_bu).s(A3Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "nla").add();
        this.pathBuilder(root_bu).s(A3Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "nunla").add();
        this.pathBuilder(root_bu).s(A3Sg_Pron).s(Pnon_Pron).s("Gen_Pron", "nun").add();

        this.pathBuilder(root_bu).s(A3Sg_Pron).s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_su_pron_demons() {
        final Root root_su = this.findRoot("u", PrimaryPos.Pronoun, SecondaryPos.Demonstrative);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_su).s(A3Sg_Pron).s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_su).s(A3Sg_Pron).s(Pnon_Pron).s("Acc_Pron", "nu").add();
        this.pathBuilder(root_su).s(A3Sg_Pron).s(Pnon_Pron).s("Dat_Pron", "na").add();
        this.pathBuilder(root_su).s(A3Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "nda").add();
        this.pathBuilder(root_su).s(A3Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "ndan").add();
        this.pathBuilder(root_su).s(A3Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "nla").add();
        this.pathBuilder(root_su).s(A3Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "nunla").add();
        this.pathBuilder(root_su).s(A3Sg_Pron).s(Pnon_Pron).s("Gen_Pron", "nun").add();

        this.pathBuilder(root_su).s(A3Sg_Pron).s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_o_pron_demons() {
        final Root root_o = this.findRoot("o", PrimaryPos.Pronoun, SecondaryPos.Demonstrative);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Acc_Pron", "nu").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Dat_Pron", "na").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "nda").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "ndan").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "nla").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Ins_Pron", "nunla").add();
        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Gen_Pron", "nun").add();

        this.pathBuilder(root_o).s(A3Sg_Pron).s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_bunlar_pron_demons() {
        final Root root_bu = this.findRoot("bu", PrimaryPos.Pronoun, SecondaryPos.Demonstrative);

        final Suffix A3Pl_Pron = this.suffixGraph.getSuffix("A3Pl_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_bu).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_bu).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Acc_Pron", "").add();
        this.pathBuilder(root_bu).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Dat_Pron", "a").add();
        this.pathBuilder(root_bu).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Loc_Pron", "da").add();
        this.pathBuilder(root_bu).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Abl_Pron", "dan").add();
        this.pathBuilder(root_bu).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Ins_Pron", "la").add();
        this.pathBuilder(root_bu).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Gen_Pron", "n").add();

        this.pathBuilder(root_bu).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_sunlar_pron_demons() {
        final Root root_su = this.findRoot("u", PrimaryPos.Pronoun, SecondaryPos.Demonstrative);

        final Suffix A3Pl_Pron = this.suffixGraph.getSuffix("A3Pl_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_su).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_su).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Acc_Pron", "").add();
        this.pathBuilder(root_su).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Dat_Pron", "a").add();
        this.pathBuilder(root_su).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Loc_Pron", "da").add();
        this.pathBuilder(root_su).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Abl_Pron", "dan").add();
        this.pathBuilder(root_su).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Ins_Pron", "la").add();
        this.pathBuilder(root_su).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Gen_Pron", "n").add();

        this.pathBuilder(root_su).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_onlar_pron_demons() {
        final Root root_o = this.findRoot("o", PrimaryPos.Pronoun, SecondaryPos.Demonstrative);

        final Suffix A3Pl_Pron = this.suffixGraph.getSuffix("A3Pl_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Acc_Pron", "").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Dat_Pron", "a").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Loc_Pron", "da").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Abl_Pron", "dan").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Ins_Pron", "la").add();
        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Gen_Pron", "n").add();

        this.pathBuilder(root_o).s(A3Pl_Pron, "nlar").s(Pnon_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_kendi() {
        final Root root_kendi = this.findRoot("kendi", PrimaryPos.Pronoun, SecondaryPos.Reflexive);

        final Suffix A1Sg_Pron = this.suffixGraph.getSuffix("A1Sg_Pron");
        final Suffix P1Sg_Pron = this.suffixGraph.getSuffix("P1Sg_Pron");
        final Suffix A2Sg_Pron = this.suffixGraph.getSuffix("A2Sg_Pron");
        final Suffix P2Sg_Pron = this.suffixGraph.getSuffix("P2Sg_Pron");
        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");
        final Suffix P3Sg_Pron = this.suffixGraph.getSuffix("P3Sg_Pron");
        final Suffix A1Pl_Pron = this.suffixGraph.getSuffix("A1Pl_Pron");
        final Suffix P1Pl_Pron = this.suffixGraph.getSuffix("P1Pl_Pron");
        final Suffix A2Pl_Pron = this.suffixGraph.getSuffix("A2Pl_Pron");
        final Suffix P2Pl_Pron = this.suffixGraph.getSuffix("P2Pl_Pron");
        final Suffix A3Pl_Pron = this.suffixGraph.getSuffix("A3Pl_Pron");
        final Suffix P3Pl_Pron = this.suffixGraph.getSuffix("P3Pl_Pron");

        ////////// A1Sg
        this.pathBuilder(root_kendi).s(A1Sg_Pron).s(P1Sg_Pron, "m").s("Nom_Pron").add();
        this.pathBuilder(root_kendi).s(A1Sg_Pron).s(P1Sg_Pron, "m").s("Acc_Pron", "i").add();
        this.pathBuilder(root_kendi).s(A1Sg_Pron).s(P1Sg_Pron, "m").s("Dat_Pron", "e").add();
        this.pathBuilder(root_kendi).s(A1Sg_Pron).s(P1Sg_Pron, "m").s("Loc_Pron", "de").add();
        this.pathBuilder(root_kendi).s(A1Sg_Pron).s(P1Sg_Pron, "m").s("Abl_Pron", "den").add();
        this.pathBuilder(root_kendi).s(A1Sg_Pron).s(P1Sg_Pron, "m").s("Ins_Pron", "le").add();
        this.pathBuilder(root_kendi).s(A1Sg_Pron).s(P1Sg_Pron, "m").s("Gen_Pron", "in").add();

        this.pathBuilder(root_kendi).s(A1Sg_Pron).s(P1Sg_Pron, "m").s("Nom_Pron_Deriv").add();

        ////////// A2Sg
        this.pathBuilder(root_kendi).s(A2Sg_Pron).s(P2Sg_Pron, "n").s("Nom_Pron").add();
        this.pathBuilder(root_kendi).s(A2Sg_Pron).s(P2Sg_Pron, "n").s("Acc_Pron", "i").add();
        this.pathBuilder(root_kendi).s(A2Sg_Pron).s(P2Sg_Pron, "n").s("Dat_Pron", "e").add();
        this.pathBuilder(root_kendi).s(A2Sg_Pron).s(P2Sg_Pron, "n").s("Loc_Pron", "de").add();
        this.pathBuilder(root_kendi).s(A2Sg_Pron).s(P2Sg_Pron, "n").s("Abl_Pron", "den").add();
        this.pathBuilder(root_kendi).s(A2Sg_Pron).s(P2Sg_Pron, "n").s("Ins_Pron", "le").add();
        this.pathBuilder(root_kendi).s(A2Sg_Pron).s(P2Sg_Pron, "n").s("Gen_Pron", "in").add();

        this.pathBuilder(root_kendi).s(A2Sg_Pron).s(P2Sg_Pron, "n").s("Nom_Pron_Deriv").add();

        ////////// A3Sg
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron).s("Acc_Pron", "ni").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron).s("Dat_Pron", "ne").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron).s("Loc_Pron", "nde").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron).s("Abl_Pron", "nden").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron).s("Ins_Pron", "yle").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron).s("Gen_Pron", "nin").add();

        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron).s("Nom_Pron_Deriv").add();

        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron, "si").s("Nom_Pron").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron, "si").s("Acc_Pron", "ni").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron, "si").s("Dat_Pron", "ne").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron, "si").s("Loc_Pron", "nde").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron, "si").s("Abl_Pron", "nden").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron, "si").s("Ins_Pron", "yle").add();
        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron, "si").s("Gen_Pron", "nin").add();

        this.pathBuilder(root_kendi).s(A3Sg_Pron).s(P3Sg_Pron, "si").s("Nom_Pron_Deriv").add();

        ////////// A1pl
        this.pathBuilder(root_kendi).s(A1Pl_Pron).s(P1Pl_Pron, "miz").s("Nom_Pron").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron).s(P1Pl_Pron, "miz").s("Acc_Pron", "i").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron).s(P1Pl_Pron, "miz").s("Dat_Pron", "e").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron).s(P1Pl_Pron, "miz").s("Loc_Pron", "de").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron).s(P1Pl_Pron, "miz").s("Abl_Pron", "den").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron).s(P1Pl_Pron, "miz").s("Ins_Pron", "le").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron).s(P1Pl_Pron, "miz").s("Gen_Pron", "in").add();

        this.pathBuilder(root_kendi).s(A1Pl_Pron).s(P1Pl_Pron, "miz").s("Nom_Pron_Deriv").add();

        this.pathBuilder(root_kendi).s(A1Pl_Pron, "ler").s(P1Pl_Pron, "imiz").s("Nom_Pron").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron, "ler").s(P1Pl_Pron, "imiz").s("Acc_Pron", "i").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron, "ler").s(P1Pl_Pron, "imiz").s("Dat_Pron", "e").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron, "ler").s(P1Pl_Pron, "imiz").s("Loc_Pron", "de").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron, "ler").s(P1Pl_Pron, "imiz").s("Abl_Pron", "den").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron, "ler").s(P1Pl_Pron, "imiz").s("Ins_Pron", "le").add();
        this.pathBuilder(root_kendi).s(A1Pl_Pron, "ler").s(P1Pl_Pron, "imiz").s("Gen_Pron", "in").add();

        this.pathBuilder(root_kendi).s(A1Pl_Pron, "ler").s(P1Pl_Pron, "imiz").s("Nom_Pron_Deriv").add();

        ////////// A2pl
        this.pathBuilder(root_kendi).s(A2Pl_Pron).s(P2Pl_Pron, "niz").s("Nom_Pron").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron).s(P2Pl_Pron, "niz").s("Acc_Pron", "i").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron).s(P2Pl_Pron, "niz").s("Dat_Pron", "e").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron).s(P2Pl_Pron, "niz").s("Loc_Pron", "de").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron).s(P2Pl_Pron, "niz").s("Abl_Pron", "den").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron).s(P2Pl_Pron, "niz").s("Ins_Pron", "le").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron).s(P2Pl_Pron, "niz").s("Gen_Pron", "in").add();

        this.pathBuilder(root_kendi).s(A2Pl_Pron).s(P2Pl_Pron, "niz").s("Nom_Pron_Deriv").add();

        this.pathBuilder(root_kendi).s(A2Pl_Pron, "ler").s(P2Pl_Pron, "iniz").s("Nom_Pron").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron, "ler").s(P2Pl_Pron, "iniz").s("Acc_Pron", "i").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron, "ler").s(P2Pl_Pron, "iniz").s("Dat_Pron", "e").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron, "ler").s(P2Pl_Pron, "iniz").s("Loc_Pron", "de").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron, "ler").s(P2Pl_Pron, "iniz").s("Abl_Pron", "den").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron, "ler").s(P2Pl_Pron, "iniz").s("Ins_Pron", "le").add();
        this.pathBuilder(root_kendi).s(A2Pl_Pron, "ler").s(P2Pl_Pron, "iniz").s("Gen_Pron", "in").add();

        this.pathBuilder(root_kendi).s(A2Pl_Pron, "ler").s(P2Pl_Pron, "iniz").s("Nom_Pron_Deriv").add();

        ////////// A3pl
        this.pathBuilder(root_kendi).s(A3Pl_Pron, "leri").s(P3Pl_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_kendi).s(A3Pl_Pron, "leri").s(P3Pl_Pron).s("Acc_Pron", "ni").add();
        this.pathBuilder(root_kendi).s(A3Pl_Pron, "leri").s(P3Pl_Pron).s("Dat_Pron", "ne").add();
        this.pathBuilder(root_kendi).s(A3Pl_Pron, "leri").s(P3Pl_Pron).s("Loc_Pron", "nde").add();
        this.pathBuilder(root_kendi).s(A3Pl_Pron, "leri").s(P3Pl_Pron).s("Abl_Pron", "nden").add();
        this.pathBuilder(root_kendi).s(A3Pl_Pron, "leri").s(P3Pl_Pron).s("Ins_Pron", "yle").add();
        this.pathBuilder(root_kendi).s(A3Pl_Pron, "leri").s(P3Pl_Pron).s("Gen_Pron", "nin").add();

        this.pathBuilder(root_kendi).s(A3Pl_Pron, "leri").s(P3Pl_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_hepsi() {
        final Root root_hep = this.findRoot("hep", PrimaryPos.Pronoun, null);
        final Root root_hepsi = this.findRoot("hepsi", PrimaryPos.Pronoun, null);

        final Suffix A1Pl_Pron = this.suffixGraph.getSuffix("A1Pl_Pron");
        final Suffix P1Pl_Pron = this.suffixGraph.getSuffix("P1Pl_Pron");
        final Suffix A2Pl_Pron = this.suffixGraph.getSuffix("A2Pl_Pron");
        final Suffix P2Pl_Pron = this.suffixGraph.getSuffix("P2Pl_Pron");
        final Suffix A3Pl_Pron = this.suffixGraph.getSuffix("A3Pl_Pron");
        final Suffix P3Pl_Pron = this.suffixGraph.getSuffix("P3Pl_Pron");

        ////////// No A1Sg

        ////////// No A2Sg

        ////////// No A3Sg

        ////////// A1pl
        this.pathBuilder(root_hep).s(A1Pl_Pron).s(P1Pl_Pron, "imiz").s("Nom_Pron").add();
        this.pathBuilder(root_hep).s(A1Pl_Pron).s(P1Pl_Pron, "imiz").s("Acc_Pron", "i").add();
        this.pathBuilder(root_hep).s(A1Pl_Pron).s(P1Pl_Pron, "imiz").s("Dat_Pron", "e").add();
        this.pathBuilder(root_hep).s(A1Pl_Pron).s(P1Pl_Pron, "imiz").s("Loc_Pron", "de").add();
        this.pathBuilder(root_hep).s(A1Pl_Pron).s(P1Pl_Pron, "imiz").s("Abl_Pron", "den").add();
        this.pathBuilder(root_hep).s(A1Pl_Pron).s(P1Pl_Pron, "imiz").s("Ins_Pron", "le").add();
        this.pathBuilder(root_hep).s(A1Pl_Pron).s(P1Pl_Pron, "imiz").s("Gen_Pron", "in").add();
        this.pathBuilder(root_hep).s(A1Pl_Pron).s(P1Pl_Pron, "imiz").s("AccordingTo", "ce").add();

        this.pathBuilder(root_hep).s(A1Pl_Pron).s(P1Pl_Pron, "imiz").s("Nom_Pron_Deriv").add();

        ////////// A2pl
        this.pathBuilder(root_hep).s(A2Pl_Pron).s(P2Pl_Pron, "iniz").s("Nom_Pron").add();
        this.pathBuilder(root_hep).s(A2Pl_Pron).s(P2Pl_Pron, "iniz").s("Acc_Pron", "i").add();
        this.pathBuilder(root_hep).s(A2Pl_Pron).s(P2Pl_Pron, "iniz").s("Dat_Pron", "e").add();
        this.pathBuilder(root_hep).s(A2Pl_Pron).s(P2Pl_Pron, "iniz").s("Loc_Pron", "de").add();
        this.pathBuilder(root_hep).s(A2Pl_Pron).s(P2Pl_Pron, "iniz").s("Abl_Pron", "den").add();
        this.pathBuilder(root_hep).s(A2Pl_Pron).s(P2Pl_Pron, "iniz").s("Ins_Pron", "le").add();
        this.pathBuilder(root_hep).s(A2Pl_Pron).s(P2Pl_Pron, "iniz").s("Gen_Pron", "in").add();
        this.pathBuilder(root_hep).s(A2Pl_Pron).s(P2Pl_Pron, "iniz").s("AccordingTo", "ce").add();

        this.pathBuilder(root_hep).s(A2Pl_Pron).s(P2Pl_Pron, "iniz").s("Nom_Pron_Deriv").add();

        ////////// A3pl

        this.pathBuilder(root_hepsi).s(A3Pl_Pron).s(P3Pl_Pron).s("Nom_Pron").add();
        this.pathBuilder(root_hepsi).s(A3Pl_Pron).s(P3Pl_Pron).s("Acc_Pron", "ni").add();
        this.pathBuilder(root_hepsi).s(A3Pl_Pron).s(P3Pl_Pron).s("Dat_Pron", "ne").add();
        this.pathBuilder(root_hepsi).s(A3Pl_Pron).s(P3Pl_Pron).s("Loc_Pron", "nde").add();
        this.pathBuilder(root_hepsi).s(A3Pl_Pron).s(P3Pl_Pron).s("Abl_Pron", "nden").add();
        this.pathBuilder(root_hepsi).s(A3Pl_Pron).s(P3Pl_Pron).s("Ins_Pron", "yle").add();
        this.pathBuilder(root_hepsi).s(A3Pl_Pron).s(P3Pl_Pron).s("Gen_Pron", "nin").add();
        this.pathBuilder(root_hepsi).s(A3Pl_Pron).s(P3Pl_Pron).s("AccordingTo", "nce").add();

        this.pathBuilder(root_hepsi).s(A3Pl_Pron).s(P3Pl_Pron).s("Nom_Pron_Deriv").add();
    }

    void createPredefinedPathOf_herkes() {
        final Root root_herkes = this.findRoot("herkes", PrimaryPos.Pronoun, null);

        this.pathBuilder(root_herkes).s("A3Sg_Pron").s("Pnon_Pron").add();
    }

    void createPredefinedPathOf_question_particles() {
        final Root root_mii = this.findRoot("m", PrimaryPos.Question, null);
        final Root root_mi = this.findRoot("mi", PrimaryPos.Question, null);
        final Root root_mu = this.findRoot("mu", PrimaryPos.Question, null);
        final Root root_muu = this.findRoot("m", PrimaryPos.Question, null);

        final Suffix Pres_Ques = this.suffixGraph.getSuffix("Pres_Ques");
        final Suffix Past_Ques = this.suffixGraph.getSuffix("Past_Ques");
        final Suffix Narr_Ques = this.suffixGraph.getSuffix("Narr_Ques");

        final Suffix A1Sg_Ques = this.suffixGraph.getSuffix("A1Sg_Ques");
        final Suffix A2Sg_Ques = this.suffixGraph.getSuffix("A2Sg_Ques");
        final Suffix A3Sg_Ques = this.suffixGraph.getSuffix("A3Sg_Ques");
        final Suffix A1Pl_Ques = this.suffixGraph.getSuffix("A1Pl_Ques");
        final Suffix A2Pl_Ques = this.suffixGraph.getSuffix("A2Pl_Ques");
        final Suffix A3Pl_Ques = this.suffixGraph.getSuffix("A3Pl_Ques");

        ////////// Pres
        this.pathBuilder(root_mii).s(Pres_Ques).s(A1Sg_Ques, "ym").add();
        this.pathBuilder(root_mii).s(Pres_Ques).s(A2Sg_Ques, "sn").add();
        this.pathBuilder(root_mii).s(Pres_Ques).s(A3Sg_Ques, "").add();
        this.pathBuilder(root_mii).s(Pres_Ques).s(A1Pl_Ques, "yz").add();
        this.pathBuilder(root_mii).s(Pres_Ques).s(A2Pl_Ques, "snz").add();
        this.pathBuilder(root_mii).s(Pres_Ques).s(A3Pl_Ques, "lar").add();

        this.pathBuilder(root_mi).s(Pres_Ques).s(A1Sg_Ques, "yim").add();
        this.pathBuilder(root_mi).s(Pres_Ques).s(A2Sg_Ques, "sin").add();
        this.pathBuilder(root_mi).s(Pres_Ques).s(A3Sg_Ques, "").add();
        this.pathBuilder(root_mi).s(Pres_Ques).s(A1Pl_Ques, "yiz").add();
        this.pathBuilder(root_mi).s(Pres_Ques).s(A2Pl_Ques, "siniz").add();
        this.pathBuilder(root_mi).s(Pres_Ques).s(A3Pl_Ques, "ler").add();

        this.pathBuilder(root_mu).s(Pres_Ques).s(A1Sg_Ques, "yum").add();
        this.pathBuilder(root_mu).s(Pres_Ques).s(A2Sg_Ques, "sun").add();
        this.pathBuilder(root_mu).s(Pres_Ques).s(A3Sg_Ques, "").add();
        this.pathBuilder(root_mu).s(Pres_Ques).s(A1Pl_Ques, "yuz").add();
        this.pathBuilder(root_mu).s(Pres_Ques).s(A2Pl_Ques, "sunuz").add();
        this.pathBuilder(root_mu).s(Pres_Ques).s(A3Pl_Ques, "lar").add();

        this.pathBuilder(root_muu).s(Pres_Ques).s(A1Sg_Ques, "ym").add();
        this.pathBuilder(root_muu).s(Pres_Ques).s(A2Sg_Ques, "sn").add();
        this.pathBuilder(root_muu).s(Pres_Ques).s(A3Sg_Ques, "").add();
        this.pathBuilder(root_muu).s(Pres_Ques).s(A1Pl_Ques, "yz").add();
        this.pathBuilder(root_muu).s(Pres_Ques).s(A2Pl_Ques, "snz").add();
        this.pathBuilder(root_muu).s(Pres_Ques).s(A3Pl_Ques, "ler").add();

        ////////// Past
        this.pathBuilder(root_mii).s(Past_Ques, "yd").s(A1Sg_Ques, "m").add();
        this.pathBuilder(root_mii).s(Past_Ques, "yd").s(A2Sg_Ques, "n").add();
        this.pathBuilder(root_mii).s(Past_Ques, "yd").s(A3Sg_Ques, "").add();
        this.pathBuilder(root_mii).s(Past_Ques, "yd").s(A1Pl_Ques, "k").add();
        this.pathBuilder(root_mii).s(Past_Ques, "yd").s(A2Pl_Ques, "nz").add();
        this.pathBuilder(root_mii).s(Past_Ques, "yd").s(A3Pl_Ques, "lar").add();

        this.pathBuilder(root_mi).s(Past_Ques, "ydi").s(A1Sg_Ques, "m").add();
        this.pathBuilder(root_mi).s(Past_Ques, "ydi").s(A2Sg_Ques, "n").add();
        this.pathBuilder(root_mi).s(Past_Ques, "ydi").s(A3Sg_Ques, "").add();
        this.pathBuilder(root_mi).s(Past_Ques, "ydi").s(A1Pl_Ques, "k").add();
        this.pathBuilder(root_mi).s(Past_Ques, "ydi").s(A2Pl_Ques, "niz").add();
        this.pathBuilder(root_mi).s(Past_Ques, "ydi").s(A3Pl_Ques, "ler").add();

        this.pathBuilder(root_mu).s(Past_Ques, "ydu").s(A1Sg_Ques, "m").add();
        this.pathBuilder(root_mu).s(Past_Ques, "ydu").s(A2Sg_Ques, "n").add();
        this.pathBuilder(root_mu).s(Past_Ques, "ydu").s(A3Sg_Ques, "").add();
        this.pathBuilder(root_mu).s(Past_Ques, "ydu").s(A1Pl_Ques, "k").add();
        this.pathBuilder(root_mu).s(Past_Ques, "ydu").s(A2Pl_Ques, "nuz").add();
        this.pathBuilder(root_mu).s(Past_Ques, "ydu").s(A3Pl_Ques, "lar").add();

        this.pathBuilder(root_muu).s(Past_Ques, "yd").s(A1Sg_Ques, "m").add();
        this.pathBuilder(root_muu).s(Past_Ques, "yd").s(A2Sg_Ques, "n").add();
        this.pathBuilder(root_muu).s(Past_Ques, "yd").s(A3Sg_Ques, "").add();
        this.pathBuilder(root_muu).s(Past_Ques, "yd").s(A1Pl_Ques, "k").add();
        this.pathBuilder(root_muu).s(Past_Ques, "yd").s(A2Pl_Ques, "nz").add();
        this.pathBuilder(root_muu).s(Past_Ques, "yd").s(A3Pl_Ques, "ler").add();

        ////////// Narr
        this.pathBuilder(root_mii).s(Narr_Ques, "ym").s(A1Sg_Ques, "m").add();
        this.pathBuilder(root_mii).s(Narr_Ques, "ym").s(A2Sg_Ques, "sn").add();
        this.pathBuilder(root_mii).s(Narr_Ques, "ym").s(A3Sg_Ques, "").add();
        this.pathBuilder(root_mii).s(Narr_Ques, "ym").s(A1Pl_Ques, "z").add();
        this.pathBuilder(root_mii).s(Narr_Ques, "ym").s(A2Pl_Ques, "snz").add();
        this.pathBuilder(root_mii).s(Narr_Ques, "ym").s(A3Pl_Ques, "lar").add();

        this.pathBuilder(root_mi).s(Narr_Ques, "ymi").s(A1Sg_Ques, "im").add();
        this.pathBuilder(root_mi).s(Narr_Ques, "ymi").s(A2Sg_Ques, "sin").add();
        this.pathBuilder(root_mi).s(Narr_Ques, "ymi").s(A3Sg_Ques, "").add();
        this.pathBuilder(root_mi).s(Narr_Ques, "ymi").s(A1Pl_Ques, "iz").add();
        this.pathBuilder(root_mi).s(Narr_Ques, "ymi").s(A2Pl_Ques, "siniz").add();
        this.pathBuilder(root_mi).s(Narr_Ques, "ymi").s(A3Pl_Ques, "ler").add();

        this.pathBuilder(root_mu).s(Narr_Ques, "ymu").s(A1Sg_Ques, "um").add();
        this.pathBuilder(root_mu).s(Narr_Ques, "ymu").s(A2Sg_Ques, "sun").add();
        this.pathBuilder(root_mu).s(Narr_Ques, "ymu").s(A3Sg_Ques, "").add();
        this.pathBuilder(root_mu).s(Narr_Ques, "ymu").s(A1Pl_Ques, "uz").add();
        this.pathBuilder(root_mu).s(Narr_Ques, "ymu").s(A2Pl_Ques, "sunuz").add();
        this.pathBuilder(root_mu).s(Narr_Ques, "ymu").s(A3Pl_Ques, "lar").add();

        this.pathBuilder(root_muu).s(Narr_Ques, "ym").s(A1Sg_Ques, "m").add();
        this.pathBuilder(root_muu).s(Narr_Ques, "ym").s(A2Sg_Ques, "sn").add();
        this.pathBuilder(root_muu).s(Narr_Ques, "ym").s(A3Sg_Ques, "").add();
        this.pathBuilder(root_muu).s(Narr_Ques, "ym").s(A1Pl_Ques, "z").add();
        this.pathBuilder(root_muu).s(Narr_Ques, "ym").s(A2Pl_Ques, "snz").add();
        this.pathBuilder(root_muu).s(Narr_Ques, "ym").s(A3Pl_Ques, "ler").add();
    }

    void createPredefinedPathOf_ne() {
        final Root root_ne = this.findRoot("ne", PrimaryPos.Pronoun, SecondaryPos.Question);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");

        this.pathBuilder(root_ne).s(A3Sg_Pron).s("P1Sg_Pron", "m").add();
        this.pathBuilder(root_ne).s(A3Sg_Pron).s("P1Sg_Pron", "yim").add();

        this.pathBuilder(root_ne).s(A3Sg_Pron).s("P2Sg_Pron", "n").add();
        this.pathBuilder(root_ne).s(A3Sg_Pron).s("P2Sg_Pron", "yin").add();

        this.pathBuilder(root_ne).s(A3Sg_Pron).s("P3Sg_Pron", "yi").add();
        this.pathBuilder(root_ne).s(A3Sg_Pron).s("P3Sg_Pron", "si").add();

        this.pathBuilder(root_ne).s(A3Sg_Pron).s("P1Pl_Pron", "yimiz").add();

        this.pathBuilder(root_ne).s(A3Sg_Pron).s("P2Pl_Pron", "yiniz").add();

        this.pathBuilder(root_ne).s(A3Sg_Pron).s("P3Pl_Pron", "leri").add();

        this.pathBuilder(root_ne).s(A3Sg_Pron).s("Pnon_Pron").s("Gen_Pron", "yin").add();

        this.pathBuilder(root_ne).s(A3Sg_Pron).s("Pnon_Pron").add();

        this.pathBuilder(root_ne).s("A3Pl_Pron", "ler").s("Pnon_Pron").add();
    }

    void createPredefinedPathOf_su() {
        final Root root_su = this.findRoot("su", PrimaryPos.Noun, null);

        final Suffix A3Sg_Noun = this.suffixGraph.getSuffix("A3Sg_Noun");

        this.pathBuilder(root_su).s(A3Sg_Noun).s("P1Sg_Noun", "yum").add();
        this.pathBuilder(root_su).s(A3Sg_Noun).s("P2Sg_Noun", "yun").add();
        this.pathBuilder(root_su).s(A3Sg_Noun).s("P3Sg_Noun", "yu").add();
        this.pathBuilder(root_su).s(A3Sg_Noun).s("P1Pl_Noun", "yumuz").add();
        this.pathBuilder(root_su).s(A3Sg_Noun).s("P2Pl_Noun", "yunuz").add();
        this.pathBuilder(root_su).s(A3Sg_Noun).s("P3Pl_Noun", "lar").add();
        this.pathBuilder(root_su).s(A3Sg_Noun).s("Pnon_Noun").s("Gen_Noun", "yun").add();
        this.pathBuilder(root_su).s(A3Sg_Noun).s("Pnon_Noun").add();

        this.pathBuilder(root_su).s("A3Pl_Noun", "lar").s("Pnon_Noun").add();
    }

    void createPredefinedPathOf_ora_bura_sura_nere() {
        final Root root_or = this.findRoot("or", PrimaryPos.Pronoun, null);
        final Root root_bur = this.findRoot("bur", PrimaryPos.Pronoun, null);
        final Root root_sur = this.findRoot("ur", PrimaryPos.Pronoun, null);
        final Root root_ner = this.findRoot("ner", PrimaryPos.Pronoun, SecondaryPos.Question);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");
        final Suffix Pnon_Pron = this.suffixGraph.getSuffix("Pnon_Pron");

        // define predefined paths for "orda" and "ordan" etc.

        this.pathBuilder(root_or).s(A3Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "da").add();
        this.pathBuilder(root_or).s(A3Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "dan").add();

        this.pathBuilder(root_bur).s(A3Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "da").add();
        this.pathBuilder(root_bur).s(A3Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "dan").add();

        this.pathBuilder(root_sur).s(A3Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "da").add();
        this.pathBuilder(root_sur).s(A3Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "dan").add();

        this.pathBuilder(root_ner).s(A3Sg_Pron).s(Pnon_Pron).s("Loc_Pron", "de").add();
        this.pathBuilder(root_ner).s(A3Sg_Pron).s(Pnon_Pron).s("Abl_Pron", "den").add();
    }

    void createPredefinedPathOf_iceri_disari() {
        final Root root_icer = this.findRoot("ier", PrimaryPos.Noun, null);
        final Root root_disar = this.findRoot("dar", PrimaryPos.Noun, null);

        final Suffix A3Sg_Noun = this.suffixGraph.getSuffix("A3Sg_Noun");
        final Suffix Pnon_Noun = this.suffixGraph.getSuffix("Pnon_Noun");
        final Suffix P3Sg_Noun = this.suffixGraph.getSuffix("P3Sg_Noun");

        // define predefined paths for "ierde" and "dardan" etc.

        this.pathBuilder(root_icer).s(A3Sg_Noun).s(Pnon_Noun).s("Loc_Noun", "de").add();
        this.pathBuilder(root_icer).s(A3Sg_Noun).s(Pnon_Noun).s("Abl_Noun", "den").add();
        this.pathBuilder(root_icer).s(A3Sg_Noun).s(P3Sg_Noun, "si").add();

        this.pathBuilder(root_disar).s(A3Sg_Noun).s(Pnon_Noun).s("Loc_Noun", "da").add();
        this.pathBuilder(root_disar).s(A3Sg_Noun).s(Pnon_Noun).s("Abl_Noun", "dan").add();
        this.pathBuilder(root_disar).s(A3Sg_Noun).s(P3Sg_Noun, "s").add();
    }

    void createPredefinedPathOf_bazilari_bazisi() {
        final Root root_bazisi = this.findRoot("bazs", PrimaryPos.Pronoun, null);
        final Root root_bazilari = this.findRoot("bazlar", PrimaryPos.Pronoun, null);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");

        this.pathBuilder(root_bazilari).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_bazilari).s(A3Sg_Pron).s("P1Pl_Pron", "mz").add();
        this.pathBuilder(root_bazilari).s(A3Sg_Pron).s("P2Pl_Pron", "nz").add();

        this.pathBuilder(root_bazisi).s(A3Sg_Pron).s("P3Sg_Pron").add();
    }

    void createPredefinedPathOf_kimileri_kimisi_kimi() {
        final Root root_kimi = this.findRoot("kimi", PrimaryPos.Pronoun, null);
        final Root root_kimisi = this.findRoot("kimisi", PrimaryPos.Pronoun, null);
        final Root root_kimileri = this.findRoot("kimileri", PrimaryPos.Pronoun, null);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");

        this.pathBuilder(root_kimileri).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_kimileri).s(A3Sg_Pron).s("P1Pl_Pron", "miz").add();
        this.pathBuilder(root_kimileri).s(A3Sg_Pron).s("P2Pl_Pron", "niz").add();

        this.pathBuilder(root_kimi).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_kimi).s(A3Sg_Pron).s("P1Pl_Pron", "miz").add();
        this.pathBuilder(root_kimi).s(A3Sg_Pron).s("P2Pl_Pron", "niz").add();

        this.pathBuilder(root_kimisi).s(A3Sg_Pron).s("P3Sg_Pron").add();
    }

    void createPredefinedPathOf_birileri_birisi_biri() {
        final Root root_biri = this.findRoot("biri", PrimaryPos.Pronoun, null);
        final Root root_birisi = this.findRoot("birisi", PrimaryPos.Pronoun, null);
        final Root root_birileri = this.findRoot("birileri", PrimaryPos.Pronoun, null);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");

        this.pathBuilder(root_birileri).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_birileri).s(A3Sg_Pron).s("P1Pl_Pron", "miz").add();
        this.pathBuilder(root_birileri).s(A3Sg_Pron).s("P2Pl_Pron", "niz").add();

        this.pathBuilder(root_biri).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_biri).s(A3Sg_Pron).s("P1Pl_Pron", "miz").add();
        this.pathBuilder(root_biri).s(A3Sg_Pron).s("P2Pl_Pron", "niz").add();

        this.pathBuilder(root_birisi).s(A3Sg_Pron).s("P3Sg_Pron").add();
    }

    void createPredefinedPathOf_hicbirisi_hicbiri() {
        final Root root_hicbiri = this.findRoot("hibiri", PrimaryPos.Pronoun, null);
        final Root root_hicbirisi = this.findRoot("hibirisi", PrimaryPos.Pronoun, null);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");

        this.pathBuilder(root_hicbiri).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_hicbiri).s(A3Sg_Pron).s("P1Pl_Pron", "miz").add();
        this.pathBuilder(root_hicbiri).s(A3Sg_Pron).s("P2Pl_Pron", "niz").add();

        this.pathBuilder(root_hicbirisi).s(A3Sg_Pron).s("P3Sg_Pron").add();
    }

    void createPredefinedPathOf_birbiri() {
        final Root root_birbir = this.findRoot("birbir", PrimaryPos.Pronoun, null);
        final Root root_birbiri = this.findRoot("birbiri", PrimaryPos.Pronoun, null);

        this.pathBuilder(root_birbiri).s("A3Sg_Pron").s("P3Sg_Pron").add();
        this.pathBuilder(root_birbiri).s("A1Pl_Pron").s("P1Pl_Pron", "miz").add();
        this.pathBuilder(root_birbiri).s("A2Pl_Pron").s("P2Pl_Pron", "niz").add();

        this.pathBuilder(root_birbir).s("A3Pl_Pron").s("P3Pl_Pron", "leri").add();
    }

    void createPredefinedPathOf_cogu_bircogu_coklari_bircoklari() {
        final Root root_cogu = this.findRoot("ou", PrimaryPos.Pronoun, null);
        final Root root_bircogu = this.findRoot("birou", PrimaryPos.Pronoun, null);
        final Root root_coklari = this.findRoot("oklar", PrimaryPos.Pronoun, null);
        final Root root_bircoklari = this.findRoot("biroklar", PrimaryPos.Pronoun, null);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");

        this.pathBuilder(root_cogu).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_cogu).s(A3Sg_Pron).s("P1Pl_Pron", "muz").add();
        this.pathBuilder(root_cogu).s(A3Sg_Pron).s("P2Pl_Pron", "nuz").add();

        this.pathBuilder(root_bircogu).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_bircogu).s(A3Sg_Pron).s("P1Pl_Pron", "muz").add();
        this.pathBuilder(root_bircogu).s(A3Sg_Pron).s("P2Pl_Pron", "nuz").add();

        this.pathBuilder(root_coklari).s(A3Sg_Pron).s("P3Pl_Pron").add();

        this.pathBuilder(root_bircoklari).s(A3Sg_Pron).s("P3Pl_Pron").add();
    }

    void createPredefinedPathOf_birkaci() {
        final Root root_birkaci = this.findRoot("birka", PrimaryPos.Pronoun, null);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");

        this.pathBuilder(root_birkaci).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_birkaci).s(A3Sg_Pron).s("P1Pl_Pron", "mz").add();
        this.pathBuilder(root_birkaci).s(A3Sg_Pron).s("P2Pl_Pron", "nz").add();
    }

    void createPredefinedPathOf_cumlesi() {
        final Root root_cumlesi = this.findRoot("cmlesi", PrimaryPos.Pronoun, null);

        this.pathBuilder(root_cumlesi).s("A3Sg_Pron").s("P3Sg_Pron").add();
    }

    void createPredefinedPathOf_digeri_digerleri() {
        final Root root_digeri = this.findRoot("dieri", PrimaryPos.Pronoun, null);
        final Root root_digerleri = this.findRoot("dierleri", PrimaryPos.Pronoun, null);

        final Suffix A3Sg_Pron = this.suffixGraph.getSuffix("A3Sg_Pron");

        this.pathBuilder(root_digeri).s(A3Sg_Pron).s("P3Sg_Pron").add();
        this.pathBuilder(root_digeri).s(A3Sg_Pron).s("P1Pl_Pron", "miz").add();
        this.pathBuilder(root_digeri).s(A3Sg_Pron).s("P2Pl_Pron", "niz").add();

        this.pathBuilder(root_digerleri).s(A3Sg_Pron).s("P3Pl_Pron").add();
        this.pathBuilder(root_digerleri).s(A3Sg_Pron).s("P1Pl_Pron", "miz").add();
        this.pathBuilder(root_digerleri).s(A3Sg_Pron).s("P2Pl_Pron", "niz").add();
    }

    private PredefinedPathBuilder pathBuilder(Root root) {
        return new PredefinedPathBuilder(suffixGraph, suffixApplier, morphemeContainerMap).root(root);
    }

    private Root findRoot(final String strRoot, final PrimaryPos primaryPos, final SecondaryPos secondaryPos) {
        if (!this.rootMap.containsKey(strRoot))
            throw new RuntimeException("Unable to find root " + strRoot);

        final Collection<? extends Root> roots = this.rootMap.get(strRoot);
        final Collection<? extends Root> filteredRoots = Collections2.filter(roots, new Predicate<Root>() {
            @Override
            public boolean apply(final Root root) {
                return Objects.equal(root.getLexeme().getPrimaryPos(), primaryPos)
                        && Objects.equal(root.getLexeme().getSecondaryPos(), secondaryPos);
            }
        });

        Validate.isTrue(filteredRoots.size() == 1,
                "Found more than once roots for given parameters :" + filteredRoots.toString());
        return filteredRoots.iterator().next();
    }

}