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);
        }
Exemple #2
0
        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 #3
0
        private Kelime kelimeUret(Kok kok, HarfDizisi dizi)
        {
            Kelime kelime = new Kelime(kok, dizi);

            kelime.ekEkle(ekYonetici.ilkEkBelirle(kelime.kok()));
            return(kelime);
        }
Exemple #4
0
        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()));
 *      }*/
        }
        /**
         * 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 Kelime kelimeUret(Kok kok)
        {
            Kelime kelime = new Kelime(kok, alfabe);

            kelime.ekEkle(ekYonetici.ilkEkBelirle(kelime.kok()));
            return(kelime);
        }
Exemple #7
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);
 }
Exemple #8
0
        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));
        }
 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);
     }
 }
Exemple #10
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);
        }
Exemple #11
0
        private List <Kelime> coz(Kok kok, HarfDizisi kokDizi, HarfDizisi giris, bool tumunuCozumle)
        {
            Kelime            kelime       = kelimeUret(kok, kokDizi);
            BasitKelimeYigini kelimeYigini = new BasitKelimeYigini();
            Ek            bulunanEk        = kelime.sonEk();
            int           ardisilEkSirasi  = 0;
            List <Kelime> uygunSonuclar    = Collections.EMPTY_LIST_KELIME;
            TurkceHarf    ilkEkHarfi       = giris.harf(kelime.boy());

            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 basarisizlik.
                    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();
                    ilkEkHarfi      = giris.harf(kelime.boy());
                    continue;
                }

                if (kelime.gercekEkYok() && kelime.kok().ozelDurumVarmi())
                {
                    if (!ozelDurumUygula(kelime, giris, incelenenEk))
                    {
                        continue;
                    }
                    else
                    {
                        ilkEkHarfi = giris.harf(kelime.boy());
                    }
                }

                if (!incelenenEk.ilkHarfDenetle(ilkEkHarfi))
                {
                    continue;
                }

                HarfDizisi olusanEkIcerigi = incelenenEk.cozumlemeIcinUret(kelime, giris, harfDizisiKiyaslayici);
                if (olusanEkIcerigi == null || olusanEkIcerigi.Length == 0)
                {
                    continue;
                }

                if (harfDizisiKiyaslayici.aradanKiyasla(giris,
                                                        olusanEkIcerigi,
                                                        kelime.boy()))
                {
                    // ek dongusu testi
                    //if (kelime.ekDongusuVarmi(incelenenEk)) continue;
                    kelimeYigini.koy((Kelime)kelime.Clone(), ardisilEkSirasi);
                    ardisilEkSirasi = 0;
                    kelime.ekEkle(incelenenEk);
                    kelime.icerikEkle(olusanEkIcerigi);
                    ilkEkHarfi = giris.harf(kelime.boy());
                    if (logger.IsInfoEnabled)
                    {
                        logger.Info("ekleme sonrasi olusan kelime: " + kelime.icerik());
                    }

                    bulunanEk = incelenenEk;

                    if (harfDizisiKiyaslayici.kiyasla(kelime.icerik(), giris) && !incelenenEk.sonEkOlamazMi())
                    {
                        if (!tumunuCozumle)
                        {
                            uygunSonuclar = new List <Kelime>(1);
                            uygunSonuclar.Add(kelime);
                            return(uygunSonuclar);
                        }
                        if (uygunSonuclar.Count == 0)
                        {
                            uygunSonuclar = new List <Kelime>(2);
                        }
                        uygunSonuclar.Add((Kelime)kelime.Clone());
                    }
                }
            }
        }
        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 #13
0
        /**
         * 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);
        }