Fırat Esmer

ANLATILAN SENİN HİKAYENDİR - KARL MARX

Microsoft Cognitive Services - Text Analytics API

Microsoft'un Build 2016'da açıkladığı Microsoft Cognitive Services'ı duymamış olabilirsiniz, kısa bir özet geçeyim; Microsoft, yapay zeka (AI / Artifical Intelligence) yarışında diğer firmalarla kıyasıya mücadele ediyor ve bunu sektörde kullanıma hazır hale getirmek için geliştiricilere bir takım API'ler sunuyor. Bu API'ler Azure'da barınan, belli bir kullanıma kadar ücretsiz olup sonrasında kullanım başına hesap ödediğiniz servislerden fazlası değil.
 
Şu an için 5 kategori altında 30'a yakın servis var. Kategoriler:
  • Vision (Vizyon) : Yüz ifadelerinden duygulara, uygulamaların resim ve videolardan veri elde etmesi,
  • Speech (Konuşma) : Gürültü filtresi ile kullanıcıları tanımlama, konuşulanları analiz etme,
  • Language (Dil) : Metni işleyip, kullanıcıların neyi nasıl istediklerini öğrenmek,
  • Knowledge (Bilgi) : Web, akademik ya da kendi verilerinizden toplanan zengin bilgileri analiz edin,
  • Search (Arama) : Bing API'lerinin gücü ile milyarlarca web sayfasına, resimlere, videolara ve haberlere erişin.
Bir kaç servis örneği vereyim:
  • Face API (Yüz API'si) : Fotoğraflardaki yüzleri algılayın, tanımlayın, çözümleyin, düzenleyin ve etiketleyin,
  • Computer Vision API (Görüntü İşleme API'si) : Görüntülerden eyleme dönüştürülebilir bilgiler çıkarın,
  • Text Analytics API (Metin Analizi API'si) : Duyguları ve konuları kolayca değerlendirerek kullanıcıların ne istediğini anlayın,
  • Emotion API (Duygu Tanıma API'si) : Duygu tanıma ile kullanıcı deneyimlerini kişiselleştirin.
Soru : Neden servise ihtiyacımız var?
AI veya Machine Learning konusunda tek başımıza pek de efektif işler çıkaramamamız sebep gösterilebilir. Servisi bize sunan Microsoft'un hem AI hem de Machine Learning konusunda araştırmalar yaptığı, halihazırda bir çok müşterisi ve test etmek için de milyonlarca verisi mevcut. Dolayısıyla bize altın tepside sunulan bu fırsatın kullanılması bizim yararımıza olacaktır.
 

Soru : Neden Azure?

Çünkü, bugün (özellikle Microsoft) her şeyin buluta taşınması gibi bir çılgınlık söz konusu. Aslında bunun bize sağladığı faydalar da var. İlki, her yerden erişilebilir ve stabil olması. İkincisi ise kullandığın kadar öde söz konusu olduğu için kullanımı da epey kolay.
 
Soru : API ne işe yarayacak?
Sosyal medyada bir ürün/hesap hakkında veya mağazada bulunan uygulamanız hakkında yapılan yorumların ne duygular içerdiğini, insanların nasıl tepkiler verdiğini ölçebilirsiniz. Aslında, size herhangi bir konuda API veren her platformda bu API'yı kullanabilirsiniz. Buna GitHub'da yapılan yorumlardan, veri tabanında bulunan herhangi bir alana karşı kullanmak da mümkün.
 
Makalemizde Text Analytics / Metin Analiz API servisini kullanacağız. (Tüm servisler ve kategorileri görmek için buraya bakabilirsiniz.)

Text Analytics API / Metin Analiz API'si

Servis 3 ayrı bölümden oluşmakta. Bunlar:

  • Sentiment analysis (Duygu analizi) : API, 0 ile 1 arasında bir sayısal puan döndürür. Puanın 1’e yakın olması yaklaşımın olumlu olduğunu, 0’a yakın olması ise olumsuz olduğunu gösterir.
    Örnek : Bilmiyorum ifadesi 0.5, Seni seviyorum ifadesi ise 0.98... puan döndürüyor.

  • Key phrase extraxtion (Anahtar tümcecik ayıklama) : API, giriş metnindeki başlıca konuşma noktalarını gösteren bir dize listesi döndürür.
    Örnek : Anahtar tümcecik ayırma işlemi Türkçe dil desteği yok. ("Supplied language is not supported. Pass in one of: de,en,es,fi,fr,it,ja,pl,pt-BR,pt-PT,sv.") fakat İngilizce örnek vermek gerekirse I had a wonderful experience! The rooms were wonderful and the staff was helpful (Harika bir deneyimdi! Odalar harika ve personel yardımcıydı) ifadesinin anahtar tümceleri wonderful (harika), experience (deneyim), staff (personel), rooms (odalar).

  • Language Detection (Dil algılama) : API, algılanan dile ek olarak 0 ile 1 arasında bir sayısal puan döndürür. Puanın 1’e yakın olması, tanımlanan dilin %100 olasılıkla doğru olduğunu gösterir. 120 dil desteği mevcut.
    Örnek : Merhaba, benim adım Fırat ifadesi için Türkçe ve 1.0 puan değer dönüyor.

Metin Analiz API'sini deneyebileceğiniz bir sayfa mevcut, bakmak isterseniz buraya tıklayın.

Şimdi, servisi 3 ayrı bölümde inceleyelim. Çünkü üçünün de farklı request/response json verileri mevcut.

ÖNEMLİ NOTLAR

  • Senaryo : Basit bir console uygulaması ile belirli ifadeleri analiz edip, bilgi edinebileceğimiz bir uygulama yapacağız,
  • Visual Studio 2017 kullanacağım / .NET Framework 4.7 (uygulama indirme linkini sonda paylaşacağım),
  • Servisi kullanabilmek için (sizi şimdilik Azure Portal'e sokmayacağım) API anahtarını ve Azure sunucu bilgisini buradan alabilirsiniz,
  • Yüklemeniz gereken NuGet Package'ın adı "Microsoft.Azure.CognitiveServices.Language" (DİKKAT : Include Prelease kutusunu seçin)

Microsoft Azure Cognitive Services Language

Servisi kullanmadan önce ayar yapmamız gerekiyor. Ayarlarda dikkat edilmesi gereken 2 husus var.

  1. Azure Region (Bölge) bilgisinin API'yi aldığınız region ile bir olması,
  2. Subscription Key (API anahtarı) size verilen ile birebir olmalı.
            ITextAnalyticsAPI client = new TextAnalyticsAPI();
            client.AzureRegion = AzureRegions.Westcentralus;
            client.SubscriptionKey = "SİZİN KEY'İNİZ";

Text Analytics API

Sentiment Analysis / Duygu Analizi

Duygu analizi kısmında yapmamız gereken tek şey API'nin istemiş olduğu parametreleri sağlamak.
Parametreler

  • Dil : Duygu analizinin yapılacağı dil (TR = Türkçe verdik),
  • Id : Sıradan bir Id, takip edebilmeniz için,
  • Text : Analiz edilecek ifade
            #region Duygu Analizi
            SentimentBatchResult sentimentResults = client.Sentiment(
                new MultiLanguageBatchInput(
                    new List<MultiLanguageInput>()
                    {
                        new MultiLanguageInput("tr", "0", "Çok güzeldi, çok beğendim."),
                        new MultiLanguageInput("tr", "1", "Kesinlikle gitmeyeceğim."),
                        new MultiLanguageInput("tr", "2", "Nasıl olacak bilemiyorum?"),
                        new MultiLanguageInput("tr", "3", "Hiç beğenmedim, çok kötüydü."),
                    }));

            foreach (var document in sentimentResults.Documents)
                Console.WriteLine("Doküman Id: {0}, Duygu Skoru: {1:0.00}", document.Id, document.Score);
            #endregion
Ve sonuç aşağıdaki gibi
Text Analytics API Sentiment Results

Key Phrase Extraction / Anahtar Tümcecik Ayıklama

Anahtar kelimeleri ifademizden ayırabilmek için verilmesi gereken parametreler duygu analizi ile aynı parametreler. Dil, Id ve ifade.

Anahtar kelime ayırma Türkçe dil desteği bulunmadığı için İngilizce ifadeler kullanacağım. Bunlar
Last night I had too much to drink = Dün gece içmek için çok fazla şeyim oldu
I've got a bike. You can ride it if you like = Bir bisikletim var. İstersen sürebilirsin
You reached for the secret too soon = Sırra çok erken ulaştın
No dark sarcasm in the classroom = Sınıfta alaya yer yok

            KeyPhraseBatchResult keyPhraseResults = client.KeyPhrases(
                new MultiLanguageBatchInput(
                    new List<MultiLanguageInput>()
                    {
                          new MultiLanguageInput("en", "1", "Last night I had too much to drink."),
                          new MultiLanguageInput("en", "2", "I've got a bike. You can ride it if you like."),
                          new MultiLanguageInput("en", "3", "You reached for the secret too soon."),
                          new MultiLanguageInput("en", "4", "No dark sarcasm in the classroom.")
                    }));


            foreach (var document in keyPhraseResults.Documents)
            {
                Console.WriteLine("Doküman Id: {0} ", document.Id);

                Console.WriteLine("Anahtar kelimeler:");

                foreach (string keyphrase in document.KeyPhrases)
                    Console.WriteLine(keyphrase);

                Console.Write(Environment.NewLine);
            }

Sonuç aşağıdaki çıktı

Text Analytics API Key Phrase Results

Language Detection / Dil Algılama

Dil algılamayı en başta yapsam daha sağlıklı olurdu, çünkü verilen ifadenin önce dilini öğrenip ondan sonra Duygu ve Tümcecik Ayırma analizi yapmak en doğru yol fakat tümcecik ayırma analizinde TR dil desteği olmadığı için ayrı ayrı yapma fikri daha ağır bastı.
Dil algılama servisinin bizlerden istediği iki parametre var: Id ve ifade (text).
            LanguageBatchResult languageResult = client.DetectLanguage(
                    new BatchInput(
                        new List<Input>()
                        {
                          new Input("1", "This is a document written in English."),
                          new Input("2", "Este es un document escrito en Español."),
                          new Input("3", "Bu doküman Türkçe yazılmıştır.")
                        }));

            // Printing language results.
            foreach (var document in languageResult.Documents)
                Console.WriteLine("Doküman Id: {0} , Dil: {1}, Yakınlık {2:0.00}", 
                    document.Id, document.DetectedLanguages[0].Name, document.DetectedLanguages[0].Score);
Text Analytics API Language Detection Results
 
Dil algılama işlemini tamamladık, metin analiz servisini tamamen kullandık. Hepsi bu kadar. Siz de Microsoft'un API kullanımı için hazırladığı örnek kod sayfasına (C#) göz atmak isterseniz buraya, servis dokümanını incelemek isteseniz ise buraya tıklayın.
 Projeyi indirmek için tıklayınız : TextAnalyticsAPIDemo.7z (2,50 mb)