public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) { if (kelime.sonEk().ad().Equals(TurkceEkAdlari.FIIL_KOK) && kelime.kok().ozelDurumIceriyormu(TurkceKokOzelDurumTipi.GENIS_ZAMAN)) return ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri()); else return null; }
/** * Gelen kelimler icinde soru "koku" bulursa bunu onceki kelimeye ek olarak ekler. * aslnda eklenip eklenemeyeceginin testinin yapilmasi gerekir ama duzgun yazilmis cumlelerde * isleyecegini saniyourm * * @param cumleKelimeleri * @return yeni kelime dizisi. soru kokleri eke donustugunden yeni kelime dizisinde bu kokler yer almaz. */ public Kelime[] soruEkiVarsaBirlestir(Kelime[] cumleKelimeleri) { //soru koku cumleden silineceginden yeni bir diziye gerek var.. Kelime[] yeniKelimeler = new Kelime[cumleKelimeleri.Length]; int j = 0; //cumle kelimelerini tarayalim bastan sona. for (int i = 0; i < cumleKelimeleri.Length; i++) { Kelime kelime = cumleKelimeleri[i]; // ilk kelime degilse ve kelime aslinda soru eki ise.. if (i > 0 && kelime.kok().tip().Equals(KelimeTipi.SORU)) { // onceki kelimeyi al ve sonuna soru eki ekle. // daha sonra soru "kokunden" sonra gelen tum ekleri de ekle. Kelime oncekiKelime = cumleKelimeleri[i - 1]; oncekiKelime.ekler().Add(ekYonetici.ek(TurkceEkAdlari.FIIL_SORU_MI)); if (kelime.ekler().Count > 1) { List<Ek> tempList = kelime.ekler(); tempList.RemoveAt(0); oncekiKelime.ekler().AddRange(tempList); //oncekiKelime.ekler().addAll(kelime.ekler().subList(1, kelime.ekler().Count)); } } else yeniKelimeler[j++] = kelime; } return yeniKelimeler; }
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 System.Object Clone() { Kelime kopya = new Kelime(); //kok'u kopyalamaya gerek yok. referans esitlemesi yeter kopya._kok = _kok; kopya._icerik = new HarfDizisi(_icerik); kopya._ekler = new List<Ek>(_ekler); kopya._tip = this._tip; return kopya; }
public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) { if (kiyaslayici == null) return null; // eki olustur. HarfDizisi ek = ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri()); TurkceHarf ekHarfi = sesliUretci.sesliBelirleIU(kelime.icerik()); HarfDizisi olusum = new HarfDizisi("yor", alfabe); olusum.ekle(0, ekHarfi); int harfPozisyonu = kelime.boy() + ek.Length; if (kiyaslayici.aradanKiyasla(giris, olusum, harfPozisyonu)) return ek; return null; }
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())); }*/ }
public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) { TurkceHarf son = kelime.sonHarf(); if(son.sesliMi()) return new HarfDizisi(0); HarfDizisi sonuc = new HarfDizisi(); if (kelime.kok().ozelDurumIceriyormu(TurkceKokOzelDurumTipi.FIIL_ARA_SESLI_DUSMESI)) { //eger ara sesli dusmesi olmussa eklenecek seslinin dusen sesliye gore //belirlenmesi gerekir. yani, "kavurmak" koku ve "kavrulmuS" girisini dusunelim, //ara sesli dusmesi ozel durumu nedeniyle "u" harfi kokten duserek "kavr" haline //gelir. Ancak koke bu haliyle edilgenlik ekini eklemeye kalkarsak "kavrIlmIS" //seklinde yanlis bir kelime ortaya cikardi. Bu nedenle burada dusen eke gore hangi // harfin eklenecegi belirleniyor. HarfDizisi kok = new HarfDizisi(kelime.kok().icerik(), alfabe); TurkceHarf kokAsilSesli = kok.sonSesli(); sonuc.ekle(sesliUretici.sesliBelirleIU(kokAsilSesli)); } else sonuc.ekle(sesliUretici.sesliBelirleIU(kelime.icerik())); if (son.Equals(alfabe.harf('l'))) sonuc.ekle(alfabe.harf('n')); else sonuc.ekle(alfabe.harf('l')); return sonuc; }
/** * Verilen kelime için öneri üretir. * Yapýlan öneriler þu þekildedir: * - Kökte 1, ekte 1 mesafeye kadar olmak üzere Levenshtein düzeltme mesafesine uyan tüm öneriler * - Deasciifier'den dönüþ deðeri olarak gelen öneriler * - Kelimenin ayrýk iki kelimeden oluþmasý durumu için öneriler * * @param kelime : Öneri yapýlmasý istenen giriþ kelimesi * @return String[] olarak öneriler * Eðer öneri yoksa sifir uzunluklu dizi. */ public String[] oner(String kelime) { // Once hatalý kelime için tek kelimelik önerileri bulmaya çalýþ Kelime[] oneriler = toleransliCozumleyici.cozumle(kelime); //Deasciifierden bir þey var mý? Kelime[] asciiTurkceOneriler = new Kelime[0]; if (ayarlar.oneriDeasciifierKullan()) asciiTurkceOneriler = asciiToleransliCozumleyici.cozumle(kelime); Set<String> ayriYazimOnerileri = Collections.EMPTY_SET_STRING; // Kelime yanlislikla bitisik yazilmis iki kelimeden mi olusmus? if (ayarlar.oneriBilesikKelimeKullan()) { for (int i = 1; i < kelime.Length; i++) { String s1 = kelime.Substring(0, i); String s2 = kelime.Substring(i, kelime.Length-i); if (cozumleyici.denetle(s1) && cozumleyici.denetle(s2)) { Set<String> set1 = new HashedSet<String>(); Kelime[] kelimeler1 = cozumleyici.cozumle(s1); foreach (Kelime kelime1 in kelimeler1) { yardimci.kelimeBicimlendir(kelime1); set1.Add(kelime1.icerik().ToString()); } Set<String> set2 = new HashedSet<String>(); Kelime[] kelimeler2 = cozumleyici.cozumle(s2); foreach (Kelime kelime1 in kelimeler2) { yardimci.kelimeBicimlendir(kelime1); set2.Add(kelime1.icerik().ToString()); } if (ayriYazimOnerileri.Count == 0) { ayriYazimOnerileri = new HashedSet<String>(); } foreach (String str1 in set1) { foreach (String str2 in set2) { ayriYazimOnerileri.Add(str1 + " " + str2); } } } } } // erken donus.. if (oneriler.Length == 0 && ayriYazimOnerileri.Count == 0 && asciiTurkceOneriler.Length == 0) { return new String[0]; } // Onerileri puanlandýrmak için bir listeye koy List<Kelime> oneriList = new List<Kelime>(); oneriList.AddRange(new List<Kelime>(oneriler)); oneriList.AddRange(new List<Kelime>(asciiTurkceOneriler)); // Frekansa göre sýrala oneriList.Sort(new KelimeKokFrekansKiyaslayici()); // Dönüþ listesi string olacak, Yeni bir liste oluþtur. List<String> sonucListesi = new List<String>(); foreach (Kelime anOneriList in oneriList) { sonucListesi.Add(anOneriList.icerik().ToString()); } //Çift sonuçlarý liste sirasýný bozmadan iptal et. List<String> rafineListe = new List<String>(); foreach (String aday in sonucListesi) { bool aynisiVar = false; foreach (String aRafineListe in rafineListe) { if (aday.Equals(aRafineListe)) { aynisiVar = true; break; } } if (!aynisiVar && rafineListe.Count < ayarlar.getOneriMax()) { rafineListe.Add(aday); } } // Son olarak yer kalmýþsa ayrý yazýlým önerilerini ekle foreach (String oneri in ayriYazimOnerileri) { if (rafineListe.Count < ayarlar.getOneriMax()) rafineListe.Add(oneri); else break; } return rafineListe.ToArray(); }
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;*/ } } }
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 cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) { if(kelime.icerik().sesliSayisi()<2) return ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri()); else return null; }
public bool kelimeBicimiDenetle(Kelime kelime, String giris) { if (giris.Length == 0) return false; Kok kok = kelime.kok(); if (kok.tip().Equals(KelimeTipi.KISALTMA)) { // eger giriskokun orjinal hali ile baslamiyorsa hatali demektir. String _asil = kok.asil(); if (!giris.StartsWith(_asil)) return false; if (giris.Equals(_asil)) return true; //burada farkli kisaltma turleri icin kesme ve nokta isaretlerinin // dogru olup olmadigina bakiliyor. String kalan = giris.Substring(_asil.Length); if (_asil[_asil.Length - 1] == '.') { return kalan[0] != '\''; } return kalan[0] == '\''; } else if (kelime.kok().tip() == KelimeTipi.OZEL) { if (Char.IsLower(giris[0])) return false; if (kelime.kok().ozelDurumIceriyormu(TurkceKokOzelDurumTipi.KESMESIZ)) return true; List<Ek> ekler = kelime.ekler(); if (ekler.Count > 1) { Ek ek = (Ek) ekler[1]; if (ek.iyelikEkiMi() || ek.halEkiMi()) { int kesmePozisyonu = kelime.kok().icerik().Length; return kesmePozisyonu <= giris.Length && giris[kesmePozisyonu] == '\''; } } } // ozel ic karakter iceren kokler icin bicimleme /* if (kok.ozelDurumlar().contains(TurkceKokOzelDurumlari.OZEL_IC_KARAKTER)) {& //olusan ksimdan koku sil String _asil = kok.asil(); if (!giris.startsWith(_asil)) return false; }*/ return true; }
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 bool OzelEkOlustur(Kelime ozelKelime) { return false; }
public override HarfDizisi olusumIcinUret(Kelime kelime, Ek sonrakiEk) { return cozumlemeIcinUret(kelime, null, null); }
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; }
public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) { if(kelime.gercekEkYok() && kelime.kok().ozelDurumIceriyormu(TurkceKokOzelDurumTipi.SU_OZEL_DURUMU)) return ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri()); return null; }
private Kelime kelimeUret(Kok kok, HarfDizisi dizi) { Kelime kelime = new Kelime(kok, dizi); kelime.ekEkle(ekYonetici.ilkEkBelirle(kelime.kok())); return kelime; }
public YiginKelime(Kelime kel, int index) { this.kelime = kel; this.ekSirasi = index; }
public void koy(Kelime kelime, int ardisilEkSirasi) { yigin.AddFirst(new YiginKelime(kelime, ardisilEkSirasi)); }
protected void kelimeleriOlustur(String[] strs) { kelimeler = new Kelime[strs.Length]; for (int i = 0; i < strs.Length; i++) { kelimeler[i] = new Kelime(new Kok(strs[i], KelimeTipi.FIIL), alfabe); } }
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 addKelime(Kelime kelime) { kelimeler.Add(kelime); }
public HarfDizisi cozumlemeIcinUret( Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) { foreach (EkOzelDurumu ozelDurum in ozelDurumlar) { HarfDizisi ozelDurumSonucu = ozelDurum.cozumlemeIcinUret(kelime, giris, kiyaslayici); if (ozelDurumSonucu != null) return ozelDurumSonucu; } return ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, uretimBilesenleri); }
private Kelime kelimeUret(Kok kok) { Kelime kelime = new Kelime(kok, alfabe); kelime.ekEkle(ekYonetici.ilkEkBelirle(kelime.kok())); return kelime; }
/** * Kok ve Ek listesi tasiyan bir kelimeyi String listesi seklinde parcalara ayirir. * Kelime {kok={kitap, ISIM} ekler = {ISIM_SAHIPLIK_BEN, ISIM_YONELME_E}} icin * {kitap,Im,a} dizisi doner. * * @param kelime : kelime * @return kok ve ek icerikleri (String[]) cinsinden dizi. Eger ek listesi bos ise ya da * sadece yalin ek var ise sadece kok icerigi doner. Kokun ozel durum ile bozulmus hali degil * orjinal icerigini iceren dizi doner. * TODO: * simdilik ozle adlarda bas harf kucuk olarak donuyor. Ayrica ozel yazimli koklerin orjinali * degil ayiklanmis hali doner. */ public IList<String> ayristir(Kelime kelime) { UretimNesnesi ure = uretimNesnesiUret(kelime.kok(), kelime.ekler()); return ure.olusumlar; }