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; }
public override String ToString() { StringBuilder ekStr = new StringBuilder(); foreach (Ek ek in _ekler) { ekStr.Append(ek.ad()).Append(" + "); } if (ekStr.Length > 3) { ekStr.Remove(ekStr.Length - 3, 3); } return("{Icerik: " + _icerik + " Kok: " + _kok.icerik() + " tip:" + _kok.tip() + "} " + " Ekler:" + ekStr); }
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(); }
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; }
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; }
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]); } } }
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; }
public KokDugumu(char harf, IEnumerable<char> icerik, Kok kok) { this.harf = harf; this.kok = kok; if (!icerik.Equals(kok.icerik())) this.kelime = 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; }
/** * 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 Kelime(Kok kok, Alfabe alfabe) { this._kok = kok; _icerik = new HarfDizisi(kok.icerik(), alfabe); _tip = kok.tip(); }