CEYD Dili Nedir?

Cenker Sisman
Deep Learning Türkiye
6 min readFeb 11, 2019

CEYD dili (CEnker.com Yapay Zeka Dili), sohbet robotu ile karşılıklı konuşma esnasında verilen sesli soruların tanımlanmasını ve bu komutlara robotun nasıl cevap vermesi gerektiğini belirleyen bir script dilidir.
Bu script dilini kullanıcılar web üzerinde, Android telefon ve tabletlerde çalışan CEYD-A uygulaması içinde veya web servis API’lerini kullanarak diğer platformlarda kullanıp uygulayabilirler.
CEYD dili fonksiyonları cevapların içine yazılır, robotun soruya karşılık nasıl bir cevap vermesi gerektiğini belirler.

Komutlar kullanıcılar tarafından oluşturulduğu için beyin hücreleri gibidir. Halihazırda 300 bin komut oluşturulmuştur ve bu hücreler birbirleriyle etkileşim içine girebildikleri için makine öğrenmesine yatkın bir yapıdadır.

Görsel Kaynak

KOMUT nedir?

Bir komutu, robota sorulan soruyu ve cevabı tanımlayan adımlar zinciri olarak tanımlayabiliriz. Komut, CEYD-A uygulamasının soru cevap yapısını belirleyen tanımdır. Komutlar, hem
CEYD-A içerisinde Menü->Hesaplar->CEYD-A
ile hem de web üzerinde http://ceyd-a.net/komutekle adresinden kullanıcıya özgü tanımlanabilir. Bu tanımlar kullanıcı cihazlarından otomatik olarak algılanır ve yüklenir.
Komut tanımlama işlemi, aşağıda bahsi geçen 4 ana adım ile yapılmaktadır.

SORU KELİMELERİ

http://ceyd-a.net/komutekle sayfasından komut ekleme

Söyleyeceğiniz cümle içinde bu kelime veya kelimelerden biri geçiyorsa komut devreye girer. Amacı bir bakıma kelimeleri indekslemektir.
Soru kelimelerini seçerken, söyleyeceğiniz cümlenin içinde muhakkak kullanılacak kelime veya kelime öbeklerini seçmeniz önerilir. Kelimenin yanına yazılacak öncelik değeri ile komutların çağırma önceliği belirlenebilir. Bu şekilde alternatif imkanlar sunulabilir.
Soru kelimelerine örnek:

okuyor musun
okul*

Bu örnekte söylediğimiz cümlenin içinde okuyor musun veya içinde okul geçen bir kelime olmalı. Başka deyişle, okula gidiyor musun dediğimizde içinde okul geçtiği için bu komutu kapsamaktadır. Okul kelimesinin sonundaki * işareti devamında başka bir ek gelebilir anlamındadır. okula,okuldan,okulu gibi kelimeleri içerir. Eğer * işareti eklemeden okul deseydik okula gidiyor musun bu komut için devreye girmeyecek ama okul eğitim yuvasıdır dediğimizde devreye girecekti. O sebeple * işareti kelimenin çeşitliliğini arttıran bir simgedir
Eğer aynı soru kelimeleri başka komut tanımlarında da mevcut ise, hangi komutun devreye gireceğini soru şablonu ve öncelikler belirler.

SORU ŞABLONU

Robota sorulabilecek sorunun cümle şablonu tanıtılır. Burada regex yapısı kullanılabilir. Ayrıca kolaylaştırmak için CEYD dilinin sunduğu ilave ifadelerde kullanılabilir veya boş bırakılabilir. Boş bırakılırsa her şablona uygun anlamına gelir. Kullanılması daha zengin komutlar oluşturulması için idealdir.
Regex tanımlarına ek olarak,
{BAŞ}
.*? regex ifadesi ile eşdeğerdir. Herhangi bir söz dizimidir. Olabilir veya olmayabilir. Cümlenin başında sizin konuya odaklanmayacağınız kelimeleri ifade eder.
({HER1})
(.*?) ile eşdeğerdir. Herhangi bir söz dizimi olabilir veya olmayabilir ve bu söz dizimi cevapta kullanılmak üzere parametre olarak belirlenir. HER1 gibi HER2 de tanımlanabilir.
({SAYI1})
(\d*) ile eşdeğerdir. Parametre olarak bir sayı belirlenir. SAYI1 gibi SAYI2 de tanımlanabilir.
({KELİME1})
(\w*) ile eşdeğerdir. Parametre olarak bir kelime belirlenir. KELİME1 gibi KELİME2 de tanımlanabilir.
{SON} Cümle sonunda, ana kelimelerden sonra bu ifadenin kullanılması doğru olacaktır. Cümlenin sonunda sizin konuya odaklanmayacağınız kelimeleri ifade eder. Genelde şablon cümlesinde en önde {BAŞ} son kısımda {SON} kullanılmalıdır.

.* herhangi bir söz dizimi anlamındadır. Regex’in diğer tüm yazılım formatı burada desteklenmektedir.
Örnek:
{BAŞ}({KELİME1}){NİN EKİ} maçı{SON}
şablonu CEYD-A, FENERBAHÇENİN MAÇI NE ZAMAN? cümlesi ile örtüşmektedir.

Başka bir örnek olarak aşağıdaki ifade soru şablonuna girildiğinde,

({SAYI1}) ile ({SAYI2}) topla.*

eğer sorunuz 4 ile 3 topla ise, 4 ve 3 parametreler olarak algılanır ve bu parametreler {SAYI1} ve {SAYI2} olarak cevap şablonunda kullanılabilir. Örneğin cevap şablonu da şu şekilde olsun:

{SAYI1} ile {SAYI2} yi toplamamı mı istiyorsun ?

O zaman siz 5 ile 6 topla dediğinizde, robot size cevap şablonunda parametreleri eşleştirerek 5 ile 6 yi topmamı mı istiyorsun? der.

CEVAP ŞABLONU

Robotun sözlü olarak size vereceği cevabı belirler. Düz cevap metni olabileceği gibi içine kod yazılmış metin de olabilir.
Verilebilecek cevaplar yine | işareti ile ayrıştırılarak tanımlanır. Soru şablonunda tanımlanan parametreler {KELİME1}, {SAYI1}, {HER1} olarak kullanılabildiği gibi, soru şablonundaki ( ) parantez içindeki ifadeler, cevapta $1, $2 gibi de kullanılabilir. $1 ifadesi 1. parantez grubunu belirtmektedir.

Örnek 1:

Hayır, okumuyorum|Okumak için öğrenci olmalıyım|Robotum okula gidemem

İşte bu cevapların içine CEYD fonksiyonları istenirse eklenebilir. Ayrıca sorudan alınan parametreler de bir önceki adımda anlatıldığı gibi cümle içinde kullanılabilir.

Örnek 2:
Soru şablonu şu şekilde olsun:

({KELİME1}) nasıl sence

Cevap şablonu da aşağıdaki gibi olabilir:

{KELİME1} nedir bilemiyorum|Ne yazık ki {KELİME1} hakkında bir bilgiye sahip değilim|Üzgünüm, {KELİME1} nasıl bir şey bilemeyeceğim

Soru şablonundan gelen parametreler { } işaretleri arasında tanımlanırken, cevap içinde oluşturulan değişkenler $ işareti ile başlar. CEYD fonksiyonları ise cevap cümlelerinin içinde {! !} işaretleri arasında tanımlanır.
RET, IF, SET, GET,EVAL, FOR fonksiyonları

  • RET fonksiyonu tanımlı bir komutun sonucunu döndürür.
  • IF fonksiyonu iki değeri karşılaştırır ve mantıksal sonuca göre değer döndürür
  • SET fonksiyonu bir değişkene değer atar. Bu değer uygulama kapalı olsa bile hafızada tutulur.
  • GET fonksiyonu değişken değerini döndürür.
  • EVAL fonksiyonu matematiksel işlem yapıp değerini döndürür
  • FOR döngüsü, içinde tanımlanan fonksiyonların döngü koşulu içerisinde tekrarlanarak çağrılmasını sağlar.
  • FOREACH döngüsü ile dizilerin ve anahtar değer ikilisi ile atanmış yinelemeli dizilerin değerleri alındığı sürece tekrarlı işlem yapar

Bazı örnekler:

Dışarıda hava {!RET hava kaç derece!} derece. Buna göre değerlendir.|Kendi zevkine kalmış % {!RET hava bulut oranı!} oranında bulut var.Televizyon {!RET Televizyon nedir!} demek sanırım{KELİME1} demek {!RET {KELİME1} nedir!} demek sanırım.Hava {!SET derece={!RET hava kaç derece!}!} derece. Bence {!IF $derece<=18??19 dereceden düşük olduğu için soğuk::18 dereceden fazla olduğu için sıcak!}.{!FOR $i=0,9 {!SET $i+=1!}{!GET $i!}.sıra
!} Bitti.

Biraz daha komplike bir örnek vermek gerekirse, bir kur hesaplayıcı yazalım.

SORU ŞABLONU:

({SAYI1})(amerikan dolar|dolar|euro|yuro) (ne kadar|kaç lira|kaç tl).*

CEVAP ŞABLONU:

{SAYI1} {PARAM2} {!EVAL{!RET {PARAM2}!}*{SAYI1}!} TL dir.

Bilindiği gibi soru şablonu regex formatındadır.() ile ayrılan gruplar, cevap şablonunda sırasına göre $1 $2 gibi ifade edilmektedirler. Burada $1 ( veya örnekteki {SAYI1} ) cevaptaki {SAYI1} grubuna karşılık gelmektedir. Yani 2 amerikan doları kaç lira denildiğinde 2, ({SAYI1}) ifadesine yani soru şablonundaki 1. gruba denk düşer. 2. parantezli grup amerikan dolarıdır. 3. parantezli grup ise kaç lira dır.
Bu şekilde düşündüğümüzde cevap şablonunda aynı değerler, {PARAM1} veya bu örnekte {SAYI1} olarak atanmış -> 2 , {PARAM2} -> amerikan doları olarak aynen kullanılabilir.
Cevap şablonunu bu değerlerle yorumlar isek, {PARAM1}, {PARAM2} değerlerini yazdığımızda cevap şu şekilde olacaktır:
2 amerikan doları {!EVAL{!RET amerikan doları!}*2!} TL dir
RET fonksiyonu hazır bir komutu çalıştırıp değerini döndürdüğünden, CEYD-A, hali hazırdaki komut yapısından amerikan doları dendiğinde 5.27 değerini döndürürecektir. Öyleyse, cevabımız yorumlanmaya devam ettiğinde sırasıyla
2 amerikan doları {!EVAL{!RET amerikan doları!}*2!} TL dir
2 amerikan doları {!EVAL 5.27*2!} TL dir
2 amerikan doları 10.54 TL dir.
cevabı oluşacak ve ekrana yansıyacaktır.

İŞLEM ŞABLONU

Eğer hazır bir komuta yeni soru cümleleri eklemek istiyorsanız bu adımı kullanabilirsiniz. Diyelim durumumu güncelle dediğinizde, CEYD-A sizi anlamıyor ve bu komutu dediğinizde hazırda olan CEYD-A’nın anlayabildiği facebook komutu ile aynı işlemi yaptıracaksınız. O zaman soru cümlesine durumumu güncelle, komuta yönlendir içine facebook tanımladığınızda artık durumumu güncelle dediğinizde facebook durumunuzu güncelleyebilirsiniz.
Daha komplike bir örnek ise, Kartal a nasıl giderim dediğinizde Kartal nerede komutunun çalışmasını istiyorsanız, soru şablonuna;

({HERHANGİ1}) nasıl giderim

Soru kelimelerine;

nasıl giderim

NEREDE komutu hali hazırda olduğu için komuta yönlendir bölümüne;

{HERHANGİ1} nerede

yazmanız yeterli olacaktır. $1, parantezli ilk gruptur {HERHANGİ1} olarak tanımlanan kısımdır.

http://web.ceyd-a.com/wp-content/uploads/2017/09/nimbus-record-video-2017-09-09-16-47-25.webm

NASIL KOMUT YAZILIR ?

Komutlar buradaki videoda gösterildiği gibi kodlama ile veya kolayca kod yazmadan sesle söylenerek tanımlanabilir. Örneğin CEYD-A’ ya HAVADİSLERİ OKU DEDİĞİMDE HABERLERİ OKUYACAKSIN dediğinizde kendisi HAVADİSLERİ OKU komutunu oluşturur ve yapacağı işlem olarak HABERLERİ OKU işlemini atar.

CEYD dili ile yazılmış komutlardan bazı örnekler:

Bu yazıda CEYD dilinin neler yapabildiğinden bahsetmek istedim. Daha sonraki yazılarda basit tanımlamalardan başlayıp daha komplike tanımları içeren örneklerden bahsedeceğim.

Komut ekleme ile ilgili yardımcı bilgi ve videolara Komut Ekleme Nasıl Yapılır ? sayfasından ulaşabilirsiniz.

--

--

Cenker Sisman
Deep Learning Türkiye

Senior Software Architect in OTI Holding, Owner of CEYD-A Turkish Mobile Assistant, Istanbul Technical University Computer Engineering M.Sc.