CEYD ile Doğal Dil İşlemeye Giriş
CEYD-A’ yı geliştirmek için kullanılan CEYD platformu, cihaz üzerinde yorumlanıp çalışan yapısal ve sıralı programlama geliştirme ortamıdır.
CEYD kodları komutlar içine yazılır. Bu yazımızda Doğal Dil İşleme (NLP) çalışmalarında kullanabileceğiniz kod örneklerine giriş yapacağız.
CEYD platformu kendi bünyesindeki algoritmaları yeniden kod geliştirmek isteyen geliştiricilerin kendi kodlarında yararlanabilmesi için komutlar halinde sunmaktadır. CEYD-A’nın neredeyse tamamı CEYD yapısındaki bu komutlar ile geliştirilmektedir. Yapının geçersiz kılma (override) özelliği ile komutlar, geliştiriciler tarafından kendi cihazları üzerinde kullanılmak üzere tekrardan yazılabilir.
CEYD üzerinde geliştirme yapmak için önceki yazılara buradan ulaşabilirsiniz. Yukarıdaki görsellerde çıktıları gösterilen cmdtokenize komutunun kodu aşağıdaki gibidir. CEYD kodlarının daha iyi anlaşılabilmesi için cümle kelimelere bölünmüş ve her kelime için ayrı işlemlerin yapılışı döngü içinde gösterilmiştir. Gerekirse yöntem değiştirilerek kelime yerine cümle bazlı daha performanslı komutlar da yazılabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SORU: cmdtokenize SABLON: cmdtokenize ({HER}) CEVAP: {!SET cumle={HER}!} {!RET cmdsplit ,dizi,$cumle!} {!SET $size={!GET staArraySize!}!} {!FOR $i=0,$size {!SET $kelime={!GET $dizi[{!GET $i!}]!}!} <b>{!GET $kelime!}</b>: {!RET cmdgetlemma {!GET $kelime!}!} ({!RET cmdgetspeechtag {!GET $kelime!}!}) :<br> <font color=red>{!RET cmdgetfamily {!GET $kelime!}!}</font><br> <br> {!SET $i+=1!} !} |
Yukarıda kullanılan örnekteki Doğal Dil İşleme komutlarını ayrı arı denediğimizde aşağıdaki sonuçları elde edebiliriz:
Doğal Dil işleme komutlarını gerçekleştirirken Zemberek kütüphanesinden ve CEYD yapısının kendi oluşturduğu modüllerden yararlanılmıştır.
Komutların söz dizimleri şu şekildedir:
cmdsplit AYIRAÇ KARAKTERİ,OLUŞACAK DİZİ İSMİ,CÜMLE
Verilen cümleyi içinde ayıraç karakteri geçen yerlerden bölerek dizi haline getirir.
cmdgetlemma KELİME
Lemmatization kelimenin morfolojik analizini dikkate alarak kelimenin kök kısmını tespit eder.
cmdgetspeechtag KELİME
Kelimenin dilbilgisi açısından türü (Part Of Speech) tespit edilir.
cmdgetfamily KELİME
Kelimenin anlamsal olarak sözlükte geçen kategorilerini döndürür.
Diğer Doğal Dil İşleme komutlarından bazılarını ise şu şekilde sıralayabiliriz:
cmdspellcheck KELİME
Kelime veya cümlede geçen küçük imla hatalarını düzeltmeye çalışır.
isverb KELİME
isadjective KELİME
isfood KELİME
getrelation KELİME,KELİME
Kelimenin anlamsal olarak hangi türe ait olduğunu döner.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SORU: istiyorum SABLON: ({BAŞ}) istiyorum{HER} CEVAP: {!SET $kelimecinsi={!RET getrelation {BAŞ},all!}!} {!SET $fiil={!RET isverb {BAŞ}!}!} {!IF $kelimecinsi==yemek@@$kelimecinsi==yiyecek??{!RET2 en yakın restoran!}<center>Sanırım {BAŞ} bulabileceğin bir yer buldum</center><br>{!RET {BAŞ} resmi göster!}<br><small><mute>YOL TARİFİ derseniz tarif edebilirim</mute></small> ::{!IF $kelimecinsi==tatlı??{!RET2 en yakın kafe!}<center>Sanırım {BAŞ} bulabileceğin bir yer buldum</center><br>{!RET {BAŞ} resmi göster!}<br><small><mute>YOL TARİFİ derseniz tarif edebilirim</mute></small> ::{!IF $kelimecinsi==meyve@@$kelimecinsi==sebze??<center>Sanırım {BAŞ} bulabileceğin bir market buldum</center><br>{!RET {BAŞ} resmi göster!}{!RET2 en yakın market!}<br><small><mute>YOL TARİFİ derseniz tarif edebilirim</mute></small> ::{!IF $kelimecinsi==alkollü??<center>Sanırım {BAŞ} içebileceğin bir yer buldum. Sarhoş olma sakın.</center><br>{!RET {BAŞ} resmi göster!}{!RET2 en yakın bar!}<br><small><mute>YOL TARİFİ derseniz tarif edebilirim</mute></small> ::{!IF $kelimecinsi==içecek??<center>Sanırım {BAŞ} içebileceğin bir yer buldum</center><br>{!RET {BAŞ} resmi göster!}{!RET2 en yakın kafe!}<br><small><mute>YOL TARİFİ derseniz tarif edebilirim</mute></small> ::{!IF $kelimecinsi==çiçek??<center>Sanırım {BAŞ} bulabileceğin bir yer buldum. Sevilmek ne güzel. Çiçek ne güzel.</center><br>{!RET {BAŞ} resmi göster!}{!RET2 en yakın çiçekçi!}<br><small><mute>YOL TARİFİ derseniz tarif edebilirim</mute></small> ::{!IF $fiil==1??{BAŞ} istiyor gibisin bir fiil olarak algılıyorum bunu ::{!IF {BAŞ}==seni??Ben zaten seninim ::!}!}!}!}!}!}!}!} ÖRNEK: (YİYECEK/İÇECEK/ÇİÇEK İSMİ) istiyorum |
cmdanalyzeword KELİME
CEYD yapısında asistan kişilik özelliklerine sahip olabilir. Bu komut ile KELİME ile gösterilen özelliğin asistanda olup olmadığı tespit edilir. Eğer mevcut ise 1 değerini döner.
1 2 3 4 5 6 7 8 |
SORU: misin,3.63|mısın,3.63|müsüz,3.63|musuz,3.63 SABLON: ({HER} )?({KELİME1}) (misin|mısın|müsün|musun){HER} CEVAP: {!SET $aw={!RET cmdanalyseword {KELİME1}!}!} {!SET err2={!RET haserror $aw!}!} {!IF $err2??::{!GET $aw!}!} |
cmdfetchpersonfromstring CÜMLE
Cümlenin içinde geçen kişi ismi tespit edilir ve bu değer döndürülür. Bu yöntemle tüm cümlenin ana komut kelimesi öncesinde geçen bölgesinde isim tespiti yapılabilir. Örneğin ana komut kelime(ler)i isminin anlamı olsun. Öncesinde geçen bana lütfen zeynep cümle olarak atanırsa, içindeki Zeynep tespit edilip karışık cümlelerin daha rahat çözümlenmesi sağlanır.
1 2 3 4 5 6 7 8 9 10 11 12 |
SORU: isminin anlamı SABLON: ({BAŞ}) isminin anlamı{HER} CEVAP: {!SET isim={!RET strlowercase {!RET cmdfetchpersonfromstring {BAŞ}!}!}!} {!SET icerik={!RET cmdloadurl https://www.ismininanlaminiara.com/AramaSonuclari?q={!GET isim!}!}!} {!SET ret={!RET cmdfetchtagtext blockquote,$icerik!}!} {!IF $ret==??bulamadım:: {!GET ret!} <br><mute><small>Kaynak: https://www.ismininanlaminiara.com/</small></mute> !} |
cmdfetchlocationfromstring CÜMLE
Aynı şekilde, cümlenin içinde geçen yer ismi tespit edilir ve bu değer döndürülür. Yer ismi Türkiye’deki tüm şehir, ilçe, kasaba, köy ve mahalleleri içermektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
SORU: hava% SABLON: {EDAT}({BAŞ}){DE EKİ}{NİN EKİ} (hava ){BAŞ}(nasıl|durumu|sıcak|soğuk|serin|ılık|karlı|fırtına){HER} CEVAP: {!IF $angry==true??Benim havam mı kaldı söyleyecek ? Bana <b>{!GET $angryreasonstring!}</b> dediğini unutmadım. O kadar laftan sonra özür diler misin benden ?{!RET makeemotion sad!}:: {!SET location={!RET cmdfetchlocationfromstring {BAŞ}!}!} {!SET ignored={!RET {!GET location!} $2 $3 cweather!}!} {!GET staWeatherName!} için {!GET staWeatherDescription!}.$2 sıcaklığı en yüksek {!RET cmdfetchnumbers 0,{!GET $staWeatherTempMax!}!}, en düşük {!RET cmdfetchnumbers 0,{!GET staWeatherTempMin!}!} derece olacak. {!IF $staWeatherCloud>0??Bulut oranı yüzde {!GET staWeatherCloud!} seviyelerinde.::!} {!IF $staWeatherRain>0??Yağmur bekleniyor. 3 saatte m2 ye düşecek yağmur miktarı {!GET staWeatherRain!} mm seviyesinde olabilir.::!} {!IF $staWeatherSnow>0??Kar bekleniyor. 3 saatte m2 ye düşecek kar miktarı {!GET staWeatherSnow!} mm seviyesinde olabilir.::!} {!IF $staWeatherPressure>0??Basınç değerinin {!RET cmdfetchnumbers 0,{!GET staWeatherPressure!}!} hPa,::!} {!IF $staWeatherSpeed>0??Rüzgar şiddetinin ise saniyede {!GET staWeatherCloud!} metre olması bekleniyor.::!} {!IF $staWeatherMorn>0??Sabah saatlerinde $2 sıcaklığı {!RET cmdfetchnumbers 0,{!GET staWeatherMorn!}!} derece,::!} {!IF $staWeatherEve>0??Akşam $2 sıcaklığı {!RET cmdfetchnumbers 0,{!GET staWeatherEve!}!} derece,::!} {!IF $staWeatherNight>0??Gece ise $2 sıcaklığı {!RET cmdfetchnumbers 0,{!GET staWeatherNight!}!} derece olacağı tahmin ediliyor.::!} {!IF $staWeatherHumidity>0??Nem oranı yüzde {!RET cmdfetchnumbers 0,{!GET staWeatherHumidity!}!} olarak belirtilirken, hissedilen derece ise {!RET cmdfetchnumbers 0,{!GET staWeatherFeel!}!} derece olacağı öngörülüyor.::!} <br>Hava nasıl olursa olsun sizin havanız güzel olsun. {!SET staAction=$2 $3!} <br><br><mute><small>Openweather.com sitesinden aldığım bilgileri değerlendirdim.</small></mute> {!IF $APPVERS<6.1.9.9?? Bu özellik için CEYD-A yı ücretsiz olarak Google Play üzerinden güncellemenizi tavsiye ederim.<br> ::!} !} |
staTopic, staAction, staMainTopic
CEYD yapısında yazım düzeni olarak genel amaçlı kullanılan değişkenlerin ismi sta ile başlar. Bu değişkenler hem kod içinde kullanıcı tarafından hem de oluşan ortama göre kendiliğinden değişebilir. staTopic, yapılan konuşmalarda cümleden alınan konuyu ifade eden kelimedir. Sonraki konuşmalarda eğer özne bulunmayan bir cümle yapısı görülürse staTopic değişkenin içeriği otomatik olarak konu olarak ele alınır ve cümle tamamlanır.
Aşağıdaki örnekte, öncesinde bahsi geçen bir yer ile ilgili BURADAN UZAKLIĞI NE KADAR diye sorulduğunda staTopic değerinin ele alındığını görüyoruz. cremainingdistance (YER İSMİ) komutu mevcut yer ile yer ismi arasındaki km cinsinden mesafeyi dönmektedir.
1 2 3 4 5 6 7 8 9 10 |
SORU: buradan,1.01|mesafe%,2.01|kalan mesafe%,4.01|ne kadar uzak%,5.01|uzaklığı,2.01|kaç kilometre,5.01|km%,0.1|uzaklık,2.01| SABLON: (buradan)*({BAŞ}) (uzaklı|mesafe|kalan mesafe|ne kadar|kaç|arası){HER}|cremainingdistance ({HER}) CEVAP: {!IF {BAŞ}!=??{!RET cremainingdistance {BAŞ}!} :: {!RET cmdshowtopicwarning!} {!SET distance={!RET cremainingdistance {!GET staTopic!}!}!}{!IF $distance>0??{!GET distance!} km::!} !} |
Aynı şekilde staAction değişkeni, eylemin olmadığı cümlelerde kullanılmak üzere bir önceki konuşmalardaki eylem olarak ele alınır.
staMainTopic ise ana konuyu belirler. Örneğin konu elma ise, ana konu otomatik olarak meyveler olur.
Bonus komutlar:
cmdspell CÜMLE
Verilen cümle Türkçe dil kurallarına uygun olarak hecelerine ayrılır.
1 2 3 4 5 |
SORU: heceleyerek oku% SABLON: ({BAŞ}) heceleyerek oku{HER} CEVAP: {!RET cmdspell {!RET {BAŞ}!} !} |
Kuş dili; her sesli harften sonra “g, c” gibi bir sessiz harfler eklenerek yapılır. Eklemeli bir dil olarak bilinir ve bazı harfler eklenerek gerçekleştirilir. Şifreli konuşmak isteyenlerin daha çok uyguladığı bir yöntemdir.
İlerleyen yazılarda Doğal Dil İşleme ile ilgili konulara değinileceği gibi yapının içerdiği Derin Öğrenme metodlarına da değineceğiz.