Türkçe Metinler İçin Ulama Bulma Uygulaması
Doğal Dil İşleme çalışmalarım kapsamında yaptığım Türkçe yardımcı araçlarında biride Türkçe metinlerdeki ulama bulma algoritmasıdır. Daha önce Doğal Dil İşleme ve Cümle Sonu Belirleme konularındaki yazılarımı da okumanızı tavsiye ederim. Bu algoritmalar sayesinde bilgisayarın Türkçeyi anlamasını sağlamaya çalışmaktayım.
Ulama Nedir?
Bir cümlede ünsüzle biten bir sözcükten sonra ünlüyle başlayan bir sözcük gelirse (konuşma dilinde) birinci sözcüğün ünlüsü, ikinci sözcüğün ünlüsüyle bitiştirilerek söylenir. Buna ulama denir. Bunun nedeni ünlünün çekim gücüdür.
· Ulama bir söyleyiş güzelliği ve akıcılığı yaratır. Bu uygulama yazı diline geçmez.
· Ulama aruz ölçüsünde kapalı bir heceyi kısa hece yapmaya yarar.
· Bileşik sözcüklerin oluşumunda ulama varsa sözcük hecelerine ayrılırken bu ilke gözetilir.
Örnekler :
Bir ay önce gelen adamın adı neydi ?
Bu cümle konuşma dilinde:
Birayönce gelenadamınadı neydi ?
Beklenenolay sonunda patlak verdi.
Evimizinarkasında bodurağaçlar vardı.
Bahçemizde çeşitli ağaçlar ve hanımelleri vardı.
Bu cümledeki “hanımeli” sözcüğü de ulama özelliğine sahip bir bileşik sözcüktür. “Hanım + eli” Bu nedenle hecelerine ayrılırken bu özellik dikkate alınır : ha – nı – me – li.
Aslanağzı ® as – la – nağ – zı (Aslan + ağzı)
Kırklareli ® Kırk – la – re – li (Kırklar + eli)
Ulama Bulma Algoritması
Türkçe metinlerdeki ulama olaylarının bulunması için aşağıdaki adımlar takip edilmiştir.
- Program içindeki metin giriş alanını kontrol et.
- Eğer metin alanı boş ise Adım 13’e git
- Metin alanındaki yazıyı boşluk karakterine göre parçalara ayır
- Her boşluğun solundaki ilk karakterin sessiz harf olup olmadığını kontrol et
- Her boşluğun sağındaki ilk karakterin sesli harf olup olmadığını kontrol et
- Eğer şartlar tutuyorsa boşluğun solundaki ilk boşluğa kadar olan harf dizisini ve sağındaki ilk boşluğa kadar olan harf dizisini bir diziye ata
- Dizi içindeki tüm karakter dizileri sayısınca döngü oluştur
- Dizi içindeki karakter dizileri program içindeki metin alanında varsa onları yeni bir dizi içine ata
- Yeni dizi içindeki eleman sayısınca döngü oluştur.
- Yeni dizi içindeki karakter dizilerini metin alanı içinde bul
- Bulunan Karakter Dizilerini listeye ekle
- Bulunan karakter dizilerinin metin alanı içinde rengini ve font özelliklerini değiştir.
- Dizi sona ulaşmadıysa 7. Adıma Git
- Fonksiyonu bitir.
Ulama bulma fonksiyonumuz %100 çalışmaktadır. Türkçe bir metin içerisindeki tüm ulama olaylarını başarıyla bulup, metin içinde renklendirme yapabilmektedir. Çıktı ekranına ulama olan kelimeleri listeleyebilmekte ve istenirse çıktı ekranının kaydedilmesi başarıyla gerçekleşmektedir
Örnek metin
Bilge sorar: ” Geceyle gündüzü nasıl ayırırsınız? ” Öğrencilerden biri, ” Uzaktan koyunu keçiden ayıramadığım zaman akşam olmuş demektir.” Başkası, ”İncir ağacını, zeytin ağacından ayırdığım zaman sabah başlamıştır. ”Bilgeye kendisinin ne düşündüğünü sormuşlar. O da şunu demiş: ” Yürürken karşıma bir kadın çıktığında, güzel mi, çirkin mi, siyah mı, beyaz mı, diye ayırmadan, ona kız kardeşim diyebildiğimde ve yine yürürken yoluma çıkan erkeği, yoksul mu, zengin mi diye bakmadan, milletine, ırkına, dinine aldırmadan kardeşim sayabildiğimde anlarım ki sabah olmuştur, aydınlık başlamıştır.
Regex kullanarak geliştirdiğim ulama Bulma fonksiyonu ise şu şekilde:
public MatchCollection ulamaBul(string metin) { string smetin = metin; Regex _sentenseRegex = new Regex(@"(?<=['""bcçdfgğhjkmlnprsştvyz])\s+(?=[aeıiuüoö])", RegexOptions.Compiled); string ulamali = _sentenseRegex.Replace(smetin,"<---->"); string pattern = @"(?<=[bcçdfgğhjkmlnprsştvyz]{1,})\s+(?=[aeıioöuü]{1,})"; MatchCollection matches = Regex.Matches(ulamali, pattern); /* for (int i = 0; i < matches.Count; i++) { Console.WriteLine("before:" + matches[i].Groups["before"].ToString()); Console.WriteLine("after:" + matches[i].Groups["after"].ToString()); }*/ return matches; }