TÜRKÇE METİNLERDE CÜMLE SONU BULMA UYGULAMASI

1 760

Birçok doğal dil isleme işlemlerinde, cümle sonu belirleme işi ilk şarttır. Kullanılabilen doğal dil isleme araçlarının çoğu cümle sonu belirleme isini güvenilir olarak yapmaz. (Doğal Dil İşleme Nedir? Konulu yazımızı okumanızı tavsiye ederim.

 Cümle sonu işaretlerinin (“.”, “!” gibi) kullanılarak cümle sonunun belirlenmesi mümkündür. Ancak bazı işaretler kısaltmalar ve bunun gibi bazı işaretleri (eposta adresleri, numaralandırma gibi) göstermek için de kullanılabilir. Aşağıda bazı örnekler görülmektedir: 

• Cumartesi aksam 5 p.m.’de geldi. 

• www.cs.deu.edu.tr okulumuzun web sitesidir. 

• E-posta adresi bilgi@cs.deu.edu.tr ‘dir.

Bunlar cümle sonu bulma işlemlerinde karmaşa yaratan bazı durumlardır. Tüm diğer dillerde de bu gibi durumlar mevcuttur ve cümle sonu belirleme işlemlerini zorlaştırmaktadır. Bu projemizde Türkçe için cümle sonu belirme işlemini doğru şekilde yapabilecek yeni bir algoritma geliştirilmiştir. 

Projemiz ile Türkçe Doğal dilinin bilgisayar ortamında tarafından daha iyi anlaşılıp analiz edilmesini sağlamak amacıyla farklı fonksiyonlar geliştirdik.

Türkçe Metinlerde Cümle Sonu Belirleme Uygulaması

Bir derlemi oluşturmanın ilk basamağı “cümleleri bulmak” tır. Genel olarak Türkçe cümlelerin  ., …, !, ? gibi işaretlerle bittiği bilinse de cümle sonu bulma işlemi bazı belirsizlikler sebebiyle çok karışık ve zor bir işlem haline gelmektedir. Örneğin;

• Uluslar, bu ekonomik buhran sonucunda 2. Dünya Savaşı’nı yasamıştır.

• Bu sezon kaybedilen maç sayısı 2. Dünya Kupası’na katılma sansı azalıyor.

İlk cümlede “.” karakteri sıralama için kullanılırken ikinci cümlede cümle sonunu belirtmektedir. Ancak her iki cümlede de “.” işaretinden sonra büyük harf bulunmaktadır.

Yeni geliştirilen cümle sonu bulma yönteminde bu belirsizliklerin çözülebilmesi için kural tabanlı bir yaklaşım denenmiştir.

Cümle sonu belirleme için oluşturulan kural listesi aşağıdaki gibidir.

Tablo 1 Cümle sonu belirleme için oluşturulan kural listesi

Cümle Sonu Kurallar
Dogru L. U
Dogru L. #
Dogru L. ‘
Dogru L. “
Dogru L. [
Dogru L. (
Dogru L. +
Dogru L. –
Yanlış U. U
Yanlış #. U
Yanlış L. L
Yanlış ?.? (Noktadan Sonra Boşluk yok)
Yanlış #. #
Yanlış ?. ”
Yanlış #. ,
Yanlış #. )
Yanlış #. ]

Tablo 2 Kural listesindeki işaretlerin anlamları

Karakter Anlamı
. Cümle sonu isaretleri (. … ! ? )
L Küçük harf (Lowercase)
U Büyük harf (Uppercase)
# Sayı
? Herhangi karakter (ne olursa olsun)
, ,
( (
) )
/ /
   

Cümle sonu kural listesi Tablo 1’de gösterildiği gibi üçlü grup seklinde (“L.L” gibi) oluşturulmuştur.

Ortadaki “.” (nokta) karakteri cümle sonu işaretini (“.”,”!”,”?”,”…”,”:”) göstermektedir. Sol taraftaki karakter noktalama işaretinden önceki kelimenin ilk karakterinin durumunu, sağ taraftaki karakter ise işaretten sonraki kelimenin ilk harfinin durumunu göstermektedir. Tablo 2’de kural listesindeki işaretlerin anlamları gösterilmiştir.

Bu kurallar oluşturulurken Türkçe dilinin özelliklerinden kaynaklanan zorluklar ortaya çıkmıştır ve çözümlenmeye çalışılmıştır.

Aşağıda Türkçe cümlelerin sonlarının bulunması sırasında belirsizlik yaratan bazı durumlar örneklendirilmiştir:

• Cumhuriyetimizin 75. yılı coşkuyla kutlandı.

• Tahta çıkan IV. Murat emirler yağdırdı.

• Olimpiyatlar için uzun zamandır çalışan

Ahmet koşuda 2., uzun atlamada ise ancak 4. olabildi.

• A. Mehmet YILDIZ size uğradı.

• Alfabenin ilk harfi A. Mehmet’e bunu öğretmeniz gerekiyor.

İlk cümlede “.” işaretinden sonra cümle bitmemektedir. “.” işareti sıralama belirmek amacıyla kullanılmıştır. Dördüncü cümlede “A” harfi kısaltma olarak kullanılmış, bir sonraki cümlede ise tek basına bir kelime olarak kullanılmıştır.

Bunun gibi, cümlelerde belirsizlik yaratan kısaltmalar için Şekil 1’te görülebileceği gibi kısaltmaların yer aldığı bir dizi oluşturulmuştur.

public string[] _kisaltmalar = new string[]
            {
"age.",
"agm.",
"agy.",
"Alb.",
"Alm.",
"anat."};

                        Şekil 1 Kısaltma Dizisi

Bu dizi kullanılarak yazılar cümlelere daha verimli biçimde ayrılabilmektedir. Ayrılan cümleler yine metin dosyaları biçiminde dosyalara kaydedebilmektedir.

Tüm bu işlemleri tek bir Regex kod satırı kullanarak yaptım. (Regex ile ilgili yazımızı okumanızı tavsiye ederim.)

static Regex _sentenseRegex = new Regex(@"(?<=['""a-zıüöşğç\""\]\)][\!\?\:\.\…\n\r\n\t]{1,3})\s+(?=[""A-ZİÜÖŞĞÇ0-9\(\-\(\''\‘\““\""\[\+])", RegexOptions.Compiled);

Çok uzun uğraşlar sonucunda üstte yer alan tüm kuralları içeren bu Regex cümlesini kullanarak oldukça verimli bir Türkçe Cümle Sonu bulma uygulaması geliştirebilirsiniz.

Kısaltmaları içeren C# sınıfımız ise alttaki gibidir. (Türkçe Kısaltma Listesi)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Türk_Cümle_PARSER.Sınıflar
{
    class kisaltmaListesi
    {
        public string[] _kisaltmalar = new string[]
            {
"age.",
"agm.",
"agy.",
"Alb.",
"Alm.",
"anat.",
"ant.",
"Apt.",
"Ar.",
"ark.",
"Arş.","Gör.",
"As.",
"As.","İz.",
"Asb.",
"astr.",
"astrol.",
"Atğm.",
"atm.",
"Av.",
"bağ.",
"Bçvş.",
"bit.","b.",
"biy.",
"bk.",
"bl.",
"Bl.",
"Bn.",
"Bnb.",
"bot.",
"Böl.",
"bs.",
"Bşk.",
"Bul.",
"Bulg.",
"Cad.",
"coğ.",
"Cum.","Bşk.",
"çev.",
"Çvş.",
"db.",
"dil","b.",
"dk.",
"Doç.",
"doğ.",
"Dr.",
"drl.",
"Dz.","Kuv.",
"Dz.","Kuv.","K.",
"dzl.",
"Ecz.",
"ed.",
"e.",
"ekon.",
"Ens.",
"Erm.",
"f.",
"Fak.",
"Far.",
"fel.",
"fil.",
"fiz.",
"fizy.",
"Fr.",
"Gen.",
"geom.",
"gn.",
"Gnkur.",
"Gön.",
"gr.",
"hay.","b.",
"haz.",
"hek.",
"hlk.",
"Hs.","Uzm.",
"huk.",
"Hv.","Kuv.",
"Hv.","Kuv.","K.",
"Hz.","öz.",
"Hz.",
"İbr.",
"İng.",
"is.",
"İsp.",
"işl.",
"İt.",
"Jap.",
"jeol.",
"kim.",
"koor.",
"Kor.",
"Kora.",
"Korg.",
"kr.",
"krş.",
"Kur.",
"Kur.","Bşk.",
"Lat.",
"Ltd.",
"Mac.",
"Mah.",
"man.",
"mat.",
"Md.",
"mec.",
"mim.",
"min.",
"Müh.",
"Mür.",
"müz.",
"No.",
"Nö.",
"Nö.","Sb.",
"Okt.",
"Onb.",
"Opr.",
"Or.",
"Ora.",
"Ord.",
"Org.",
"Ort.",
"Osm.","T.",
"öl.",
"ör.",
"öz.",
"ped.",
"Port.",
"Prof.",
"psikol.",
"Rum.",
"Rus.",
"s.",
"sa.",
"Sb.",
"SEFD","Bşk.",
"sf.",
"Sl.",
"Sn.",
"snt.",
"Sok.",
"sos.",
"sp.",
"Srp.",
"Şb.",
"T.",
"T.C.",
"tar.",
"Tb.",
"tek.",
"tel.",
"telg.",
"Tğm.",
"tic.",
"tiy.",
"tlks.",
"tls.",
"Top.",
"Tug.",
"Tuğa.",
"Tuğg.",
"Tüm.",
"Tüma.",
"Tümg.",
"Uzm.",
"Üçvş.",
"ünl.",
"Ütğm.",
"vb.",
"vd.",
"Vet.",
"vs.",
"Y.","Mim.",
"Y.","Müh.",
"Yay.",
"Yb.",
"Yd.","Sb.",
"Yrd.",
"Yrd.","Doç.",
"Yun.",
"yy.",
"Yzb.",
"zf.",
"zm.",
"zool.",
"St.",//Sonradan Tespit Edilip Eklenen kısaltmalar
"Sh.","Yd.","İnş.","Tic.", "Bkz.","Tur.","İşl","San.","Yat.","İst."};



    }
}
1 yorum
  1. Halil diyor

    Pythonda cümle sonu belirleme işlemi için şöyle bir kod yazdım.
    import re

    txt = “Cumhuriyetimizin 75. yılı coşkuyla kutlandı. Tahta çıkan IV. Murat emirler yağdırdı. Olimpiyatlar için uzun zamandır çalışan Ahmet koşuda 2., uzun atlamada ise ancak 4. olabildi. A. Mehmet YILDIZ size uğradı. Alfabenin ilk harfi A. Mehmet’e bunu öğretmeniz gerekiyor.”

    sentence = re.compile(“””(?<=['""a-zıüöşğç\""\]\)][\!\?\:\.\…\n\r\n\t])\s+(?=[""A-ZİÜÖŞĞÇ0-9\(\-\(\''\‘\““\""\[\+])""")

    sent = re.split(sentence,txt)
    for s in sent:
    print(s)

    Sonuç:
    Cumhuriyetimizin 75. yılı coşkuyla kutlandı.
    Tahta çıkan IV. Murat emirler yağdırdı.
    Olimpiyatlar için uzun zamandır çalışan Ahmet koşuda 2., uzun atlamada ise ancak 4. olabildi.
    A. Mehmet YILDIZ size uğradı.
    Alfabenin ilk harfi A. Mehmet’e bunu öğretmeniz gerekiyor.

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bununla iyi olduğunuzu varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul etmek Mesajları Oku