19ceng / ceng201pro

programlama-II
18 stars 6 forks source link

heceleme - tireleme #13

Open seyyah opened 13 years ago

seyyah commented 13 years ago

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üne­mez. Satıra sığmayan kelimeler bölünürken satır sonuna kısa çizgi (-) konur.

Kullanım

 girdi: cumhurbaskani
 cikti: cum - hur - bas - ka - ni

 girdi: krampon
 cikti: kram - pon

 girdi: ilkokul
 cikti: il - ko - kul

 girdi: karaosmanoglu
 cikti: ka - ra - os - ma - nog - lu
seyyah commented 13 years ago
egurbuz commented 13 years ago

Maalesef 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.

seyyah commented 13 years ago

@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.

seyyah commented 13 years ago

@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.

egurbuz commented 13 years ago

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ı)

Kelime Grupları

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.).

emineker commented 13 years ago

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

seyyah commented 13 years ago

yazdığın kodlar çalışıyor fakat istediğimiz formda değil. yukarıda verdiğimiz işlevler üzerinden bir tasarım bekliyoruz.

seyyah commented 13 years ago

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'
seyyah commented 13 years ago

ana programiniz her bir kuraldan gelen indis değerlerini yorumlarken şunlara dikkat etmelidir