public TemelEkYonetici(Alfabe alfabe, String dosya, EkUretici ekUretici, EkOzelDurumUretici ozelDurumUretici, IDictionary <KelimeTipi, String> baslangicEkMap) { this.alfabe = alfabe; DateTime start = System.DateTime.Now;// currentTimeMillis(); XmlEkOkuyucu okuyucu = new XmlEkOkuyucu( dosya, ekUretici, ozelDurumUretici, alfabe); okuyucu.xmlOku(); ekler = okuyucu.getEkler(); foreach (KelimeTipi tip in baslangicEkMap.Keys) { Ek ek = ekler[baslangicEkMap[tip]]; if (ek != null) { baslangicEkleri.Add(tip, ek); } else { logger.Warn(tip + " tipi icin baslangic eki " + baslangicEkMap[tip] + " bulunamiyor!"); } } DateTime end = System.DateTime.Now; TimeSpan ts = end.Subtract(start); logger.Info("ek okuma ve olusum suresii: " + ts.Milliseconds + "ms."); }
/** * asil ek nesnelerinin olusturulma islemi burada olur. * @param eklerElement */ private void ekleriOlustur(XmlElement eklerElement) { XmlNodeList tumEkler = eklerElement.SelectNodes("ek"); foreach (XmlElement ekElement in tumEkler) { String ekAdi = ekElement.GetAttribute("ad"); Ek ek = this.ekler[ekAdi]; // uretim kuralini oku ve ekleri uret. XmlAttribute uretimKurali = ekElement.GetAttributeNode("uretim"); if (uretimKurali == null) { exit("ek uretim kural kelimesi yok!" + ekAdi); } ek.setArdisilEkler(ardisilEkleriOlustur(ek, ekElement)); ek.setEkKuralCozumleyici(ekUretici); List <EkUretimBileseni> bilesenler = ekUretimKelimesiCozumle(uretimKurali.Value); ek.setUretimBilesenleri(bilesenler); List <EkOzelDurumu> ozelDurumlar = ozelDurumlariOku(ekElement); ek.setOzelDurumlar(ozelDurumlar); ekOzellikleriBelirle(ek, ekElement); xmlDisiEkOzellikleriBelirle(ek, bilesenler); ek.baslangicHarfleriEkle(ekUretici.olasiBaslangicHarfleri(bilesenler)); foreach (EkOzelDurumu oz in ozelDurumlar) { ek.baslangicHarfleriEkle(ekUretici.olasiBaslangicHarfleri(oz.uretimBilesenleri())); } } logger.Debug("ek olusumu sonlandi."); }
/** * Bu metod rasgele girilen bir ek dizisinin olasi dogru siralamalarini bulur. * Metod kendi kendini cagiran bir yapidadir (recursive). Sonucta dogru olabilecek dizilimler * nesne icindeki "tumOlusumlar" dizisine atilir. * * @param olusan: ic calisma sirasinda dogru olusan dizilimi tasiyan ArrayList. * @param incelenenEk: Kok'un tipine gore gereken baslangic eki. FIIL ise FIIL_YALIN vs. * @param rasgeleEkler: rasgele sirali ekleri tasiyan liste. */ private void yuru(List<Ek> olusan, Ek incelenenEk, List<Ek> rasgeleEkler) { for (int i = 0; i < rasgeleEkler.Count; i++) { Ek ek = rasgeleEkler[i]; if (incelenenEk.ardindanGelebilirMi(ek)) { List<Ek> newList = new List<Ek>(rasgeleEkler); newList.Remove(ek); olusan.Add(ek); if (newList.Count != 0) yuru(olusan, ek, newList); } } if (olusan.Count == tum) { if (!this.tumOlusumlar.Contains(olusan)) this.tumOlusumlar.Add(olusan); olusan = new List<Ek>(); } else { rasgeleEkler.Add(incelenenEk); if (olusan.Count > 0) olusan.Remove(olusan[olusan.Count - 1]); } }
/** * bazi ek ozellikleri konfigurasyon dosyasinda yer almaz, ekler okunduktan sonra * bilesenlere gore otomatik olarak belirlenir. * * @param ek * @param bilesenler */ public void xmlDisiEkOzellikleriBelirle(Ek ek, List <EkUretimBileseni> bilesenler) { for (int i = 0; i < bilesenler.Count; i++) { EkUretimBileseni uretimBileseni = bilesenler[i]; TurkceHarf harf = uretimBileseni.harf(); if (i == 0 || (i == 1 && bilesenler[0].kural() == UretimKurali.KAYNASTIR)) { if (harf.sesliMi()) { ek.setSesliIleBaslayabilir(true); } switch (uretimBileseni.kural()) { case UretimKurali.SESLI_AA: case UretimKurali.SESLI_AE: case UretimKurali.SESLI_IU: ek.setSesliIleBaslayabilir(true); break; } } else { break; } } }
protected String[] ekleriOlustur(Ek ek) { String[] olusan = new String[kelimeler.Length]; for (int i = 0; i < kelimeler.Length; i++) { olusan[i] = ek.cozumlemeIcinUret(kelimeler[i], kelimeler[i].icerik(), new KesinHDKiyaslayici()).ToString(); } return olusan; }
protected void olusanEkKontrol(String[] strs, String[] gercek, Ek ek) { String[] olusanEkler; kelimeleriOlustur(strs); olusanEkler = ekleriOlustur(ek); for (int i = 0; i < gercek.Length; i++) { Assert.AreEqual(olusanEkler[i], gercek[i], "Hatali olusum:" + olusanEkler[i]); } }
/** * adi verilen Ek nesnesini bulur. Eger ek yok ise null doner. * * @param ekId - ek adi * @return istenen Ek nesnesi. */ public Ek ek(String ekId) { Ek ek = ekler[ekId]; if (ek == null) { logger.Error("Ek bulunamiyor!" + ekId); } return(ekler[ekId]); }
/** * Kok nesnesinin tipine gore gelebilecek ilk ek'i dondurur. * Baslangic ekleri bilgisi dil tarafindan belirlenir. * * @param kok * @return ilk Ek, eger kok tipi baslangic ekleri <baslangicEkleri> * haritasinda belirtilmemisse BOS_EK doner. */ public Ek ilkEkBelirle(Kok kok) { Ek baslangicEki = baslangicEkleri[kok.tip()]; if (baslangicEki != null) { return(baslangicEki); } else { return(BOS_EK); } }
public HarfDizisi olusumIcinUret( Kelime kelime, Ek sonrakiEk) { foreach (EkOzelDurumu ozelDurum in ozelDurumlar) { HarfDizisi ozelDurumSonucu = ozelDurum.olusumIcinUret(kelime, sonrakiEk); if (ozelDurumSonucu != null) { return(ozelDurumSonucu); } } return(ekUretici.olusumIcinEkUret(kelime.icerik(), sonrakiEk, uretimBilesenleri)); }
public override bool Equals(Object o) { if (this == o) { return(true); } if (o == null || this.GetType() != o.GetType()) { return(false); } Ek ek = (Ek)o; return(!(_ad != null ? !_ad.Equals(ek._ad) : ek._ad != null)); }
/** * HAL ve IYELIK eki ozellikleri burada belirlenir. ek iceriisne farkli ozellikler * eklenecekse burasi ona gore degistirilmeli. * @param ek * @param ekElement */ private void ekOzellikleriBelirle(Ek ek, XmlElement ekElement) { XmlNodeList ozellikler = ekElement.SelectNodes("ozellik"); foreach (XmlElement element in ozellikler) { String ozellik = element.InnerText.Trim(); if (ozellik.Equals("HAL")) { ek.setHalEki(true); } else if (ozellik.Equals("IYELIK")) { ek.setIyelikEki(true); } } }
/** * xml dosyadan ek kumelerini ayiklar. sonuclar ekKumeleri Map'ina atilir. * * @param ekKumeleriElement */ private void ekKumeleriniOlustur(XmlElement ekKumeleriElement) { XmlNodeList xmlKumeler = ekKumeleriElement.SelectNodes("ek-kumesi"); foreach (XmlElement ekKumeEl in xmlKumeler) { String kumeAdi = ekKumeEl.GetAttribute("ad"); Set <Ek> kumeEkleri = new HashedSet <Ek>(); XmlNodeList xmlKumeEkleri = ekKumeEl.SelectNodes("ek"); foreach (XmlElement ekEl in xmlKumeEkleri) { String ekAdi = ekEl.InnerText;//???:GetTextContext Ek ek = this.ekler[ekAdi]; if (ek == null) { exit("kume eki bulunamiyor!" + ekAdi); } kumeEkleri.Add(ek); } ekKumeleri.Add(kumeAdi, kumeEkleri); } }
public HarfDizisi olusumIcinUret( Kelime kelime, Ek sonrakiEk) { foreach (EkOzelDurumu ozelDurum in ozelDurumlar) { HarfDizisi ozelDurumSonucu = ozelDurum.olusumIcinUret(kelime, sonrakiEk); if (ozelDurumSonucu != null) return ozelDurumSonucu; } return ekUretici.olusumIcinEkUret(kelime.icerik(), sonrakiEk, uretimBilesenleri); }
public override HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk) { return(null); }
public bool ardindanGelebilirMi(Ek ek) { return _ardisilEkler.Contains(ek); }
public EkSiralayici(List<Ek> ekler, Ek baslangicEki) { this.ekler = ekler; this.baslangicEki = baslangicEki; this.tum = ekler.Count; }
private bool ozelDurumUygula(Kelime kelime, HarfDizisi giris, Ek ek) { if (!kelime.kok().yapiBozucuOzelDurumVarmi()) return true; HarfDizisi testKokIcerigi = kelime.kok().ozelDurumUygula(alfabe, ek); if (testKokIcerigi == null) return false; if (logger.IsInfoEnabled) logger.Info("Ozel durum sonrasi:" + testKokIcerigi + " ek:" + ek.ad()); kelime.setIcerik(testKokIcerigi); return harfDizisiKiyaslayici.bastanKiyasla(giris, testKokIcerigi); }
public void ekEkle(Ek ek) { _ekler.Add(ek); }
public bool ardindanGelebilirMi(Ek ek) { return(_ardisilEkler.Contains(ek)); }
public override HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk) { return null; }
public override HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk) { return cozumlemeIcinUret(kelime, null, null); }
private bool ozelDurumDenetle(Kelime kelime, HarfDizisi girisDizi, Ek ek, int tolerans) { if (!kelime.kok().yapiBozucuOzelDurumVarmi()) return true; HarfDizisi testKokIcerigi = kelime.kok().ozelDurumUygula(alfabe, ek); //if (log.isTraceEnabled()) log.trace("Ozel durum sonrasi:" + testKokIcerigi + " ek:" + ek.getIsim()); if (testKokIcerigi == null) return false; if (MetinAraclari.isInSubstringEditDistance(testKokIcerigi.ToString(), girisDizi.ToString(), tolerans)) { kelime.setIcerik(new HarfDizisi(testKokIcerigi)); //if (log.isTraceEnabled()) log.trace("basari, kelime:" + kelime.icerik()); return true; } else kelime.setIcerik(new HarfDizisi(kelime.kok().icerik(), alfabe)); //if (log.isTraceEnabled()) log.trace("kelime:" + kelime.icerik()); return false; }
public override HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk) { return(cozumlemeIcinUret(kelime, null, null)); }
public virtual HarfDizisi ozelDurumUygula(Alfabe alfabe, Ek ek) { HarfDizisi dizi = new HarfDizisi(this._icerik, alfabe); foreach(KokOzelDurumu ozelDurum in ozelDurumlar) { if (ozelDurum.yapiBozucumu() && ozelDurum.olusabilirMi(ek)) ozelDurum.uygula(dizi); if (!ozelDurum.olusabilirMi(ek) && ozelDurum.ekKisitlayiciMi()) return null; } return dizi; }
/** * Bir eke iliskin ardisil ekler belirlenir. ardisil ekler * a) ek kumelerinden * b) normal tek olarak * c) dogrudan baska bir ekin ardisil eklerinden kopyalanarak * elde edilir. * Ayrica eger oncelikli ekler belirtilmis ise bu ekler ardisil ek listeisnin en basina koyulur. * * @param ekElement : ek xml bileseni.. * @return Ek referans Listesi. * @param anaEk ardisil ekler eklenecek asil ek */ private List <Ek> ardisilEkleriOlustur(Ek anaEk, XmlElement ekElement) { Set <Ek> ardisilEkSet = new HashedSet <Ek>(); XmlElement ardisilEklerEl = (XmlElement)ekElement.SelectNodes("ardisil-ekler")[0]; if (ardisilEklerEl == null) { return(new List <Ek>()); } // tek ekleri ekle. XmlNodeList tekArdisilEkler = ardisilEklerEl.SelectNodes("aek"); foreach (XmlElement element in tekArdisilEkler) { String ekAdi = element.InnerText; Ek ek = this.ekler[ekAdi]; if (ek == null) { exit(anaEk.ad() + " icin ardisil ek bulunamiyor! " + ekAdi); } ardisilEkSet.Add(ek); } // kume eklerini ekle. XmlNodeList kumeEkler = ardisilEklerEl.SelectNodes("kume"); foreach (XmlElement element in kumeEkler) { String kumeAdi = element.InnerText; Set <Ek> kumeEkleri = ekKumeleri[kumeAdi]; if (kumeEkleri == null) { exit("kume bulunamiyor..." + kumeAdi); } ardisilEkSet.AddAll(kumeEkleri); } //varsa baska bir ekin ardisil eklerini kopyala. XmlAttribute attr = ardisilEklerEl.GetAttributeNode("kopya-ek"); if (attr != null) { String kopyaEkadi = attr.Value; Ek ek = this.ekler[kopyaEkadi]; if (ek == null) { exit(anaEk.ad() + " icin kopyalanacak ek bulunamiyor! " + kopyaEkadi); } ardisilEkSet.AddAll(ek.ardisilEkler()); } List <Ek> ardisilEkler = new List <Ek>(ardisilEkSet.Count); //varsa oncelikli ekleri oku ve ardisil ekler listesinin ilk basina koy. // bu tamamen performans ile iliskili bir islemdir. XmlElement oncelikliEklerEl = (XmlElement)ekElement.SelectNodes("oncelikli-ekler")[0]; if (oncelikliEklerEl != null) { XmlNodeList oncelikliEkler = oncelikliEklerEl.SelectNodes("oek"); foreach (XmlElement element in oncelikliEkler) { String ekAdi = element.InnerText; Ek ek = this.ekler[ekAdi]; if (ek == null) { exit(anaEk.ad() + " icin oncelikli ek bulunamiyor! " + ekAdi); } if (ardisilEkSet.Contains(ek)) { ardisilEkler.Add(ek); ardisilEkSet.Remove(ek); } else { logger.Warn(anaEk.ad() + "icin oncelikli ek:" + ekAdi + " bu ekin ardisil eki degil!"); } } } ardisilEkler.AddRange(ardisilEkSet); return(ardisilEkler); }
public virtual HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk) { return(ekUretici.olusumIcinEkUret(kelime.icerik(), sonrakiEk, _uretimBilesenleri)); }
/** * Ozel durum giris parametresi olan ek'in bu ozel durumun olusmasina * izin verip vermeyeegi belirlenir. * * @param ek * @return gelen ek ile bu ozel durum olusabilirse true */ public bool olusabilirMi(Ek ek) { if (_herZamanOlusur) return true; if (_sesliEkIleOlusur && ek.sesliIleBaslayabilirMi()) return true; return _gelebilecekEkler.Contains(ek); }
public HarfDizisi olusumIcinEkUret(HarfDizisi ulanacak, Ek sonrakiEk, List<EkUretimBileseni> bilesenler) { //TODO: gecici olarak bu sekilde return cozumlemeIcinEkUret(ulanacak, null, bilesenler); }
public virtual HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk) { return ekUretici.olusumIcinEkUret(kelime.icerik(), sonrakiEk, _uretimBilesenleri); }
public override HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk) { if(sonrakiEk.ad().Equals(TurkceEkAdlari.FIIL_SIMDIKIZAMAN_IYOR)) return ekUretici.olusumIcinEkUret(kelime.icerik(),sonrakiEk, uretimBilesenleri()); return null; }