/** * en son kalin sesli harfi bulup onu ince formu ile degistirir. * ornegin saat -> saAt haline donusur. ince a harfi icin TurkceAlfabe sinifini inceleyin * * @param dizi */ public void uygula(HarfDizisi dizi) { for (int i = dizi.Length - 1; i >= 0; i--) { TurkceHarf h = dizi.harf(i); if (h.sesliMi() && !h.inceSesliMi()) { dizi.harfDegistir(i, _alfabe.kalinSesliIncelt(dizi.harf(i))); } } }
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 void uygula(HarfDizisi dizi) { if (dizi.Length > 0) { dizi.ekle(dizi.harf(dizi.Length - 1)); } }
public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) { HarfDizisi ek = ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, _uretimBilesenleri); // XXXX gibi Turkce harf tasimayan stringler icin koruma. // TODO: Daha dogru bir yontem bulunmali. if (ek == null) { return null; } int harfPozisyonu = kelime.boy() + ek.Length; if (giris.harf(harfPozisyonu).sesliMi()) return ek; return null; }
public override HarfDizisi cozumlemeIcinUret(Kelime kelime, HarfDizisi giris, HarfDizisiKiyaslayici kiyaslayici) { HarfDizisi ek = ekUretici.cozumlemeIcinEkUret(kelime.icerik(), giris, _uretimBilesenleri); // XXXX gibi Turkce harf tasimayan stringler icin koruma. // TODO: Daha dogru bir yontem bulunmali. if (ek == null) { return(null); } int harfPozisyonu = kelime.boy() + ek.Length; if (giris.harf(harfPozisyonu).sesliMi()) { return(ek); } return(null); }
public void uygula(HarfDizisi dizi) { if (dizi.Length > 0) dizi.ekle(dizi.harf(dizi.Length - 1)); }
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()); } } } }
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()); } } } }
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;*/ } } }
/** * Giren harf dizisinin sonunda mantikli olarak yer alan hecenin harf * sayisini dondurur. * Sistem, -trak ve benzeri harf dizilimine sahip kelimeleri hecelemiyor. * * @param kelime: turkce harf dizisi. * @return int, 1,2,3 ya da 4 donerse giris dizisinin dizinin sondan o * kadarharfi heceyi temsil eder -1 donerse hecenin bulunamadigi * anlamina gelir. sistem yabanci harf ya da isaretlerin oldugu ya * da kural disi kelimeleri heceleyemez. (ornegin, three, what vs.) * TODO: sistem su anda basta bulunan iki harf sessiz oldugu * durumlari kabul etmekte ama buna kisitlama getirilmesi iyi olur. * sadece "tr", "st", "kr" gibi girislere izin verilmeli */ public int sonHeceHarfSayisi(HarfDizisi kelime) { int boy = kelime.Length; TurkceHarf harf = kelime.harf(boy - 1); TurkceHarf oncekiHarf = kelime.harf(boy - 2); if (boy == 0) return -1; if (harf.sesliMi()) { //kelime sadece sesli. if (boy == 1) return 1; //onceki harf sesli kelime="saa" ise son ek "a" if (oncekiHarf.sesliMi()) return 1; //onceki harf sessiz ise ve kelime sadece 2 harf ise hece tum kelime. "ya" if (boy == 2) return 2; TurkceHarf ikiOncekiHarf = kelime.harf(boy - 3); // steteskp > ste if (!ikiOncekiHarf.sesliMi() && boy == 3) { return 3; } return 2; } else { // tek sessiz ile hece olmaz. if (boy == 1) return -1; TurkceHarf ikiOncekiHarf = kelime.harf(boy - 3); if (oncekiHarf.sesliMi()) { //kelime iki harfli (el, al) ya da iki onceki harf sesli (saat) if (boy == 2 || ikiOncekiHarf.sesliMi()) return 2; TurkceHarf ucOncekiHarf = kelime.harf(boy - 4); // kelime uc harfli (kal, sel) ya da uc onceki harf sesli (kanat), if (boy == 3 || ucOncekiHarf.sesliMi()) return 3; //kelime dort harfli ise yukaridaki kurallari gecmesi nedeniyle hecelenemez sayiyoruz. // ornegin tren strateji krank angstrom kelimelerii hecelenemez sayiyoruz. if (boy == 4) return -1; TurkceHarf dortOncekiHarf = kelime.harf(boy - 5); if (!dortOncekiHarf.sesliMi()) return 3; return 3; } else { if (boy == 2 || !ikiOncekiHarf.sesliMi()) return -1; TurkceHarf ucOncekiHarf = kelime.harf(boy - 4); if (boy > 3 && !ucOncekiHarf.sesliMi()) return 4; return 3; } } }
/** * Giren harf dizisinin sonunda mantikli olarak yer alan hecenin harf * sayisini dondurur. * Sistem, -trak ve benzeri harf dizilimine sahip kelimeleri hecelemiyor. * * @param kelime: turkce harf dizisi. * @return int, 1,2,3 ya da 4 donerse giris dizisinin dizinin sondan o * kadarharfi heceyi temsil eder -1 donerse hecenin bulunamadigi * anlamina gelir. sistem yabanci harf ya da isaretlerin oldugu ya * da kural disi kelimeleri heceleyemez. (ornegin, three, what vs.) * TODO: sistem su anda basta bulunan iki harf sessiz oldugu * durumlari kabul etmekte ama buna kisitlama getirilmesi iyi olur. * sadece "tr", "st", "kr" gibi girislere izin verilmeli */ public int sonHeceHarfSayisi(HarfDizisi kelime) { int boy = kelime.Length; TurkceHarf harf = kelime.harf(boy - 1); TurkceHarf oncekiHarf = kelime.harf(boy - 2); if (boy == 0) { return(-1); } if (harf.sesliMi()) { //kelime sadece sesli. if (boy == 1) { return(1); } //onceki harf sesli kelime="saa" ise son ek "a" if (oncekiHarf.sesliMi()) { return(1); } //onceki harf sessiz ise ve kelime sadece 2 harf ise hece tum kelime. "ya" if (boy == 2) { return(2); } TurkceHarf ikiOncekiHarf = kelime.harf(boy - 3); // steteskp > ste if (!ikiOncekiHarf.sesliMi() && boy == 3) { return(3); } return(2); } else { // tek sessiz ile hece olmaz. if (boy == 1) { return(-1); } TurkceHarf ikiOncekiHarf = kelime.harf(boy - 3); if (oncekiHarf.sesliMi()) { //kelime iki harfli (el, al) ya da iki onceki harf sesli (saat) if (boy == 2 || ikiOncekiHarf.sesliMi()) { return(2); } TurkceHarf ucOncekiHarf = kelime.harf(boy - 4); // kelime uc harfli (kal, sel) ya da uc onceki harf sesli (kanat), if (boy == 3 || ucOncekiHarf.sesliMi()) { return(3); } //kelime dort harfli ise yukaridaki kurallari gecmesi nedeniyle hecelenemez sayiyoruz. // ornegin tren strateji krank angstrom kelimelerii hecelenemez sayiyoruz. if (boy == 4) { return(-1); } TurkceHarf dortOncekiHarf = kelime.harf(boy - 5); if (!dortOncekiHarf.sesliMi()) { return(3); } return(3); } else { if (boy == 2 || !ikiOncekiHarf.sesliMi()) { return(-1); } TurkceHarf ucOncekiHarf = kelime.harf(boy - 4); if (boy > 3 && !ucOncekiHarf.sesliMi()) { return(4); } return(3); } } }