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); }
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; }
/** * İ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; }
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"); }
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 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; }
public void temizle() { this.kok = null; this.kelime = null; this.esSesliler = null; }
public void kopyala(KokDugumu kaynak) { this.kok = kaynak.getKok(); this.kelime = kaynak.getKelime(); this.esSesliler = kaynak.getEsSesliler(); }
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); }
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;*/ } } }
/** * 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); }
/** * 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]); } } }
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; }
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; }
/** * 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()); } } } }
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"); }
/** * 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); }
/** * 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; } }