/**
  * en son kalin sesli harfi bulup onu ince formu ile degistirir.
  * ornegin saat -> saAt haline donusur. ince a harfi icin TurkceAlfabe sinifini inceleyin
  *
  * @param dizi
  */
 public void uygula(HarfDizisi dizi)
 {
     for (int i = dizi.Length - 1; i >= 0; i--)
     {
         TurkceHarf h = dizi.harf(i);
         if (h.sesliMi() && !h.inceSesliMi())
         {
             dizi.harfDegistir(i, _alfabe.kalinSesliIncelt(dizi.harf(i)));
         }
     }
 }
 /**
 * en son kalin sesli harfi bulup onu ince formu ile degistirir.
 * ornegin saat -> saAt haline donusur. ince a harfi icin TurkceAlfabe sinifini inceleyin
 *
 * @param dizi
 */
 public void uygula(HarfDizisi dizi)
 {
     for (int i = dizi.Length - 1; i >= 0; i--)
     {
         TurkceHarf h = dizi.harf(i);
         if (h.sesliMi() && !h.inceSesliMi())
         {
             dizi.harfDegistir(i, _alfabe.kalinSesliIncelt(dizi.harf(i)));
         }
     }
 }
Beispiel #3
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()));
 *      }*/
        }
Beispiel #4
0
 public void uygula(HarfDizisi dizi)
 {
     if (dizi.Length > 0)
     {
         dizi.ekle(dizi.harf(dizi.Length - 1));
     }
 }
 public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici)
 {
     HarfDizisi ek = ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, _uretimBilesenleri);
     // XXXX gibi Turkce harf tasimayan stringler icin koruma.
     // TODO: Daha dogru bir yontem bulunmali.
     if (ek == null)
     {
         return null;
     }
     int harfPozisyonu = kelime.boy() + ek.Length;
     if (giris.harf(harfPozisyonu).sesliMi())
         return ek;
     return null;
 }
Beispiel #6
0
        public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici)
        {
            HarfDizisi ek = ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, _uretimBilesenleri);

            // XXXX gibi Turkce harf tasimayan stringler icin koruma.
            // TODO: Daha dogru bir yontem bulunmali.
            if (ek == null)
            {
                return(null);
            }
            int harfPozisyonu = kelime.boy() + ek.Length;

            if (giris.harf(harfPozisyonu).sesliMi())
            {
                return(ek);
            }
            return(null);
        }
Beispiel #7
0
 public void uygula(HarfDizisi dizi)
 {
     if (dizi.Length > 0)
         dizi.ekle(dizi.harf(dizi.Length - 1));
 }
Beispiel #8
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 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;*/
                }
            }
        }
        /**
         * Giren harf dizisinin sonunda mantikli olarak yer alan hecenin harf
         * sayisini dondurur.
         * Sistem, -trak ve benzeri harf dizilimine sahip kelimeleri hecelemiyor.
         *
         * @param kelime: turkce harf dizisi.
         * @return int, 1,2,3 ya da 4 donerse giris dizisinin dizinin sondan o
         *         kadarharfi heceyi temsil eder -1 donerse hecenin bulunamadigi
         *         anlamina gelir. sistem yabanci harf ya da isaretlerin oldugu ya
         *         da kural disi kelimeleri heceleyemez. (ornegin, three, what vs.)
         *         TODO: sistem su anda basta bulunan iki harf sessiz oldugu
         *         durumlari kabul etmekte ama buna kisitlama getirilmesi iyi olur.
         *         sadece "tr", "st", "kr" gibi girislere izin verilmeli
         */
        public int sonHeceHarfSayisi(HarfDizisi kelime)
        {

            int boy = kelime.Length;
            TurkceHarf harf = kelime.harf(boy - 1);
            TurkceHarf oncekiHarf = kelime.harf(boy - 2);

            if (boy == 0)
                return -1;

            if (harf.sesliMi())
            {
                //kelime sadece sesli.
                if (boy == 1)
                    return 1;
                //onceki harf sesli kelime="saa" ise son ek "a"
                if (oncekiHarf.sesliMi())
                    return 1;
                //onceki harf sessiz ise ve kelime sadece 2 harf ise hece tum kelime. "ya"
                if (boy == 2)
                    return 2;

                TurkceHarf ikiOncekiHarf = kelime.harf(boy - 3);

                // steteskp > ste
                if (!ikiOncekiHarf.sesliMi() && boy == 3)
                {
                    return 3;
                }
                return 2;
            }
            else
            {

                // tek sessiz ile hece olmaz.
                if (boy == 1)
                    return -1;

                TurkceHarf ikiOncekiHarf = kelime.harf(boy - 3);
                if (oncekiHarf.sesliMi())
                {

                    //kelime iki harfli (el, al) ya da iki onceki harf sesli (saat)
                    if (boy == 2 || ikiOncekiHarf.sesliMi())
                        return 2;

                    TurkceHarf ucOncekiHarf = kelime.harf(boy - 4);
                    // kelime uc harfli (kal, sel) ya da uc onceki harf sesli (kanat),
                    if (boy == 3 || ucOncekiHarf.sesliMi())
                        return 3;

                    //kelime dort harfli ise yukaridaki kurallari gecmesi nedeniyle hecelenemez sayiyoruz.
                    // ornegin tren strateji krank angstrom kelimelerii hecelenemez sayiyoruz.
                    if (boy == 4)
                        return -1;

                    TurkceHarf dortOncekiHarf = kelime.harf(boy - 5);
                    if (!dortOncekiHarf.sesliMi())
                        return 3;
                    return 3;
                }
                else
                {


                        if (boy == 2 || !ikiOncekiHarf.sesliMi())
                            return -1;
                        TurkceHarf ucOncekiHarf = kelime.harf(boy - 4);
                        if (boy > 3 && !ucOncekiHarf.sesliMi())
                            return 4;
                        return 3;

                }
            }

        }
        /**
         * Giren harf dizisinin sonunda mantikli olarak yer alan hecenin harf
         * sayisini dondurur.
         * Sistem, -trak ve benzeri harf dizilimine sahip kelimeleri hecelemiyor.
         *
         * @param kelime: turkce harf dizisi.
         * @return int, 1,2,3 ya da 4 donerse giris dizisinin dizinin sondan o
         *         kadarharfi heceyi temsil eder -1 donerse hecenin bulunamadigi
         *         anlamina gelir. sistem yabanci harf ya da isaretlerin oldugu ya
         *         da kural disi kelimeleri heceleyemez. (ornegin, three, what vs.)
         *         TODO: sistem su anda basta bulunan iki harf sessiz oldugu
         *         durumlari kabul etmekte ama buna kisitlama getirilmesi iyi olur.
         *         sadece "tr", "st", "kr" gibi girislere izin verilmeli
         */
        public int sonHeceHarfSayisi(HarfDizisi kelime)
        {
            int        boy        = kelime.Length;
            TurkceHarf harf       = kelime.harf(boy - 1);
            TurkceHarf oncekiHarf = kelime.harf(boy - 2);

            if (boy == 0)
            {
                return(-1);
            }

            if (harf.sesliMi())
            {
                //kelime sadece sesli.
                if (boy == 1)
                {
                    return(1);
                }
                //onceki harf sesli kelime="saa" ise son ek "a"
                if (oncekiHarf.sesliMi())
                {
                    return(1);
                }
                //onceki harf sessiz ise ve kelime sadece 2 harf ise hece tum kelime. "ya"
                if (boy == 2)
                {
                    return(2);
                }

                TurkceHarf ikiOncekiHarf = kelime.harf(boy - 3);

                // steteskp > ste
                if (!ikiOncekiHarf.sesliMi() && boy == 3)
                {
                    return(3);
                }
                return(2);
            }
            else
            {
                // tek sessiz ile hece olmaz.
                if (boy == 1)
                {
                    return(-1);
                }

                TurkceHarf ikiOncekiHarf = kelime.harf(boy - 3);
                if (oncekiHarf.sesliMi())
                {
                    //kelime iki harfli (el, al) ya da iki onceki harf sesli (saat)
                    if (boy == 2 || ikiOncekiHarf.sesliMi())
                    {
                        return(2);
                    }

                    TurkceHarf ucOncekiHarf = kelime.harf(boy - 4);
                    // kelime uc harfli (kal, sel) ya da uc onceki harf sesli (kanat),
                    if (boy == 3 || ucOncekiHarf.sesliMi())
                    {
                        return(3);
                    }

                    //kelime dort harfli ise yukaridaki kurallari gecmesi nedeniyle hecelenemez sayiyoruz.
                    // ornegin tren strateji krank angstrom kelimelerii hecelenemez sayiyoruz.
                    if (boy == 4)
                    {
                        return(-1);
                    }

                    TurkceHarf dortOncekiHarf = kelime.harf(boy - 5);
                    if (!dortOncekiHarf.sesliMi())
                    {
                        return(3);
                    }
                    return(3);
                }
                else
                {
                    if (boy == 2 || !ikiOncekiHarf.sesliMi())
                    {
                        return(-1);
                    }
                    TurkceHarf ucOncekiHarf = kelime.harf(boy - 4);
                    if (boy > 3 && !ucOncekiHarf.sesliMi())
                    {
                        return(4);
                    }
                    return(3);
                }
            }
        }