示例#1
0
        public override bool Equals(System.Object o)
        {
            if (this == o)
            {
                return(true);
            }
            if (o == null || GetType() != o.GetType())
            {
                return(false);
            }

            Kok kok = (Kok)o;

            if (_icerik != null?!_icerik.Equals(kok._icerik):kok._icerik != null)
            {
                return(false);
            }
            if (ozelDurumlar != null?!ozelDurumlar.Equals(kok.ozelDurumlar):kok.ozelDurumlar != null)
            {
                return(false);
            }
            if (TipVarmi() ? !_tip.Equals(kok._tip) : kok.TipVarmi())
            {
                return(false);
            }

            return(true);
        }
示例#2
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;
    }
示例#3
0
        /**
         * İkili (Binary) sözlükten bir kök okur. çağrıldıkça bir sonraki kökü alır.
         *
         * @return bir sonraki kök. Eğer okunacak kök kalmamışsa null
         */
        public Kok oku() 
        {
            String icerik=string.Empty;
            //kok icerigini oku. eger dosya sonuna gelinmisse (EndOfStreamException) null dondur.
            try
            {
                int len = binReader.ReadByte() * 255 + binReader.ReadByte();
                icerik = Encoding.UTF8.GetString(binReader.ReadBytes(len));
            }
            catch (EndOfStreamException)
            {
                this.Kapat();
                return null;
            }

            int len1 = binReader.ReadByte() * 255 + binReader.ReadByte();
            String asil = Encoding.UTF8.GetString(binReader.ReadBytes(len1));

            // Tip bilgisini oku (1 byte)
            string tipstr = binReader.ReadByte().ToString();
            KelimeTipi tip = (KelimeTipi)Enum.Parse(typeof(KelimeTipi), tipstr);
            Kok kok = new Kok(icerik, tip);

            if (asil.Length != 0)
                kok.Asil = asil;

            char c = Encoding.UTF8.GetChars(binReader.ReadBytes(2))[0];
            if (char.IsLetter(c))
                kok.KisaltmaSonSeslisi = c;

            // Özel durum sayısını (1 byte) ve ozel durumlari oku.
            int ozelDurumSayisi = binReader.ReadByte();
            for (int i = 0; i < ozelDurumSayisi; i++)
            {
                int ozelDurum = binReader.ReadByte();
                KokOzelDurumu oz = ozelDurumlar.ozelDurum(ozelDurum);
                kok.ozelDurumEkle(oz);
            }
            int frekans = binReader.ReadByte() * 255 * 255 * 255 + binReader.ReadByte() * 255 * 255
                        + binReader.ReadByte() * 255 + binReader.ReadByte();
            if (frekans != 0)
            {
                kok.Frekans = frekans;
            }
            return kok;
        }
示例#4
0
    public void testDegismisIcerikOlustur() 
    {
        Kok kok = new Kok("ara", KelimeTipi.FIIL);
        kok.ozelDurumEkle(koz.ozelDurum(TurkceKokOzelDurumTipi.SIMDIKI_ZAMAN));//bu satır java tarafında yok, ama bu olmazsa test cakar
        Assert.IsTrue(koz.ozelDurumUygula(kok).Length > 0);
        Assert.AreEqual((koz.ozelDurumUygula(kok))[0], "ar");
        Assert.IsTrue(kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.SIMDIKI_ZAMAN));
        kok = new Kok("kitap", KelimeTipi.ISIM);
        kok.ozelDurumEkle(koz.ozelDurum(TurkceKokOzelDurumTipi.SESSIZ_YUMUSAMASI));
        Assert.IsTrue(koz.ozelDurumUygula(kok).Length > 0);
        Assert.AreEqual((koz.ozelDurumUygula(kok))[0], "kitab");

        String str = "al" + Alfabe.CHAR_ii + "n";
        kok = new Kok(str, KelimeTipi.ISIM);
        kok.ozelDurumEkle(koz.ozelDurum(TurkceKokOzelDurumTipi.ISIM_SESLI_DUSMESI));
        Assert.IsTrue(koz.ozelDurumUygula(kok).Length > 0);
        Assert.AreEqual((koz.ozelDurumUygula(kok))[0], "aln");

        kok = new Kok("nakit", KelimeTipi.ISIM);
        kok.ozelDurumEkle(koz.ozelDurum(TurkceKokOzelDurumTipi.ISIM_SESLI_DUSMESI));
        kok.ozelDurumEkle(koz.ozelDurum(TurkceKokOzelDurumTipi.SESSIZ_YUMUSAMASI));
        Assert.IsTrue(koz.ozelDurumUygula(kok).Length > 0);
        Assert.AreEqual((koz.ozelDurumUygula(kok))[0], "nakd");

        kok = new Kok("ben", KelimeTipi.ZAMIR);
        kok.ozelDurumEkle(koz.ozelDurum(TurkceKokOzelDurumTipi.TEKIL_KISI_BOZULMASI));
        Assert.IsTrue(koz.ozelDurumUygula(kok).Length > 0);
        Assert.AreEqual((koz.ozelDurumUygula(kok))[0], "ban");

        kok = new Kok("sen", KelimeTipi.ZAMIR);
        kok.ozelDurumEkle(koz.ozelDurum(TurkceKokOzelDurumTipi.TEKIL_KISI_BOZULMASI));
        Assert.IsTrue(koz.ozelDurumUygula(kok).Length > 0);
        Assert.AreEqual((koz.ozelDurumUygula(kok))[0], "san");

        kok = new Kok("de", KelimeTipi.FIIL);
        kok.ozelDurumEkle(koz.ozelDurum(TurkceKokOzelDurumTipi.FIIL_KOK_BOZULMASI));
        Assert.IsTrue(koz.ozelDurumUygula(kok).Length > 0);
        Assert.AreEqual((koz.ozelDurumUygula(kok))[0], "di");

        kok = new Kok("ye", KelimeTipi.FIIL);
        kok.ozelDurumEkle(koz.ozelDurum(TurkceKokOzelDurumTipi.FIIL_KOK_BOZULMASI));
        Assert.IsTrue(koz.ozelDurumUygula(kok).Length > 0);
        Assert.AreEqual((koz.ozelDurumUygula(kok))[0], "yi");
    }
示例#5
0
        private String getDuzMetinSozlukForm(Kok kok)
        {

        //icerik olarak icerigin varsa asil halini yoksa normal kok icerigini al.
        String icerik = kok.icerik();
        if (kok.asil() != null)
            icerik = kok.asil();

        StringBuilder res = new StringBuilder(icerik);
        res.Append(" ");
        // Tipi ekleyelim.
        if (kok.tip() == KelimeTipi.YOK) 
        {
            logger.Warn("tipsiz kok:" + kok);
            return res.ToString();
        }

        res.Append(kok.tip().ToString());
        res.Append(" ");
        res.Append(getOzellikString(kok.ozelDurumDizisi()));
        return res.ToString();
    }
示例#6
0
 public KokDugumu(char harf, IEnumerable<char> icerik, Kok kok)
 {
     this.harf = harf;
     this.kok = kok;
     if (!icerik.Equals(kok.icerik())) this.kelime = icerik;
 }
        public String[] ozelDurumUygula(Kok kok) {
        //kok icinde ozel durum yok ise cik..
        if (!kok.ozelDurumVarmi())
            return new String[0];

        HarfDizisi hdizi = new HarfDizisi(kok.icerik(), alfabe);

        IList degismisIcerikler = new ArrayList(1);

        //ara sesli dusmesi nedeniyle bazen yapay oarak kok'e ters sesli etkisi ozel durumunun eklenmesi gerekir.
        // nakit -> nakde seklinde. normal kosullarda "nakda" olusmasi gerekirdi.
        bool eskiSonsesliInce = false;
        if (kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.ISIM_SESLI_DUSMESI))
            eskiSonsesliInce = hdizi.sonSesli().inceSesliMi();

        bool yapiBozucuOzelDurumvar = false;
        //ters sesli ozel durumu yapi bozucu ama sadece seslinin tipini degistirdiginden
        //islemeye gerek yok.
        if (kok.ozelDurumDizisi().Length == 1 && kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.TERS_SESLI_EK))
            return new String[0];

        // kok uzerindeki ozel durumlar basta sona taranip ozel durum koke uygulaniyor.
        foreach (KokOzelDurumu _ozelDurum in kok.ozelDurumDizisi()) {
            // kucultme ozel durumunda problem var, cunku kok'te hem kucultme hem yumusama uygulaniyor.
            if (_ozelDurum == null) {
                //Console.Write("kok = " + kok);
                //Environment.Exit(-1);
                logger.Warn("null ozle durum!. Kok:" + kok);
                return new String[0];
            }
            if (!_ozelDurum.Equals(ozelDurum(TurkceKokOzelDurumTipi.KUCULTME)))
                _ozelDurum.uygula(hdizi);
            if (_ozelDurum.yapiBozucumu())
                yapiBozucuOzelDurumvar = true;
        }
        // ara sesli dusmesi durumunda dusen sesi ile dustukten sonra olusan seslinin farkli olmasi durumunda
        // kok'e bir de ters sesli ek ozel durumu ekleniyor.,
        if (kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.ISIM_SESLI_DUSMESI)
                || kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.FIIL_ARA_SESLI_DUSMESI))
        {
            if (!hdizi.sonSesli().inceSesliMi() && eskiSonsesliInce)
                kok.ozelDurumEkle(ozelDurumlar[TurkceKokOzelDurumTipi.TERS_SESLI_EK]);
        }

        if (yapiBozucuOzelDurumvar)
            degismisIcerikler.Add(hdizi.ToString());

        if (kok.ozelDurumVarmi() &&
                kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.KUCULTME) &&
                kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.SESSIZ_YUMUSAMASI))
        {
            HarfDizisi tempDizi = new HarfDizisi(kok.icerik(), alfabe);
            ozelDurum(TurkceKokOzelDurumTipi.KUCULTME).uygula(tempDizi);
            degismisIcerikler.Add(tempDizi.ToString());
        }
        // yani ozel durumlar eklenmis olabileceginden koke ods'u tekrar koke esle.
        String[] tempArr = new String[degismisIcerikler.Count];
        degismisIcerikler.CopyTo(tempArr,0);
        return tempArr;
    }
示例#8
0
 public void temizle()
 {
     this.kok = null;
     this.kelime = null;
     this.esSesliler = null;
 }
示例#9
0
 public void kopyala(KokDugumu kaynak)
 {
     this.kok = kaynak.getKok();
     this.kelime = kaynak.getKelime();
     this.esSesliler = kaynak.getEsSesliler();
 }
示例#10
0
 public void testEqual() {
     Kok kok1 = new Kok("kitap", KelimeTipi.ISIM);
     Kok kok2 = new Kok("kitap", KelimeTipi.ISIM);
     Kok kok3 = new Kok("kitab", KelimeTipi.ISIM);
     Assert.IsTrue(kok1.Equals(kok2));
     Assert.IsTrue(kok1.Equals(kok3) == false);
 }
示例#11
0
 public Kelime(Kok kok, HarfDizisi dizi)
 {
     this._kok    = kok;
     this._icerik = dizi;
     _tip         = kok.tip();
 }
 private Kelime kelimeUret(Kok kok, HarfDizisi dizi) {
     Kelime kelime = new Kelime(kok, dizi);
     kelime.ekEkle(ekYonetici.ilkEkBelirle(kelime.kok()));
     return kelime;
 }
 public void kokIcerikIsle(Kok kok, KelimeTipi tip, String icerik)
 {
     //tip kisaltma ise ya da icerik ozel karakterler iceriyorsa bunu kok'un asil haline ata.
     if (tip.Equals(KelimeTipi.KISALTMA))
         kok.Asil =icerik;
     if (tip.Equals(KelimeTipi.FIIL) && (icerik.EndsWith("mek") || icerik.EndsWith("mak")))
     {
         icerik = icerik.Substring(0, icerik.Length - 3);
         kok.Icerik=icerik;
     }
 }
 public bool kokGirisDegismiVarsaUygula(Kok kok, HarfDizisi kokDizi, HarfDizisi girisDizi) {
     //turkce'de sadece kisaltmalarda bu metoda ihtiyacimiz var.
     char c = kok.KisaltmaSonSeslisi;
     if (girisDizi.Length == 0) return false;
     if (kok.tip().Equals(KelimeTipi.KISALTMA) && c != 0) {
         TurkceHarf h = alfabe.harf(c);
         //toleransli cozumleyicide kok giristen daha uzun olabiliyor.
         // o nedenle asagidaki kontrolun yapilmasi gerekiyor.
         int kokBoyu = kok.icerik().Length;
         if (kokBoyu <= girisDizi.Length)
             girisDizi.ekle(kokBoyu, h);
         else
             girisDizi.ekle(h);
         kokDizi.ekle(h);
         if (kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.KISALTMA_SON_SESSIZ)) {
             //gene toleransli cozumleyicinin hata vermemesi icin asagidaki kontrole ihtiyacimiz var
             if (kokBoyu < girisDizi.Length)
                 girisDizi.ekle(kokBoyu + 1, alfabe.harf('b'));
             else
                 girisDizi.ekle( alfabe.harf('b'));
             kokDizi.ekle( alfabe.harf('b'));
         }
         return true;
     }
     return false;
 }
    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;*/

            }
        }
    }
示例#16
0
 /**
  * Istenilen kok ve ek listesi ile kelime uretir.
  *
  * @param kok kok nesnesi
  * @param ekler ek listesi
  *
  * @return String olarak uretilen kelime.
  */
 public String kelimeUret(Kok kok, IList<Ek> ekler) {
     return _kelimeUretici.kelimeUret(kok, ekler);
 }
示例#17
0
 public Kelime(Kok kok, HarfDizisi dizi)
 {
     this._kok = kok;
     this._icerik = dizi;
     _tip = kok.tip();
 }
示例#18
0
 /**
  * Verilen kökü sözlüğe ekler. Eklemeden once koke ait ozel durumlar varsa bunlar denetlenir.
  * Eger kok ozel durumlari kok yapisini bozacak sekilde ise ozel durumlarin koke uyarlanmis halleride
  * agaca eklenir. bu sekilde bozulmus kok formlarini iceren kelimeler icin kok bulma
  * islemi basari ile gerceklestirilebilir.
  *
  * @param kok: Sözlüğe eklenecek olan kök nesnesi.
  */
 public void ekle(Kok kok) {
     kok.Indeks = indeks++;
     agac.ekle(kok.icerik(), kok);
     String[] degismisIcerikler = ozelDurumlar.ozelDurumUygula(kok);
     if (degismisIcerikler.Length > 0) {
         foreach (String degismisIcerik in degismisIcerikler) {
             agac.ekle(degismisIcerik, kok);
         }
     }
 }
 public void ozelDurumBelirle(Kok kok)
 {
     // eger bir fiilin son harfi sesli ise bu dogrudan simdiki zaman ozel durumu olarak ele alinir.
     // bu ozel durum bilgi tabaninda ayrica belirtilmedigi icin burada kok'e eklenir.  aramak -> ar(a)Iyor
     char sonChar = kok.icerik()[kok.icerik().Length - 1];
     if (kok.tip() == KelimeTipi.FIIL && alfabe.harf(sonChar).sesliMi())
     {
         //demek-yemek fiilleri icin bu uygulama yapilamaz.
         if (!kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.FIIL_KOK_BOZULMASI))
         {
             kok.ozelDurumEkle(ozelDurumlar[TurkceKokOzelDurumTipi.SIMDIKI_ZAMAN]);
         }
     }
 }
示例#20
0
 public Kelime(Kok kok, Alfabe alfabe)
 {
     this._kok = kok;
     _icerik = new HarfDizisi(kok.icerik(), alfabe);
     _tip = kok.tip();
 }
        public void duzyaziOzelDurumOku(Kok kok, String okunanIcerik, String[] parcalar)
        {
            for (int i = 2; i < parcalar.Length; i++)
            {

                String _ozelDurum = parcalar[i];

                //kisaltma ozel durumunun analizi burada yapiliyor.
                if (_ozelDurum.StartsWith(TurkceKokOzelDurumTipi.KISALTMA_SON_SESLI.KisaAd))
                {
                    int loc = _ozelDurum.IndexOf(':');
                    if (loc > 0)
                    {
                        String parca = _ozelDurum.Substring(loc + 1);
                        char sonSesli = parca[0];
                        if (!alfabe.harf(sonSesli).sesliMi())
                            logger.Warn("Hatali kisaltma harfi.. Sesli bekleniyordu." + _ozelDurum);
                        kok.KisaltmaSonSeslisi = sonSesli;
                        if (parca.Length > 1)
                        {
                            kok.ozelDurumEkle(ozelDurumlar[TurkceKokOzelDurumTipi.KISALTMA_SON_SESSIZ]);
                        }
                        else
                            kok.ozelDurumCikar(TurkceKokOzelDurumTipi.KISALTMA_SON_SESLI);
                    }
                    else
                    {
                        char sonHarf = kok.icerik()[kok.icerik().Length - 1];
                        if (!alfabe.harf(sonHarf).sesliMi())
                        {
                            kok.KisaltmaSonSeslisi='e';
                            kok.ozelDurumEkle(ozelDurumlar[TurkceKokOzelDurumTipi.KISALTMA_SON_SESLI]);
                        }
                    }
                    continue;
                }

                //diger ozel durumlarin elde edilmesi..
                KokOzelDurumu oz = ozelDurum(_ozelDurum);
                if (oz != null)
                {
                    kok.ozelDurumEkle(oz);
                }
                else
                {
                    logger.Warn("Hatali kok bileseni" + kok.icerik() + " Token: " + _ozelDurum);
                }
            }

            //kisaltmalari ve ozel karakter iceren kokleri asil icerik olarak ata.
            if (kok.tip() == KelimeTipi.KISALTMA || kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.OZEL_IC_KARAKTER))
                kok.Asil=okunanIcerik;
        }
 private Kelime kelimeUret(Kok kok) {
     Kelime kelime = new Kelime(kok, alfabe);
     kelime.ekEkle(ekYonetici.ilkEkBelirle(kelime.kok()));
     return kelime;
 }
示例#23
0
        public Kok oku() {
            String line;
            while (!reader.EndOfStream ) 
            {
                line = reader.ReadLine().Trim();
                if (line.StartsWith("#") || line.Length == 0) 
                    continue;

                String[] tokens = line.Split(AYIRICI_PATTERN);
                if (tokens == null || tokens.Length < 2) {
                    logger.Warn("Eksik bilgi!" + line);
                    continue;
                }
                String icerik = tokens[0];
                Kok kok = new Kok(icerik);

                // ayikla() ile kok icerigi kucuk harfe donusturuluyor ve '- vs 
                // isaretler siliniyor.
                kok.Icerik = alfabe.ayikla(kok.icerik());

                // kelime tipini belirle. ilk parca mutlaka kok tipini belirler
                if (_kokTipAdlari.ContainsKey(tokens[1])) {
                    KelimeTipi tip = (KelimeTipi) _kokTipAdlari[tokens[1]];
                    kok.Tip = tip;
                    ozelDurumlar.kokIcerikIsle(kok, tip, icerik);

                } else
                    logger.Warn("Kok tipi bulunamadi!" + line);

                // kok ozelliklerini ekle.
                ozelDurumlar.duzyaziOzelDurumOku(kok, icerik, tokens);

                // bazi ozel durumlar ana dosyada yer almaz, algoritma ile uretilir.
                // bu ozel durumlari koke ekle.
                ozelDurumlar.ozelDurumBelirle(kok);

                return kok;
            }
            this.Kapat();
            return null;
        }
示例#24
0
 /**
  * Dogru sirali ek listesi ve uygun kok ile olusacak kelimeyi uretir.
  *
  * @param kok   : kelime koku
  * @param ekler : dogru sekilde sirali ek listesi.
  * @return String, eger ek listesi dogru ve koke uygun ise olusan kelime, yoksa "".
  */
 public String kelimeUret(Kok kok, IList<Ek> ekler) {
     UretimNesnesi ure = uretimNesnesiUret(kok, ekler);
     return ure.olusum;
 }
    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());
                }
            }
        }
    }
示例#26
0
 public Kelime(Kok kok, Alfabe alfabe)
 {
     this._kok = kok;
     _icerik   = new HarfDizisi(kok.icerik(), alfabe);
     _tip      = kok.tip();
 }
示例#27
0
 public void testKokDegisimleri() {
     Kok kok= new Kok("bahset", KelimeTipi.FIIL);
     kok.ozelDurumEkle(koz.ozelDurum("GEN"));
     kok.ozelDurumEkle(koz.ozelDurum("YUM"));
     String[] sonuclar = koz.ozelDurumUygula(kok);
     Assert.AreEqual(sonuclar.Length,1);
     Assert.AreEqual(sonuclar[0], "bahsed");
 }
示例#28
0
 /**
  * Eðer Düðüme baðlý bir kök zaten varsa esSesli olarak ekle, 
  * yoksa sadece kok'e yaz.
  *
  * @param kok
  */
 public void kokEkle(Kok kok)
 {
     if (this.kok != null)
     {
         if (esSesliler == null) esSesliler = new List<Kok>(1);
         esSesliler.Add(kok);
     }
     else
     {
         this.kok = kok;
     }
 }
 public String rastgeleKelimeOlustur(Kok kok, int maxEkSayisi) {
     Kelime kelime = kelimeUret(kok);
     IList<Ek> girisEkListesi = new List<Ek>();
     girisEkListesi.Add(kelime.sonEk());
     IList<Ek> rastgeleEkler = rastgeleEkListesiGetir(girisEkListesi, maxEkSayisi);
     return kelimeUretici.kelimeUret(kok, rastgeleEkler);
 }
示例#30
0
        /**
         * Verilen kök icerigini aðaca ekler.
         *
         * @param icerik
         * @param kok
         */
        public void ekle(String icerik, Kok kok)
        {
            //System.out.println("Kelime: " + icerik);
            char[] hd = icerik.ToCharArray();
            KokDugumu node = baslangicDugumu;
            KokDugumu oncekiDugum = null;
            int idx = 0;
            // null alt düðüm bulana dek veya kelimenin sonuna dek alt düðümlerde ilerle
            while (idx < hd.Length)
            {
                oncekiDugum = node;
                node = node.altDugumGetir(hd[idx]);
                if (node == null) break;
                idx++;
            }
            /**
             * Aðaç üzerinde ilerlerken kelimemizin sonuna kadar gitmiþiz.
             * kelimemizi bu düðüme ekleriz.
             * Örneðin
             * i-s-t-->istim þeklindeki dala "is" kelimesini eklemek gibi.
             * i-s-t-->istim
             *   |-->is
             *
             * veya
             *
             * i-s-->istim e is gelirse de
             * i-s-t-->istim
             *   |-->is
             *
             * i-s-->is  e "is" gelirse
             * i-s-->is(2) olmalý.
             *
             */
            if (idx == hd.Length)
            {
                if (node.altDugumVarMi())
                {
                    node.kokEkle(kok);
                    node.setKelime((IEnumerable<char>)icerik);
                }
                // Eþ sesli!
                else if (node.getKelime().Equals(icerik))
                {
                    node.kokEkle(kok);
                    return;
                }
                else if (node.getKok() != null)
                {
                    //TODO : Burada charenumerable'dan son chari oldukça kazma bir yöntemle alýyoruz. Bunu incelemek lazým.
                    KokDugumu aNewNode = node.addNode(new KokDugumu(node.getKelime().ToString().ToCharArray()[idx]));
                    aNewNode.kopyala(node);
                    node.temizle();
                    node.kokEkle(kok);
                    node.setKelime(icerik);
                }
                return;

                
            }

            /**
             * Kaldýðýmýz düðüme baðlý bir kök yoksa bu kök için bir düðüm oluþturup ekleriz.
             */
            if (oncekiDugum.getKok() == null && idx < hd.Length)
            {
                oncekiDugum.addNode(new KokDugumu(hd[idx], icerik, kok));
                return;
            }

            if (oncekiDugum.getKelime().Equals(icerik))
            {
                oncekiDugum.kokEkle(kok);
                return;
            }

            /**
             * Düðümde duran "istimlak" ve gelen kök = "istimbot" için,
             * i-s-t-i-m
             * e kadar ilerler. daha sonra "istimlak" için "l" düðümünü oluþturup kökü baðlar
             * i-s-t-i-m-l-->istimlak
             * sonra da diðer düðüm için "b" düðümünü oluþturup gene "m" düðümüne baðlar
             * i-s-t-i-m-l-->istimlak
             *         |-b-->istimbot
             *
             * Eðer istimlak düðümü baðlanmýþsa ve "istim" düðümü eklenmek üzere 
             * elimize gelmiþe
             * i-s-t-i-m-l-->istimlak
             * tan sonra istim, "m" düðümüne doðrudan baðlanýr.
             * i-s-t-i-m-l-->istimlak
             *         |-->istim
             *
             */
            char[] nodeHd = ((String)oncekiDugum.getKelime()).ToCharArray();
            //char[] nodeChars = ((String) oncekiDugum.getKelime()).toCharArray();
            KokDugumu newNode = oncekiDugum;

            if (idx == nodeHd.Length)
            {
                newNode.addNode(new KokDugumu(hd[idx], icerik, kok));
                return;
            }

            //TODO : Ayný kazmalýk, kelimenin boyunu alýrken, hepsi CharSequence yüzünden
            if (oncekiDugum.getKelime().ToString().Length == idx)
            {
                newNode.addNode(new KokDugumu(hd[idx], icerik, kok));
                return;
            }

            if (nodeHd.Length <= hd.Length)
            {
                while (idx < nodeHd.Length && nodeHd[idx] == hd[idx])
                {
                    newNode = newNode.addNode(new KokDugumu(nodeHd[idx]));
                    idx++;
                }

                // Kisa dugumun eklenmesi.
                if (idx < nodeHd.Length)
                {
                    KokDugumu temp = newNode.addNode(new KokDugumu(nodeHd[idx]));
                    temp.kopyala(oncekiDugum);
                }
                else
                {
                    newNode.kopyala(oncekiDugum);
                }

                // Uzun olan dugumun (yeni gelen) eklenmesi, es anlamlilari kotar
                newNode.addNode(new KokDugumu(hd[idx], icerik, kok));
                oncekiDugum.temizle();
//Tankut Java-R42 ile silindi.                return;
            }

            /**
             *
             * Eðer köke önce "istimlak" ve sonra "istifa" gelirse
             * i-s-t-i-m-l-->istimlak
             * daha sonra gene son ortak harf olan "i" ye "f" karakterli düðümü
             * oluþturup istifayý baðlar
             * istimlak ta "m" düðümüne baðlý kalýr.
             * i-s-t-i-m-->istimlak
             *       |-f-->istifa
             *
             */

            else
            {
                while (idx < hd.Length && hd[idx] == nodeHd[idx])
                {
                    newNode = newNode.addNode(new KokDugumu(hd[idx]));
                    idx++;
                }
                // Kisa dugumun eklenmesi.
                if (idx < hd.Length)
                {
                    newNode.addNode(new KokDugumu(hd[idx], icerik, kok));
                }
                else
                {
                    newNode.kokEkle(kok);
                    newNode.setKelime(icerik);
                }

                // Uzun olan dugumun (yeni gelen) eklenmesi.
                newNode = newNode.addNode(new KokDugumu(nodeHd[idx]));
                newNode.kopyala(oncekiDugum);
                // Es seslileri tasi.
                oncekiDugum.temizle();
//Tankut Java-R42 ile silindi.                return;
            }
        }