Open seyyah opened 13 years ago
int unlu_mu(char ch)
yardımcı işlevi hazırlamak faydalı olacaktır. ch
karakteri ünlü ise 1
değilse 0
döndürsünint kural1(char *kelime, int basl)
yardımcı işlevi kelime
de basl
ile belirtilen indisten kelime
sonuna kadar tarayıp, iki ünlü arasında yer alan ilk ünsüz harfin indisini döndürür, bulamazsa -1
dondururint kural2(char *kelime, int basl)
yardımcı işlevi kelime
de basl
ile belirtilen indisten kelime
sonuna kadar tarayıp, iki veya daha fazla ardı ardına gelen ünsüzden sonuncusunun indisini döndürür, bulamazsa -1
dondururMaalesef Türkçedeki tüm kelimeleri kapsayabilen, %100 geçerli bir heceleme algoritması yok. Özellikle yabancı kökenli sözcükler böylesi bir algoritmanın tasarlanmasını zorlaştırıyor.
Ancak pek çok Türkçe kelime üzerinde çalışabilen, bazı bileşik isimler ve son ekli sözcükler hariç çok sayıda sözcüğü hecelerine ayırabilen bir algoritma tasarlamaksa mümkün. Bunun içinse öncelikle kendimize bir kelime seti seçip, bunlar üzerinde çalışmalıyız.
İlgili kelime seti üzerinde çalışan bir C programı hazırladım. Paylaştığım adreste bir "exe" dosyası var. Windows altında çalıştırılıp denenebilir. Eğer çalışmazsa ".NET Framework 3.5" programını kurmanız gerekebilir. Programda kelimeleri Türkçe karakter kullanmadan elle girmeniz gerekiyor.
Ünlü-ünsüz dizilişlerine baktığımızda, "samsunspor" sözcüğünün 2. ve 3. heceleri olan "sun-spor" ile "sant-ral" sözcüğünün yapısının birebir aynı olduğunu görürüz (0100010). Paylaştığım program, "santral" sözcüğünü "sant-ral" olarak ayırırken, diğerini de "sam-suns-por" olarak ayıracak biçimde hazırlandı. Tabi ki programın karmaşıklığı artırılarak her ikisini de doğru sınıflandıracak hale getirilebilir ancak bunun için bol zaman lazım.
Şimdilik "exe" dosyasını paylaşıyorum, kelime seti dışındaki sözcüklerle de deneyebilirsiniz. Sizlerin daha da başarılı programlar hazırlayabileceğinize inanıyorum, verdiğim kelime setini kullanarak algoritmanızı test edebilir, güncelleyebilirsiniz.
Cuma günü hazırlamış olduğunuz algoritmalara beraber bakarız. Dilerseniz ben de hazırladığım programın kaynak kodunu sizlerle paylaşırım, tabi şimdiden paylaşmıyorum ki önce kendiniz gayret edin.
@egurbuz hocam burada baz aldığımız TDK sözlüğü o da batı kökenli kelimeler için şöyle diyor,
Batı kökenli kelimeler, Türkçenin hece yapısına göre hecelere ayrılır: band-rol, kont-rol, port-re, prog-ram, sant-ral, sürp-riz, tund-ra, volf-ram.
ve gözlemleyebildiğim kadarıyla da iki kuralla hecelemeyi TDK'nın bahsettiği şekliyle sağlamak mümkün gözüküyor. örnekler bu anlamda çarpıcı beklediğimizden farklı heceleme çıktısı üretilebiliyor (ör. karaosmanoglu
için ka-ra-os-man-og-lu
yerine tarif edilen kurallara göre ka - ra - os - ma - nog - lu
). bu yüzden baz TDK ve iki kuralla işleri basitleştiriyoruz.
@egurbuz hocam heceleme işi için hazırladığın kodlar için ellerine sağlık.
Ayrıca Türkçe için heceleme (ve imla denetimi vs özellikleriyle) konusunda zemberek en popüler olanı ve Java da kodlanmış, OpenOffice.org da kullanılmaktadır.
Arkadaşlar, 12.11.2010 Cuma günü Programlama II laboratuvarında yeni bir föy işlenmeyecek olup, GitHub çalışma soruları üzerinde durulacaktır. Bu sorular:
a- metin editörlerindeki "paragraf başı girintileme", "iki yana/sağa/sola yaslama" işlevlerinin gerçeklenmesi
b- kelimelerin hecelerine ayrılması ve hecelerin aralarına tire konarak hecelenmiş halinin gösterilmesi (bu konunun başındaki kurallardan yararlanarak)
c (ekstra puanlı)- bu konunun başındaki kuralların kapsamadığı kelimelerin de (örneğin: leopar) hecelenebilmesi için, 'b' şıkkında hazırlanmış olan programın çıktıları üzerinde bir "post-processing" işlemi yapılması (örneğin yan yana 2 ünlü bulundurduğu halde tek heceli gibi algılanan harf grubundaki ünlülerin arasına tire konarak parçalanması)
b şıkkında "grup1.txt" içerisinde yer alan kelimeler kullanılacaktır. Heceleme sonuçlarının "tireli1.txt" içerisindeki gibi olması gerekmektedir. c şıkkında ise "grup2.txt" içerisinde yer alan kelimeler kullanılacaktır. Heceleme sonuçlarının "tireli2.txt" içerisindeki gibi olması gerekir.
Daha önceki lab. derslerinde öğrenmiş olduğunuz "standart girdiyi/çıktıyı değiştirme" yöntemini kullanarak "grup1.txt" ve "grup2.txt" dosyalarını programınıza girdi olarak verip, numaranızı içeren iki adet çıktı dosyası üretmeniz beklenmektedir Örneğin, numarası 012345 olan öğrenci için:
grup1.txt --> [program] --> 12345_1.txt grup2.txt --> [program] --> 12345_2.txt
Notlandırma:
a --> 60 puan b --> 30 puan c --> 10 puan
Örneğin, a ile b' yi yapıp c' yi yap(a)mayan öğrencinin notu 90 puan üzerinden hesaplanacaktır.
Derlenmeyen kodlar ise tarafımızdan incelenerek, kodun durumuna göre notlandırılacaktır. Derlenmeyen kodlar için puanlandırma, normal puanın %60' ı üzerinden yapılacaktır. Örneğin, sadece a şıkkını yapan bir öğrencinin kodunun derlenmemesi durumunda ödev 60*0.6=36 üzerinden değerlendirilecektir (Kodu derlenen ancak çıktılarında hatalar olan arkadaşların notlandırması da derlenmeyenlere göre daha yüksek bir oran üzerinden hesaplanacaktır.).
daha önce 3 görevi için python ile heceleme işlemini gerçekleştirmiştim bir göz atılabilir :) samsunpor örneğindeki gibi sam-suns-por şeklinde çıktı veriyor bu tip kelimeleri aşmak çok zor ama imkansız değil
https://github.com/emineker/3-yeni-hesap/blob/master/algoritma/heceleme.py
yazdığın kodlar çalışıyor fakat istediğimiz formda değil. yukarıda verdiğimiz işlevler üzerinden bir tasarım bekliyoruz.
python ile sözde/çalışır kodlarıyla başlamanız çözümünüzü hızlandıracaktır. daha önce verdiğimiz kural1
ve kural2
için şöylesi bir yardımcı işlev işleri oldukça kolaylaştıracaktır: kelime2bin(kelime)
bu işlev kelime
dizgisini alacak ve tüm ünlüleri 1
ve ünsüzleri de 0
değiştirerek döndürecek.
Örnek:
>>> kelime2bin("karaosmanoglu")
'0101100101001'
>>> kelime2bin("ankara")
'100101'
bundan sonrasında kural1
için iki ünlü arasında bir ünsüz arama 1/0
dan oluşan ardışıllıkta 101
paternini aramaya sadeleşecek.
kural2
ise bir ünlüden sonra iki veya daha fazla sayıda ünsüz, önceki haftalarda konuştuğumuz düzenli ifade diliyle pythoncasıyla
>>> import re
>>> kb = kelime2bin("karaosmanoglu")
>>> m = re.search("1+0{2,}", kb)
burada m
eğer None
ise böyle bir patern bulunamadı, diğer durumlarda paternin başına-m.start()
ve sonuna-m.end()
ile erişmek mümkündür
>>> m == None
False
>>> kelime[m.start():m.end()]
'aosm'
ana programiniz her bir kuraldan gelen indis değerlerini yorumlarken şunlara dikkat etmelidir
kural1
ve kural2
nin -1
üretmesi ne anlama gelir? tire konulacak mı?kural1
veya kural2
, -1
değeri üretiyorsa ne anlama gelir? hangi kuralla belirtilen yere tire konulacak?kural1
ve kural2
, -1
den farklı değer üretiyorsa, hangi konuma tire konulacak?
Soru
verilen kelimeyi hecelere ayıran işlevi gerçekleyin.
Kurallar
TDK sözlüğü kuralları şöyle belirlemiş,
Kural - 1: Türkçede kelime içinde iki ünlü arasındaki ünsüz, kendinden sonraki ünlüyle hece kurar: a-ra-ba, bi-çi-mi-ne, in-sa-nın, ka-ra-ca, alt-lık, al-dı.
Kural - 2: Kelime içinde yan yana gelen ünsüzlerden sonuncusu kendisinden sonraki ünlüyle, diğerleri kendilerinden önceki ünlüyle hece kurar: bir-lik, sev-mek, Türk-çe, Kork-maz.
Batı kökenli kelimeler, Türkçenin hece yapısına göre hecelere ayrılır: band-rol, kont-rol, port-re, prog-ram, sant-ral, sürp-riz, tund-ra, volf-ram.
Türkçede satır sonunda kelimeler bölünebilir, fakat heceler bölünemez. Satıra sığmayan kelimeler bölünürken satır sonuna kısa çizgi (-) konur.
Kullanım