Dahi API DOCS


Dökümandaki örnekleri takip ederek kolayca ilk uygulamanızı yapabilirsiniz


 

Dahi servisini özel yapan nedir ?

  • Türkçe doğal dil işleme servisi sunan tek uygulama
  • Dilediğiniz kadar kategori yaratabilme
  • Güçlü Türkçe anlamlandırma algoritması
  • Ticari kullanım için geliştirme desteği (SLA/cache/private/performance)
  • Ücretsiz bireysel kullanım

  • Dahi Api doğal dil işleme (NLP) teknikleri kullanarak en akıllı Türkçe anlamlandırma servisini sunmayı amaçlar. Kendi kategorilerinizi yaratıp api servisini kullanabilirsiniz.

    Api Kullanımı

  • Metod: POST
  • Api URL: http://dahiapi.me/api/getCategory
  • Parametreler:

    - username (kullanıcı adı)

    - password (şifre)

    - text (Anlamlandırılması istenilen metin)

    - extra (JSON ile bir parametreyi dinamik doldurmak için)

  • Extra kullanımı: Opsiyoneldir, boş gonderilebilir{}
    - text : Onur’u Ara
    - extra : {"contacts" : [{"text":"onur can"},{"text":"ahmet güven"}]}
  • Giriş yapalım, NoSQL DB, Kullanıcı bilgileri vs.

    Dahi Api kullanım talep formunu doldurduktan sonra e-posta adresinize kullanıcı bilgileriniz gönderilecektir, bu kullanıcı adı ve şifre ile mongodb'ye giriş yapabilirsiniz. Veritabanı olarak MongoDB kullanılmaktadır, bağlanmak için Mongovue uygulamasını kullanabilirsiniz.

    Mongodb doküman tabanlı, açık kaynak bir NoSQL veritabanı uygulamasıdır, döküman (document) ilişkisel veritabanındaki bir satıra (row) denk gelir, koleksiyon (collection) ise tabloya (table) karşılık gelmektedir.

    Geliştirici hesabı aldığınız zaman tablolarınız ve örnek kategorileriniz otomatik oluşmaktadır, hazır gelen ilk kategorileriniz "Saat Kaç", "Hava Nasıl" sorularına cevap verebilecektir. Web Servisini çağırarak örnek uygulamanızı görebilirsiniz.

    Peki bir örnekle başlayalım...

    Öncelikle veritabanı üzerinde kategorilerinizi tanımlamanız gerekiyor. Uygulamanız üzerinden kullanıcılar hava durumunu sorguluyor olsun. Bu durumda "weather" (veya siz ne isim verirseniz) kategorisi tanımlamanız gerekmektedir.

    Alttaki tanımları kullanarak bir döküman (veya satır) oluşturacağız.

  • Category*: Kategori ismi
  • Values* :Değer kümesidir ve değerleri içerir array tipindedir. ( Values değeri value değererini içeren bir arraydir; "values:[{value:'abc'}{value:'123'}]" )
  • Value*: Değer
  • Mustnumber: Değer içerisinde olması gereken minimum kelime sayısı
  • Mustvalue: Değer içerisinde olması gereken kelime (0 ilk kelime) veya kelimeler
  • Answers: Bir sorunun veya değerin cevabı olarak kullanılabilir, array tipindedir.
  • *zorunlu alanlar

    İlk kategoriyi oluşturma

    {
    "category" : "weather",
    "values" : [{
        "value" : "hava durumu nasıl",
        "mustnumber" : 2,
        "mustvalue" : [0]
        },
        {
        "value" : "şemsiye almalımıyım",
        "mustvalue" : [0]
        } ] }
    

    Hava durumu nasıl olacak?, Şemsiye almalımıyım ? sorularına cevap verebilen bir uygulama yapıyorsunuz. Categories collection (tablo) içerisinde tanımlamanız gereken kategori yandaki gibi olmalı.

    “Hava durumu” metin içerisinde geldiği zaman weather kategorisine girmesi için her iki kelime gelmeli ("mustnumber" : 2). Ayrıca metin içindeki ilk kelime kesin gelmeli("mustvalue" : [0])

    “Şemsiye almalımıyım” metin içerisinde geldiği zaman weather kategorisine girmesi için “şemsiye” kelimesinin gelmesi şart ("mustvalue" : [0])

    Birden fazla kategoriyi oluşturmak için

    3 kategori yapalım, weather, weatherDegree ve weatherWind. Categories collection (tablo) içerisinde tanımlamanız gereken kategori şöyle olmalı.

    { "category" : "weather",
    "values" : [{
        "value" : "hava durumu nasıl",
        "mustnumber" : 2,
        "mustvalue" : [0]
        },
        {
        "value" : "şemsiye almalımıyım",
        "mustvalue" : [0]
        }]}
        
    {
    "category" : "weatherDegree",
    "values" : [{
        "value" : "hava kaç derece",
        "mustnumber" : 2,
        "mustvalue" : [0,2]
        },
        {
        "value" : "sıcaklık durumu nedir",
        "mustvalue" : [0]
        }]}
        
    {
    "category" : "weatherWind",
    "values" : [{
        "value" : "hava rüzgarlımı",
        "mustvalue" : [0,1]
        },
        {
        "value" : "dışarısı esiyormu",
        "mustvalue" : [1]
        }]}
    

    Buraya kadar tatmin olmadık dimi :)

    Olmadık çünkü dahi servisinin farkı asıl bundan sonra ortaya çıkıyor. Öncelike neden kategorize ediyoruz onu açıklayalım, birçok konu hakkında cevap verebilecek bir uygulama düşünün(hava durumu, maç durumu, adres sorma, bilet alma vs.) yapacağımız işlem öncelikle konunun hangi kategoriye girdiğini bulmak, bu şekilde alanı çok daraltmış oluyoruz, sonra ilgili metnin detayına inip istediğimiz parametreleri(zaman,lokasyon,isim) elde edeceğiz. Sonuç olarak elimde anlamlandırılmış bir veri olacak.

    “Ankara’da yarın hava nasıl olacak” metni geldiği zaman doğru cevabı verebilmek için hangi ilin hava durumunun sorulduğunu bilmek isteyeceksiniz. Bu durumda “categories” içerisinde daha önce tanımladığınız kategorinizin detayını "details" koleksiyonu içine girmeniz gerekiyor.

    Details girişi nasıl yapılır ?

    {
      "category" : "weather",
      "params" : {
        "city" : {
          "label" : "Sehir",
          "type" : "array",
          "values" : [{
              "text" : "ankara"
            }, {
              "text" : "istanbul"
              
            }, {
              "text" : "gaziantep",
              "otherText" : ["antep"]
            }]
        }
      }
    }
    

    details içerisinde weather kategorisine ait detay bilgi girişi bulunmaktadır. “Ankara’da hava nasıl” diye sorulduğu zaman size dönen JSON içerisinde şehir ismi bulunup selected olarak geri döncektir. Bu durumda hangi şehirdeki hava durumunun sorulduğunu anlayabilirsiniz.

    Ayrıca array içerisinde otherText kullanarak alias tanımlayabilirsiniz Antep’te hava nasıl sorulduğu zaman Gaziantep anlaşılması için "otherText" : ["antep"] kullanılabilir.

    Servisten dönen cevap (JSON)

        "params" : {
        "city" : {
          "label" : "Sehir",
          "type" : "array",
          "values" : [{
              "text" : "ankara",
              "selected" : true
            }, {
              "text" : "istanbul",
              "otherText" : ["yeditepe"]
            }, {
              "text" : "antalya"
            }]
        }
    

    detailCategory içerisinde weather kategorisine ait detay bilgi girişi bulunmaktadır. “Ankara’da hava nasıl” diye sorulduğu zaman size dönen JSON içerisinde şehir ismi bulunup selected:true olarak geri döncektir. Bu durumda hangi şehirdeki hava durumunun sorulduğunu anlayabilirsiniz.

    Ayrıca array içerisinde otherText kullanarak alias tanımlayabilirsiniz Antep’te hava nasıl sorulduğu zaman Gaziantep anlaşılması için "otherText" : ["antep"] kullanılabilir

    Önceden tanımlı (predefined) yapılar

    TYPE FORMAT RETURN TYPE
    int -3,-2,-1,0,1,2,3 1
    array [{A},{B},{C}] A
    plate 99 X 9999….99 XXX 99 34 ABC 86
    phone 05XX XXX XX XX 0531 111 11 11
    identifier 99999999999 12345678912
    date DD.MM.YYYY 12.02.2015
    time HH:MM 08:00
    datetime DD.MM.YYYY HH:MM 12.02.2015 08:00

    Peki kullanıcı “Yarın Anakara’da hava nasıl olacak ?” gibi bir soru yöneltirse zaman bilgisini nasıl alırız ? Bunun için dahi api içerisinde önceden tanımlı (predefined) yapı bulunuyor. Önceden tanımlı yapıyı kullanmak için döküman içerisinde "type" kullanıp ve bir sabit (default) değer verebilirsiniz, bu şekilde aranan değer metin içerisinde bulunmaz ise default değeri alır.

    Önceden tanımlı (Predefined) yapılar:

    "type" : int, array , time , phone(telefon numarası), date, plate(plaka 06 hnt 03), identifier(kimlik no), lottery(pi) , regex (sonra açıklanacak)

    details içinde istediğiniz kadar parametre tanımlayabilirsiniz, biz şehir isimlerine ek olarak cümledeki zamanı yakalamak istiyoruz bu sebeple "type" : "date" predefined tanımını kullandık.

    Parametreler kısmına "type" : "date" ekledik ve values alanına default (text ) değeri 13.03.2015 verdik, default değer boş olabilir zorunlu değildir. Sadece metin içerisinde aradığımızı bulamadığımızda kullanılacak değer olması açısından koyduk.

    {
      "category" : "weather",
      "params" : {
        "city" : {
          "label" : "Şehir",
          "type" : "array",
          "values" : [{
              "text" : "ankara"
            }, {
              "text" : "istanbul"
              
            }, {
              "text" : "gaziantep",
              "otherText" : ["antep"]
            }]
        } , “zaman”:{
        "label" : "zaman",
        "type" : “date”,
        "values" : [{
              "text" : "13.03.2015"
            }}
            }
            }
    

    12.02.2015 tarihi Pazartesi günü kullanıcı “Ankara’da yarın hava nasıl” sorusu geldiğinde zaman 13.02.2015 olarak dönecektir, dolayısıyla alttaki gibi bir JSON elde edersiniz.

    "params" : {
        "city" : {
          "label" : "Şehir",
          "type" : "array",
          "values" : [{
              "text" : "ankara",
              "selected" : true  }, {
              "text" : "istanbul" 
            }],
     “zaman”:{
        "label" : "zaman",
        "type" : "time",
        "values" : [{
              "text" : "13.02.2015"
            }}
            }
            }
    

    Regex kullanımı

    Regex kullanımı diğerlerinden biraz farklı olduğu için detaylı incelememiz gerekir. Düzenli ifadeler yani Regex(regular expression) bir metin üzerine uygulanır, sonuç olarak alt metinler elde edilir veya orjinal metnin bir kısmını içeren değiştirilmiş yeni metinler elde edilir. Biz sosyal ağlarda mesaj paylaşımını algılayabilecek, mesajı metin içerisinden ayıklayabilecek bir örnek üzerinden gideceğiz.

    Dahi api içinde regex kullanmak için gerekli adımlar

  • Categories ve details tanımlarınızı yapın
  • Details içerisinde ilgili valuesSource değerini "type:regex" olarak tanımlayın
  • Yakalamak istediğiniz metinleri belirleyin
  • regex koleksiyonu içerisinde gerekli tanımı yapın
  • Categories koleksiyonu: Kategorime ait metinler ve yakalamak istediğim kelimeler.

    {
      "category" : "social",
      "values" : [{
          "value" : "facebook paylaş gönder güncelle",
          "mustvalue" : [0],
          "mustnumber" : 2
        }, {
          "value" : "twitter paylaş gönder güncelle",
          "mustvalue" : [0],
          "mustnumber" : 2
        }, {
          "value" : "twit at",
          "mustvalue" : [0],
          "mustnumber" : 2
        }, {
          "value" : "tweet at",
          "mustvalue" : [0],
          "mustnumber" : 2
        }]
    }
    

    Details Koleksiyonu: body alanı valuesSource regex verilip cümle içerisinde aranan mesaj buraya aktarılacaktır.

    {
      "category" : "social",
      "params" : {
        "body" : {
          "label" : "mesaj",
          "type" : "textarea",
          "values" : [{ "text" : ""}],
          "valuesSource" : {
            "type" : "regex"} },
        "resource" : {
          "label" : "kaynak",
          "type" : "array",
          "values" : [{
              "text" : "facebook",
              "otherText" : ["duvar"]
            }, {
              "text" : "twitter",
              "otherText" : ["tivit", "takipçilerim", "tweet",
    "twit"]
            }] } } }
    

    Regex Koleksiyonu: metin içerisinde paylaşılmak istenen mesajı yakalamak için ilgili regex tanımları yapılır. Biz 2 tane yazdık ama daha fazla regex tanımı kombinasyonlara göre yapılabilir.

      {
      "category" : "social",
      "regex" : "(gönder|paylaş|at|güncelle){1}[a-zğüşöçı ]* [a-z1-9ğüşöçı ]+ resource( )?[da|ta|dan|tan]?",
      "count" : 6
    }
    
    {
      "category" : "social",
      "regex" : "resource[a-zğüşöçı' ]*(gönder|paylaş|at|güncelle){1}([i|e|ı|a]r( )?m[i|ı]s[i|ı]n)? [a-z1-9ğüşöçı ]+",
      "count" : 6
    }
    

    Önemli Not: Regex içerisinde ayıklanacak dizin [a-z1-9ğüşöçı ]+ olacaktır, bu alan her regex tanımı içerisinde olmalıdır.

    Verilen yapıda bir kullanıcı "Facebook'da paylaş günaydın" dediği zaman, önce cateogries koleksiyonuna göre social seçilecek, ardından details kolaksiyonuna göre resource olarak facebook seçilecek, en son body içerisindeki valuesSource tipi regex olduğu için regex koleksiyonundaki social kategorisine aiıt regex dökümanları incelenip mesaj ayıklanacak ve ilgili metin body altındaki values içerisine aktarılacak.

    Bir dökümanın değerini koleksiyondan doldurmak

    Dizi (array) tipinde olan bir parametrenin değerleri (values) başka bir kaynak dökümandan doldurulabilir. Örnek vermek gerekirse contacts parametresini başka bir döküman (document) ile doldurmak istersek o döküman ismini, hangi seviyeye gideceği ve map özelliklerinin girilmesi gerekmektedir. Array değerleri, ihtiyacımız olan metin (text) değeri olduğu için ilgili değere map edilmesi gerekmektedir. Map yapılırken tipi (type), koleksiyon adı (collection) ve atanacak değer(text) girilmesi gerekir.

    Hedef dökümanı dolduran girişin açıklaması şöyledir; contacts dökümanının contact isimli dizisinin (array) metin değerini personel adlı koleksiyondan(collection) doldur. Doldururken personel koleksiyonu içerisinde person dökümanının contacts alanına kadar in ve name değerini metine (text) ata.

    Hedef Döküman:
    {		
    "contacts" : {
          "label" : "Contact",
          "type" : "array",
          "values" : [{
              "text" : ""
            }],
          "valuesSource" : {
            "results" : "person.contacts",
            "map" : {
              "text" : "name",
            },
            "type" : "fill",
            "collection" : "personel"
          }
        } }
    
    Kaynak Döküman:
    {"person" : {
        "email" : "[email protected]",
          "contacts" : [{
              "name" : "Ahmet",
              "phonenumber" : "021612345678"
            }, {
              "name" : "Adnan",
              "phonenumber" : "+905322222222"
            }]
        }
      }
    

    Ayrıca extra parametresi ile servisi çağırırken ilgili değeri doldurabilirsiniz. Örnek: extra : {"contacts" : [{"text":"onur can"},{"text":"ahmet güven"}]} contacts alanına karşılık gelen text değeri gönderilen array değerleri ile doldurulucaktır.

    Test nasıl yapılır ?

    Kategorilerinizi tanımladıktan sonra test etmeniz gerekir. Test için size Rest Client - POSTMAN eklentisini önerebiliriz, chrome, firefox gibi tarayıcılarda çalışmaktadır. Görüntüdeki gibi kullanabilirsiniz, göndermeniz gereken parametreler ve URL bilgisi Api kulanım alanında açıklanmıştır.

    Büyütmek için resmi tıklayınız.