public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) {
     if (kelime.sonEk().ad().Equals(TurkceEkAdlari.FIIL_KOK)
          && kelime.kok().ozelDurumIceriyormu(TurkceKokOzelDurumTipi.GENIS_ZAMAN))
         return ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri());
     else
         return null;
 }
 /**
  * Gelen kelimler icinde soru "koku" bulursa bunu onceki kelimeye ek olarak ekler.
  * aslnda eklenip eklenemeyeceginin testinin yapilmasi gerekir ama duzgun yazilmis cumlelerde
  * isleyecegini saniyourm
  *
  * @param cumleKelimeleri
  * @return yeni kelime dizisi. soru kokleri eke donustugunden yeni kelime dizisinde bu kokler yer almaz.
  */
 public Kelime[] soruEkiVarsaBirlestir(Kelime[] cumleKelimeleri)
 {
     //soru koku cumleden silineceginden yeni bir diziye gerek var..
     Kelime[] yeniKelimeler = new Kelime[cumleKelimeleri.Length];
     int j = 0;
     //cumle kelimelerini tarayalim bastan sona.
     for (int i = 0; i < cumleKelimeleri.Length; i++)
     {
         Kelime kelime = cumleKelimeleri[i];
         // ilk kelime degilse ve kelime aslinda soru eki ise..
         if (i > 0 && kelime.kok().tip().Equals(KelimeTipi.SORU))
         {
             // onceki kelimeyi al ve sonuna soru eki ekle.
             // daha sonra soru "kokunden" sonra gelen tum ekleri de ekle.
             Kelime oncekiKelime = cumleKelimeleri[i - 1];
             oncekiKelime.ekler().Add(ekYonetici.ek(TurkceEkAdlari.FIIL_SORU_MI));
             if (kelime.ekler().Count > 1)
             {   
                 List<Ek> tempList = kelime.ekler();
                 tempList.RemoveAt(0);
                 oncekiKelime.ekler().AddRange(tempList);
                 //oncekiKelime.ekler().addAll(kelime.ekler().subList(1, kelime.ekler().Count));
             }
         }
         else
             yeniKelimeler[j++] = kelime;
     }
     return yeniKelimeler;
 }
    private UretimNesnesi uretimNesnesiUret(Kok kok, IList<Ek> ekler) {

        if (kok == null)
            return new UretimNesnesi("");
        UretimNesnesi ure = new UretimNesnesi(kok.icerik());
        Kelime kelime = new Kelime(kok, alfabe);

        if (ekler.Count > 1) {
            HarfDizisi ozelDurumSonrasi = kok.ozelDurumUygula(alfabe, ekler[1]);
            if (ozelDurumSonrasi != null)
                kelime.setIcerik(ozelDurumSonrasi);
            else
                return ure;
        } else {
            return ure;
        }

        for (int i = 0; i < ekler.Count; i++) {

            Ek ek = ekler[i];

            // eger incelenen ek onceki ekten sonra gelemezse cik.
            if (i > 0) 
            {
                Ek oncekiEk = ekler[i - 1];
                if (!oncekiEk.ardindanGelebilirMi(ek)) 
                {
                    return ure;
                }
            }



            //olusum icin kural belirle ve eki olustur.
            HarfDizisi ekOlusumu;
            if (i < ekler.Count - 1)
                ekOlusumu = new HarfDizisi(ek.olusumIcinUret(kelime, ekler[i + 1]));
            else
                ekOlusumu = new HarfDizisi(ek.olusumIcinUret(kelime, TemelEkYonetici.BOS_EK));

            //TODO: asagidaki bolum dil ozel. muhtemelen olusumIcinURet metodu duzletilirse gerek kalmaz.
            // ek son harf yumusatmayi kendimiz hallediyoruz (eger yalin ek ise bu islemi pas geciyoruz.)
            if (i > 1) {
                if (kelime.sonHarf().sertMi() && ekOlusumu.ilkHarf().sesliMi())
                    kelime.icerik().sonHarfYumusat();
            }

            //eki kelimeye ve ek olusumlarina ekle.
            kelime.icerikEkle(ekOlusumu);
            if (ekOlusumu.Length > 0)
                ure.olusumlar.Add(ekOlusumu.ToString());
            kelime.ekler().Add(ek);
        }

        //son duzeltmeleri uygula.
        yardimci.kelimeBicimlendir(kelime);
        ure.olusum = kelime.icerikStr();
        return ure;
    }
Exemple #4
0
 public System.Object Clone()
 {
     Kelime kopya = new Kelime();
     //kok'u kopyalamaya gerek yok. referans esitlemesi yeter
     kopya._kok = _kok;
     kopya._icerik = new HarfDizisi(_icerik);
     kopya._ekler = new List<Ek>(_ekler);
     kopya._tip = this._tip;
     return kopya;
 }
 public override  HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) {
     if (kiyaslayici == null) return null;
     // eki olustur.
     HarfDizisi ek = ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri());
     TurkceHarf ekHarfi = sesliUretci.sesliBelirleIU(kelime.icerik());
     HarfDizisi olusum = new HarfDizisi("yor", alfabe);
     olusum.ekle(0, ekHarfi);
     int harfPozisyonu = kelime.boy() + ek.Length;
     if (kiyaslayici.aradanKiyasla(giris, olusum, harfPozisyonu))
         return ek;
     return null;
 }
    public void kelimeBicimlendir(Kelime kelime) {
        Kok kok = kelime.kok();
        HarfDizisi olusan = kelime.icerik();
        if (kok.tip().Equals(KelimeTipi.KISALTMA)) {
            //cozumleme sirasinda eklenmis harf varsa onlari sil.
            int silinecek = kok.icerik().Length;
            if (kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.KISALTMA_SON_SESSIZ))
                silinecek += 2;
            if (kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.KISALTMA_SON_SESLI))
                silinecek++;
            //kelimenin olusan kismindan kokun icereigini sil.
            olusan.harfSil(0, silinecek);
            //simdi kokun orjinal halini ekle.
            olusan.ekle(0, new HarfDizisi(kok.asil(), alfabe));

            if (olusan.Length == kok.asil().Length)
                return;
            //eger gerekiyorsa kesme isareti koy.
            if (!olusan.harf(kok.asil().Length - 1).Equals(alfabe.harf('.')))
                olusan.ekle(kok.asil().Length, alfabe.harf('\''));

        } else if (kok.tip() == KelimeTipi.OZEL) {
            olusan.harfDegistir(0, alfabe.buyukHarf(olusan.ilkHarf()));
            if (kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.KESMESIZ))
                return;
            List<Ek> ekler = kelime.ekler();
            if (ekler.Count > 1) {
                Ek ek = (Ek) ekler[1];
                if (ek.iyelikEkiMi() ||ek.halEkiMi()) {
                    int kesmePozisyonu = kok.icerik().Length;
                    olusan.ekle(kesmePozisyonu,alfabe.harf('\''));
                }
            }
        }
        // ozel ic karakter iceren kokler icin bicimleme
/*        if (kok.ozelDurumlar().contains(TurkceKokOzelDurumlari.OZEL_IC_KARAKTER)) {
            //olusan ksimdan koku sil
            int silinecek = kok.icerik().length();
            olusan.harfSil(0, silinecek);
            //simdi kokun orjinal halini ekle.
            olusan.ekle(0, new HarfDizisi(kok.asil()));
        }*/
    }
 public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) {
     TurkceHarf son = kelime.sonHarf();
     if(son.sesliMi())
       return new HarfDizisi(0);
     HarfDizisi sonuc = new HarfDizisi();
     if (kelime.kok().ozelDurumIceriyormu(TurkceKokOzelDurumTipi.FIIL_ARA_SESLI_DUSMESI)) {
         //eger ara sesli dusmesi olmussa eklenecek seslinin dusen sesliye gore
         //belirlenmesi gerekir. yani, "kavurmak" koku ve "kavrulmuS" girisini dusunelim,
         //ara sesli dusmesi ozel durumu nedeniyle "u" harfi kokten duserek "kavr" haline
         //gelir. Ancak koke bu haliyle edilgenlik ekini eklemeye kalkarsak "kavrIlmIS"
         //seklinde yanlis bir kelime ortaya cikardi. Bu nedenle burada dusen eke gore hangi
         // harfin eklenecegi belirleniyor.
         HarfDizisi kok = new HarfDizisi(kelime.kok().icerik(), alfabe);
         TurkceHarf kokAsilSesli = kok.sonSesli();
         sonuc.ekle(sesliUretici.sesliBelirleIU(kokAsilSesli));
     } else
         sonuc.ekle(sesliUretici.sesliBelirleIU(kelime.icerik()));
     if (son.Equals(alfabe.harf('l')))
         sonuc.ekle(alfabe.harf('n'));
     else
         sonuc.ekle(alfabe.harf('l'));
     return sonuc;
 }
        /**
         * Verilen kelime için öneri üretir.
         * Yapýlan öneriler þu þekildedir:
         * - Kökte 1, ekte 1 mesafeye kadar olmak üzere Levenshtein düzeltme mesafesine uyan tüm öneriler
         * - Deasciifier'den dönüþ deðeri olarak gelen öneriler
         * - Kelimenin ayrýk iki kelimeden oluþmasý durumu için öneriler
         *
         * @param kelime : Öneri yapýlmasý istenen giriþ kelimesi
         * @return String[] olarak öneriler
         *         Eðer öneri yoksa sifir uzunluklu dizi.
         */
        public String[] oner(String kelime) {
        // Once hatalý kelime için tek kelimelik önerileri bulmaya çalýþ
        Kelime[] oneriler = toleransliCozumleyici.cozumle(kelime);
        
        //Deasciifierden bir þey var mý?
        Kelime[] asciiTurkceOneriler = new Kelime[0];
        if (ayarlar.oneriDeasciifierKullan())
            asciiTurkceOneriler = asciiToleransliCozumleyici.cozumle(kelime);

        Set<String> ayriYazimOnerileri = Collections.EMPTY_SET_STRING;

        // Kelime yanlislikla bitisik yazilmis iki kelimeden mi olusmus?
        if (ayarlar.oneriBilesikKelimeKullan()) {
            for (int i = 1; i < kelime.Length; i++) {
                String s1 = kelime.Substring(0, i);
                String s2 = kelime.Substring(i, kelime.Length-i);
                if (cozumleyici.denetle(s1) && cozumleyici.denetle(s2)) {

                    Set<String> set1 = new HashedSet<String>();
                    Kelime[] kelimeler1 = cozumleyici.cozumle(s1);
                    foreach (Kelime kelime1 in kelimeler1) {
                        yardimci.kelimeBicimlendir(kelime1);
                        set1.Add(kelime1.icerik().ToString());
                    }

                    Set<String> set2 = new HashedSet<String>();
                    Kelime[] kelimeler2 = cozumleyici.cozumle(s2);
                    foreach (Kelime kelime1 in kelimeler2) {
                        yardimci.kelimeBicimlendir(kelime1);
                        set2.Add(kelime1.icerik().ToString());
                    }

                    if (ayriYazimOnerileri.Count == 0) {
                        ayriYazimOnerileri = new HashedSet<String>();
                    }

                    foreach (String str1 in set1) {
                        foreach (String str2 in set2) {
                            ayriYazimOnerileri.Add(str1 + " " + str2);
                        }
                    }
                }
            }
        }

        // erken donus..
        if (oneriler.Length == 0 && ayriYazimOnerileri.Count == 0 && asciiTurkceOneriler.Length == 0) {
            return new String[0];
        }

        // Onerileri puanlandýrmak için bir listeye koy
        List<Kelime> oneriList = new List<Kelime>();
        oneriList.AddRange(new List<Kelime>(oneriler));
        oneriList.AddRange(new List<Kelime>(asciiTurkceOneriler));

        // Frekansa göre sýrala
        oneriList.Sort(new KelimeKokFrekansKiyaslayici());

        // Dönüþ listesi string olacak, Yeni bir liste oluþtur. 
        List<String> sonucListesi = new List<String>();
        foreach (Kelime anOneriList in oneriList) {
            sonucListesi.Add(anOneriList.icerik().ToString());
        }

        //Çift sonuçlarý liste sirasýný bozmadan iptal et.
        List<String> rafineListe = new List<String>();
        foreach (String aday in sonucListesi) {
            bool aynisiVar = false;
            foreach (String aRafineListe in rafineListe) {
                if (aday.Equals(aRafineListe)) {
                    aynisiVar = true;
                    break;
                }
            }
            if (!aynisiVar && rafineListe.Count < ayarlar.getOneriMax()) {
                rafineListe.Add(aday);
            }
        }
        	
        // Son olarak yer kalmýþsa ayrý yazýlým önerilerini ekle
        foreach (String oneri in ayriYazimOnerileri) {
            if (rafineListe.Count < ayarlar.getOneriMax())
                rafineListe.Add(oneri);
            else
                break;
        }

        return rafineListe.ToArray();
    }
    private IList<Kelime> coz(Kok kok, HarfDizisi kokDizi, HarfDizisi girisDizi, int tolerans) {

        Kelime kelime = new Kelime(kok, kokDizi);
        kelime.ekEkle(ekYonetici.ilkEkBelirle(kelime.kok()));
        BasitKelimeYigini kelimeYigini = new BasitKelimeYigini();

        List<Kelime> uygunSonuclar = new List<Kelime>();

        //analiz kelimesini kokler kokunden olustur.
        kelimeYigini.temizle();
        Ek bulunanEk = kelime.sonEk();

        int ardisilEkSirasi = 0;
        while (true) {
            //bulunan son ekten sonra gelebilecek eklerden siradakini al.
            Ek incelenenEk = bulunanEk.getArdisilEk(ardisilEkSirasi++);

            //siradaki ek yoksa incelenen ek yanlis demektir.
            // yigindan kelimenin onceki durumunu cek.
            if (incelenenEk == null) {
                //yigin bos ise sonuclar dondur.
                if (kelimeYigini.bosMu())
                    return uygunSonuclar;

                //kelimeyi ve bulunan eki onceki formuna donustur.
                BasitKelimeYigini.YiginKelime yiginKelime = kelimeYigini.al();
                kelime = yiginKelime.getKelime();
                bulunanEk = kelime.sonEk();
                ardisilEkSirasi = yiginKelime.getEkSirasi();
                continue;
            }

            //eger daha olusan kelime kok asamasinda ise (yani sadece YALIN eki eklenmisse)
            // ve kokun (kelime ile kok ayni ozel durumlara sahip) icinde bir ozel durum var ise
            // ozel durum denetlenir, yani kokun girilen ek ile degisip degismedigine bakilir.
            if (kelime.ekler().Count == 1 && kelime.kok().ozelDurumVarmi()) {
                if (!ozelDurumDenetle(kelime, girisDizi, incelenenEk, tolerans)) 
                {
                    if (logger.IsInfoEnabled) logger.Info("Ozel durum yanlis, ek:" + incelenenEk);
                    continue;
                }
            }

            //bazi eklerin olusumu, giris kelimesinin yapisina gore degisebilir.
            // ornegin giris "geleceGim" oldugu durumda gelecek zaman ekinin son harfinin
            // yumusamasi bilgisi ancak girise bakarak anlasilabilir. bu nedenle ek olusturma sirasinda giris
            // kullanilir

            HarfDizisi olusanEk = incelenenEk.cozumlemeIcinUret(kelime, girisDizi, null);
            //log.info("ek:" + incelenenEk + " olusum:" + olusanEk);
            if (olusanEk == null || olusanEk.Length == 0) {
                //log.info("bos ek.. " + incelenenEk);
                continue;
            }


            if (logger.IsInfoEnabled) logger.Info("Kok ve Olusan Ek:" + kelime.icerik() + " " + olusanEk);

            //Toleransli kiyaslama islemi burada yapiliyor. once gecici bir sekilde olusan kelimeye
            // olusan ek ekleniyor, ve giris ile toleransli kiyaslama yapiliyor. Eger kiyaslama
            // sonunda esik tolerans degeri asilmazsa dogru kabul edilip devam ediliyor.
            HarfDizisi olusum = new HarfDizisi(kelime.icerik());
            olusum.ekle(olusanEk);
            String olusumStr = olusum.ToString();
            if (logger.IsInfoEnabled) logger.Info("olusum:" + olusum);

            if (MetinAraclari.isInSubstringEditDistance(olusumStr, girisDizi.ToString(), tolerans) ||
                    MetinAraclari.inEditDistance(olusumStr, girisDizi.ToString(), tolerans)) {
                        kelimeYigini.koy((Kelime)kelime.Clone(), ardisilEkSirasi);
                ardisilEkSirasi = 0;
                // ek ekleneceginde yumusama yapilip yapilmayacagi belirleniyor.. aci
                if (olusanEk.harf(0).sesliMi()
                        && kelime.sonHarf().sertMi()
                        && kelime.ekler().Count > 1
                        && olusanEk.ilkHarf().sertDonusum()!=null) {
                    kelime.icerik().sonHarfYumusat();
                }
                kelime.icerikEkle(olusanEk);
                kelime.ekEkle(incelenenEk);
                olusumStr = kelime.icerikStr();
                if (logger.IsInfoEnabled) logger.Info("ekleme sonrasi olusan kelime: " + kelime.icerik());

                bulunanEk = incelenenEk;

                if (MetinAraclari.inEditDistance(olusumStr, girisDizi.ToString(), tolerans)) {
                    uygunSonuclar.Add((Kelime)kelime.Clone());
                    if (logger.IsInfoEnabled) logger.Info("uygun kelime:" + kelime.icerik());
                }
/*
                        TurkceHarf ekIlkHarf = giris.harf(kelime.boy());
                        if (ekIlkHarf == TurkceAlfabe.TANIMSIZ_HARF)
                            return false;*/

            }
        }
    }
 private bool ozelDurumDenetle(Kelime kelime, HarfDizisi girisDizi, Ek ek, int tolerans) {
     if (!kelime.kok().yapiBozucuOzelDurumVarmi())
         return true;
     HarfDizisi testKokIcerigi = kelime.kok().ozelDurumUygula(alfabe, ek);
     //if (log.isTraceEnabled()) log.trace("Ozel durum sonrasi:" + testKokIcerigi + "  ek:" + ek.getIsim());
     if (testKokIcerigi == null)
         return false;
     if (MetinAraclari.isInSubstringEditDistance(testKokIcerigi.ToString(), girisDizi.ToString(), tolerans)) {
         kelime.setIcerik(new HarfDizisi(testKokIcerigi));
         //if (log.isTraceEnabled()) log.trace("basari, kelime:" + kelime.icerik());
         return true;
     } else
         kelime.setIcerik(new HarfDizisi(kelime.kok().icerik(), alfabe));
     //if (log.isTraceEnabled()) log.trace("kelime:" + kelime.icerik());
     return false;
 }
 public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) {
     if(kelime.icerik().sesliSayisi()<2)
       return ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri());
     else
       return null;
 }
    public bool kelimeBicimiDenetle(Kelime kelime, String giris) {
        if (giris.Length == 0) return false;
        Kok kok = kelime.kok();
        if (kok.tip().Equals(KelimeTipi.KISALTMA)) {
            // eger giriskokun orjinal hali ile baslamiyorsa hatali demektir.
            String _asil = kok.asil();
            if (!giris.StartsWith(_asil))
                return false;
            if (giris.Equals(_asil))
                return true;
            //burada farkli kisaltma turleri icin kesme ve nokta isaretlerinin
            // dogru olup olmadigina bakiliyor.
            String kalan = giris.Substring(_asil.Length);
            if (_asil[_asil.Length - 1] == '.') {
                return kalan[0] != '\'';
            }
            return kalan[0] == '\'';
        } else if (kelime.kok().tip() == KelimeTipi.OZEL) {
            if (Char.IsLower(giris[0]))
                return false;
            if (kelime.kok().ozelDurumIceriyormu(TurkceKokOzelDurumTipi.KESMESIZ))
                return true;
            List<Ek> ekler = kelime.ekler();
            if (ekler.Count > 1) {
                Ek ek = (Ek) ekler[1];
                if (ek.iyelikEkiMi() || ek.halEkiMi()) {
                    int kesmePozisyonu = kelime.kok().icerik().Length;
                    return kesmePozisyonu <= giris.Length && giris[kesmePozisyonu] == '\'';
                }
            }
        }
        // ozel ic karakter iceren kokler icin bicimleme
/*        if (kok.ozelDurumlar().contains(TurkceKokOzelDurumlari.OZEL_IC_KARAKTER)) {&
            //olusan ksimdan koku sil
            String _asil = kok.asil();
            if (!giris.startsWith(_asil))
              return false;
        }*/
        return true;
    }
Exemple #13
0
     public HarfDizisi olusumIcinUret(
             Kelime kelime,
             Ek sonrakiEk) {
     foreach (EkOzelDurumu ozelDurum in ozelDurumlar) {
         HarfDizisi ozelDurumSonucu = ozelDurum.olusumIcinUret(kelime, sonrakiEk);
         if (ozelDurumSonucu != null)
             return ozelDurumSonucu;
     }
     return ekUretici.olusumIcinEkUret(kelime.icerik(), sonrakiEk, uretimBilesenleri);
 }
Exemple #14
0
 public bool OzelEkOlustur(Kelime ozelKelime)
 {
     return false;
 }
 public override HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk)
 {
     return cozumlemeIcinUret(kelime, null, null);
 }
 public override HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk)
 {
     if(sonrakiEk.ad().Equals(TurkceEkAdlari.FIIL_SIMDIKIZAMAN_IYOR))
       return ekUretici.olusumIcinEkUret(kelime.icerik(),sonrakiEk, uretimBilesenleri());
     return null;
 }
Exemple #17
0
 public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) {
     if(kelime.gercekEkYok() && kelime.kok().ozelDurumIceriyormu(TurkceKokOzelDurumTipi.SU_OZEL_DURUMU))
        return ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri());
     return null;
 }
 private Kelime kelimeUret(Kok kok, HarfDizisi dizi) {
     Kelime kelime = new Kelime(kok, dizi);
     kelime.ekEkle(ekYonetici.ilkEkBelirle(kelime.kok()));
     return kelime;
 }
 public YiginKelime(Kelime kel, int index) {
     this.kelime = kel;
     this.ekSirasi = index;
 }
 public void koy(Kelime kelime, int ardisilEkSirasi) {
     yigin.AddFirst(new YiginKelime(kelime, ardisilEkSirasi));
 }
 protected void kelimeleriOlustur(String[] strs) {
     kelimeler = new Kelime[strs.Length];
     for (int i = 0; i < strs.Length; i++) {
         kelimeler[i] = new Kelime(new Kok(strs[i], KelimeTipi.FIIL), alfabe);
     }
 }
 private bool ozelDurumUygula(Kelime kelime, HarfDizisi giris, Ek ek) {
     if (!kelime.kok().yapiBozucuOzelDurumVarmi())
         return true;
     HarfDizisi testKokIcerigi = kelime.kok().ozelDurumUygula(alfabe, ek);
     if (testKokIcerigi == null) return false;
     if (logger.IsInfoEnabled) logger.Info("Ozel durum sonrasi:" + testKokIcerigi + "  ek:" + ek.ad());
     kelime.setIcerik(testKokIcerigi);
     return harfDizisiKiyaslayici.bastanKiyasla(giris, testKokIcerigi);
 }
Exemple #23
0
 public void addKelime(Kelime kelime)
 {
     kelimeler.Add(kelime);
 }
Exemple #24
0
 public void addKelime(Kelime kelime)
 {
     kelimeler.Add(kelime);
 }
Exemple #25
0
        public HarfDizisi cozumlemeIcinUret(
            Kelime kelime,
            HarfDizisi giris,
            HarfDizisiKiyaslayici kiyaslayici) {

        foreach (EkOzelDurumu ozelDurum in ozelDurumlar) {
            HarfDizisi ozelDurumSonucu = ozelDurum.cozumlemeIcinUret(kelime, giris, kiyaslayici);
            if (ozelDurumSonucu != null)
                return ozelDurumSonucu;
        }
        return ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri);
    }
 private Kelime kelimeUret(Kok kok) {
     Kelime kelime = new Kelime(kok, alfabe);
     kelime.ekEkle(ekYonetici.ilkEkBelirle(kelime.kok()));
     return kelime;
 }
 /**
  * Kok ve Ek listesi tasiyan bir kelimeyi String listesi seklinde parcalara ayirir.
  * Kelime {kok={kitap, ISIM} ekler = {ISIM_SAHIPLIK_BEN, ISIM_YONELME_E}} icin
  * {kitap,Im,a} dizisi doner.
  *
  * @param kelime : kelime
  * @return kok ve ek icerikleri (String[]) cinsinden dizi. Eger ek listesi bos ise ya da
  *         sadece yalin ek var ise sadece kok icerigi doner. Kokun ozel durum ile bozulmus hali degil
  *         orjinal icerigini iceren dizi doner.
  *         TODO:
  *         simdilik ozle adlarda bas harf kucuk olarak donuyor. Ayrica ozel yazimli koklerin orjinali
  *         degil ayiklanmis hali doner.
  */
 public IList<String> ayristir(Kelime kelime) {
     UretimNesnesi ure = uretimNesnesiUret(kelime.kok(), kelime.ekler());
     return ure.olusumlar;
 }