public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) {
     TurkceHarf son = kelime.sonHarf();
     if (son.sesliMi() || ((son.charDeger()=='r') || son.charDeger()==('l'))
             && kelime.icerik().sesliSayisi() > 1) {
         return T;
     }
     return null;
 }
        public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici)
        {
            TurkceHarf son = kelime.sonHarf();

            if (son.sesliMi() || ((son.charDeger() == 'r') || son.charDeger() == ('l')) &&
                kelime.icerik().sesliSayisi() > 1)
            {
                return(T);
            }
            return(null);
        }
Exemple #3
0
        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);
        }
        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;*/
                }
            }
        }
Exemple #5
0
        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);
        }