İçeriğe geç →

.NET Core ve Azure Text Analytics API Kullanarak Ürün Yorumları Üzerinde Sentiment Analizi Gerçekleştirme

Merhaba arkadaşlar.

Bir süredir büyük ilgi alanlarım arasında olan “Machine Learning” ve “Natural Language Processing” konuları üzerinde araştırmalar ve denemeler yapmaktayım. Bu araştırmalarım ve denemelerim sırasında ise iş hayatımda bulunuyor olduğum domain içerisinde, bu konuları nasıl ve nerede implemente edebilirim sorularını da düşünmekteyim. (Günün sonunda, implemente ettiğimiz bir fikrin son kullanıcıya olan güzel etkisini görebilmek, bir developer olarak mutluluk veriyor değil mi?)

Bu makale kapsamında ise .NET Core ve Azure Text Analytics API kullanarak, bir e-ticaret firmasındaki ürün yorumları üzerinde sentiment analizi gerçekleştireceğiz. Sentiment analizindeki amacımız ise bir son kullanıcının bir ürün hakkındaki yorumları okumadan, hızlı bir şekilde fikir sahibi olabilmesini sağlamak yönünde olacaktır.

Öncelikle sentiment analizi nedir, kısaca bir giriş yapmak istiyorum.

1) Sentiment Analizi Nedir?

Kısaca sentiment analizi için:

Bir yazı parçasından olumlu veya olumsuz görüşlerin belirlenmesi sürecidir diyebiliriz.

Ayrıca bir konuşmacının düşüncesini veya tutumunu inceleyen, fikir madenciliği olarak da bilinir. Özellikle machine learning‘in hızla ilerlemesiyle beraber, günümüz teknoloji çağında sentiment analizleri üzerinde de büyük çalışmalar yapılmaktadır.. Geçmişe dönüp bir 10 yıl öncesini hatırlarsak, forex firmaları içerisinde de piyasaların sentiment analizlerinin çıkartılıp, bu analizler doğrultusunda alım ve satım işlemlerinin yapıldığını görebiliriz. (Oynayanlar bilir)

Günümüzde ise firmalar, kendi ürünleri hakkında sosyal medya üzerinde ne düşünülüyor gibi fikirleri öğrenebilmek için, oldukça yaygın olarak sentiment analizi gibi hizmetleri kullanmaktadırlar.

Örneğin twitter veya instagram üzerinde yediğimiz-içtiğimiz şeyleri, duygularımızı genelde paylaşmaktayız. Bu paylaşım işlemleri basit bir olay gibi gözükebilir, fakat bir çok firma hangi ürünlere veya hangi yöne ağırlık vermeleri gerektiği bilgilerini bu paylaşımlardan ve analizlerinden yola çıkarak belirleyebilmektedir.

Biz ise bu makale kapsamında sentiment analizini, kullanıcıların ürünler hakkında ne hissettiklerini keşfedip, bir sonraki kullanıcıya tercih edeceği ürün hakkında daha hızlı karar verip, satın alabilmesi amacıyla esneklik sağlamak için kullanacağız.

Sentiment analizini gerçekleştirebilmenin bir çok farklı yöntemi mevcut. Örneğin, Python‘ın VADER NLTK paketi ile kendi sentiment analyser’ınızı oluşturabilirsiniz (Üzerinde çalıştığım bir tool, ilerleyen makale konusu olarak değerlendirebilirim) veya bizi hızlandıracak bir cloud provider API‘ı tercih edebilirsiniz.

Biz bu makale kapsamında ise sentiment analizini, Azure Text Analytics API‘ı kullanarak gerçekleştireceğiz.

2) Azure Text Analytics API

Peki nedir bu Azure Text Analytics API ve bize neler sunuyor?

Azure Text Analytics API, raw text üzerinden advanced natural language processing(gelişmiş doğal dil işleme) gerçekleştirebilmemize olanak sağlayan bir cloud-based hizmettir. Özellikle “time to market” söz konusu olduğunda, Azure Text Analytics API gibi cloud hizmetleri bizlere oldukça fazla “hız” ve “zaman” kazandırmaktadır.

Azure Text Analytics API, aşağıdaki 4 ana fonksiyonu içermektedir:

  1. Sentiment Analysis: Makalemizin de konusu olan, kullanıcıların ürünler hakkında ne düşündüklerini analiz edebilmemizi sağlayan hizmeti.
  2. Key Phrase Extraction: Bir cümle içerisindeki ana noktaları hızlıca tanımlayabilmemiz için anahtar sözcükleri çıkartabilmemizi sağlayan hizmeti.
  3. Language Detection: 120 dile kadar giriş metninin hangi dilde yazıldığını tespit edebilmemizi sağlayan hizmeti.
  4. Entity Linking: Metin içerisindeki bilinen varlıkların hakkında daha fazla bilgiye ulaşılabilmesi için, linkleyebilmemizi sağlayan hizmeti. (Henüz preview durumda)

NOT: Free tier’ı seçerek, aylık 5000 transaction’a kadar ücretsiz olarak kullanabilmek mümkündür.

2.1) Text Analytics Resource’unu Oluşturmak

Text Analytics API‘ı kullanabilmek için Azure marketplace üzerinden “AI + Machine Learning” sekmesine girelim ve “Text Analytics” i seçelim.

Ardından aşağıdaki gerekli alanları, kendi seçimlerimize göre dolduralım ve create butonuna basalım.

Artık API hazır durumda.

Aşağıdaki overview ekran’ı üzerinden Azure Text Analytics API‘ının, makalenin ilerleyen bölümlerinde kullanabilmek için “endpoint” ve “key” bilgilerine erişebilmek mümkündür.

3) .NET Core ile Azure Text Analytics API Kullanımı

Bir e-ticaret firmasında çalıştığımızı ve kullanıcıların satın aldıkları ürünler için yorum yapabildiklerini varsayalım. Sanırım bir ürünü satın almadan önce o ürün için yapılmış olan yorumları okuyabilmek, hem son kullanıcı açısından hem de ilgili firma açısından önemli bir fonksiyonalitedir.

Peki, son kullanıcıların tüm yorumları okuyup bir ürün seçimi yapmalarının yerine, biz onlar için tüm ürün yorumları üzerinde bir sentiment analizi gerçekleştirerek, her bir ürün için ortalama bir son kullanıcı puanı gösterebilsek, harika olmaz mı? Hem son kullanıcılar tüm yorumları okuyarak fazla vakit kaybetmemiş olurlar hem de biz son kullanıcının ziyaretini hızlıca satışa çevirebilme imkanı elde etmiş olabiliriz.

Haydi ozaman iş başına.

İlk olarak aşağıdaki gibi “SentimentAnalysisWithNETCoreExample” isminde bir .NET Core “webapi” projesi oluşturalım.

Ardından projeye aşağıdaki komut satırı ile “Microsoft.EntityFrameworkCore” paketini dahil edelim.

Artık domain modellerimizi tanımlayabiliriz.

Models” isminde bir klasör oluşturarak, içerisinde “Domain” isminde yeni bir klasör daha oluşturalım.

Şimdi “Domain” klasörü içerisinde ise, aşağıdaki gibi bir “Product” class’ı ekleyelim.

Bizim için buradaki önemli nokta, “CustomerRating” property’si. Bu property’nin value’sunu, product comment’lerinin sentiment analizi sonucunda çıkan score’ların ortalaması ile dolduracağız.

Şimdi ise “Domain” klasörü içerisine, “Comment” isminde bir class daha ekleyelim.

Bu class içerisindeki “SentimentScore” property’sinin value’sunda ise, her bir comment’in kendi sentiment score’unu tutacağız.

Artık data context’i ve sample dataset’i oluşturabiliriz. “Data” isminde root dizinde bir klasör oluşturalım ve içerisinde “ProductDBContext” isminde aşağıdaki gibi bir class ekleyelim.

Data context’i standart olarak “DbContext” class’ından inherit alarak oluşturduk. İçerisinde “Products” ve “Comments” dbset’lerini tanımladık. Örnek dataset’e sahip olabilmek için, “OnModelCreating” method’u içerisinde bir kaç product ve onlara comment’ler ekledik.

Şimdi ise, business service’leri kodlamaya başlamadan önce request & response modellerimizi tanımlayalım.

Bunun için “Models” klasörü altında, “Requests” ve “Responses” klasörülerini oluşturalım. Ardından “Requests” klasörünün içerisinde aşağıdaki gibi “GetSentimentAnalysisRequest” ve “GetSentimentAnalysisRequestItem” class’larını tanımlayalım.

GetSentimentAnalysisRequest” ve “GetSentimentAnalysisRequestItem” class’larını, Azure Text Analytics API‘ın sentiment endpoint’ini call edebilmek için kullanacağız.

Sentiment endpoint’i aşağıdaki gibi bir request’i bizden beklemektedir:

NOT: Azure Text Analytics API‘ın sentiment endpoint’ini kullanabilmek için hazır bir NuGet package’ı mevcut. Fakat preview durumdadır ve henüz .NET Standard 1.4’ü desteklemektedir. Bu sebeple .NET Core 2.1 uygulamasında kullanabilmek için, kendi request modellerimizi ve service’imizi implemente edeceğiz.

Sentiment endpoint’inin response modellerini ise, oluşturmuş olduğumuz “Responses” klasörü altında tanımlayacağız.

GetSentimentAnalysisResponse” ve “GetSentimentAnalysisResponseItem” ismindeki iki adet class’ı, “Responses” klasörü altında aşağıdaki gibi oluşturalım.

Artık sentiment sonuçlarını alabileceğimiz response modellerini de tanımladığımıza göre, service’i implemente etmeye başlayabiliriz.

Bunun için root dizinde “Services” isminde yeni bir klasör oluşturalım ve içerisinde “ITextAnalyticsService” isminde bir interface tanımlayalım.

Ardından “Services” klasörü altında “Implementations” isminde bir yeni klasör daha oluşturalım ve içerisine “TextAnalyticsService” isminde bir class yaratıp, “ITextAnalyticsService” interface’ini aşağıdaki gibi implemente edelim.

TextAnalyticsService” içerisinde yaptığımız işlem gayet basit.

HttpClientFactory‘i “TextAnalyticsAPI” key’i üzerinden named-client yöntemi ile oluşturduk. Ardından “IConfiguration” service’i üzerinden ilgili Azure Text Analytics API‘ın sentiment resource URI‘ını alarak, POST işlemini gerçekleştirdik. Eğer işlem başarılıysa tamamlanıyorsa, response’u daha önce oluşturmuş olduğumuz “GetSentimentAnalysisResponse” model’i ile map’liyoruz.

Şimdi ise product comment’leri ile ilgili işlemleri implemente edeceğimiz service’in interface’ini, aşağıdaki gibi “Services” klasörü altında tanımlayalım.

IProductCommentService

Ardından “Services” klasörü altındaki “Implementations” klasörü içerisinde, “ProductCommentService” isminde bir class daha oluşturalım ve “IProductCommentService” interface’ini aşağıdaki gibi implemente edelim.

GetCommentsAsync” method’u ile ilgili product’ın comment’lerini, database’den alıyoruz. “CalculateCommentsSentimentScoreAsync” method’u içerisinde ise oluşturmuş olduğumuz Azure Text Analytics API‘ın service’ini kullanarak, tüm comment’lerin sentiment score’larını hesaplıyoruz. Eğer API call’ı sırasında herhangi bir problem oluşmazsa, comment’lerin sentiment score’larını map’liyoruz.

Şimdi ise product’lar ile ilgili işlemleri gerçekleştirebileceğimiz bir service’e daha ihtiyacımız var.

Öncelikle dışarıya domain model’ini expose etmemek adına product response modelini, daha önce oluşturmuş olduğumuz “Models/Responses” klasörü içerisinde tanımlamamız gerekmektedir.

GetProductResponse” ve “GetProductCommentResponse” class’larını aşağıdaki gibi “Responses” klasörü içerisinde tanımlayalım.

Model’leri tanımlamanın ardından, “Services” klasörü altında “IProductService” isminde aşağıdaki gibi yeni bir interface oluşturalım.

Ardından “Services” klasörü altındaki “Implementations” klasörü içerisinde, “ProductService” isminde bir class daha oluşturarak, aşağıdaki gibi implemente edelim.

Oluşturduğumuz “GetProductAsync” method’una bakarsak, ilgili product’ın comment’lerini inject etmiş olduğumuz “IProductCommentService” vasıtasıyla çekiyoruz.

Eğer ilgili product’ın comment’leri boş değilse “IProductCommentService” içerisindeki “CalculateCommentsSentimentScoreAsync” method’unu kullanarak, ilgili comment’lerin sentiment score’larını hesaplıyoruz.

Ardından kullanıcıların ilgili ürün hakkında ne hissettiklerinin (olumlu/olumsuz) bir ortalamasını alabilmek için ise, “CalculateProductCustomerRatingScoreAsync” isimli private method’u kullanıyoruz.

Sonunda service’lerin tanımlanması ve implemente edilmesi işlemlerini tamamladık.

Şimdi, “Controllers” klasörü altında “ProductsController” isminde aşağıdaki gibi bir controller tanımlayalım.

Yukarıdaki controller içerisinde ise “IProductService” interface’ini inject ettikten sonra, dışarıya bir GET endpoint’i expose ettik. Artık product’ları, “id” bazlı alabileceğimiz bir endpoint’e sahibiz.

Şimdi ise injection vb. gibi gerekli işlemleri sağlayabilmek adına, “Startup” class’ını da aşağıdaki gibi güncelleyelim.

Yukarıdaki kod bloğuna bakarsak HttpClient‘ı, Azure subscription key’i ve “TextAnalyticsAPI” name’i ile inject ettik. Ardından oluşturmuş olduğumuz “ITextAnalyticsService“, “IProductService” ve “IProductCommentService” interface’lerinin injection işlemlerini gerçekleştirdik.

DbContext’i ise, in-memory olarak belirledik. “Configure” method’u içerisinde ise DbContext’e erişerek, sample dataset’imizin initialize edilmesini sağladık.

Şimdi ise ilgili cofiguration key’lerini, “appsettings” json file’ı içerisine aşağıdaki gibi ekleyelim.

Burada eklemiş olduğumuz “TextAnalyticsAPIBaseAddress“, “TextAnalyticsAPISentimentResourceURI” ve “TextAnalyticsAPIKey” bilgilerine, makalenin giriş bölümünde Azure Portal üzerinden oluşturmuş olduğumuz Text Analytics resource’u içerisinden ulaşabilirsiniz.

Artık test etmeye hazırız.

Öncelikle API‘ı, “dotnet run” komutu ile çalıştıralım. Ardından olumlu comment’ler ile hazırlamış olduğumuz “1” numaralı örnek product’ı, “https://localhost:5001/api/products/1” endpoint’i üzerinden GET edelim.

Gelen response’a bakarsak, 4 comment’in sentiment sonuçlarından yola çıkarak ortalama bir “customerRating” oranı elde ettiğimizi görebiliriz. “0” ile “1” aralığında değerlendirilen bu sonuç ile, kullanıcıların bu ürünü ortalama %77 lik bir oran ile olumlu değerlendirdiklerini söyleyebiliriz.

Şimdi ise biraz olumsuz comment’ler içeren “2” numaralı örnek product’ı GET edelim ve sonucuna bir göz atalım.

Bu senaryoda ise product biraz olumsuz comment’ler içerdiği için, sentiment analizi sonucunda ortalama %49 luk bir “customerRating” oranı ile response olarak karşımıza gelmektedir.

4) Sonuç

Makalenin giriş bölümünde de bahsettiğim gibi, dilerseniz kendi sentiment analyser’ınızı Python‘ın VADER NLTK paketi gibi farklı dil ve tool’lar ile oluşturabilirsiniz. İsterseniz de bizlere bir çok açıdan hız katan hazır cloud provider’larından yararlanabilirsiniz. Bu makale kapsamında ise Azure Text Analytics API‘ını kullanarak, hızlı bir şekilde .NET Core 2.1 ortamında bir e-ticaret platformundaki ürün yorumları üzerinde sentiment analizinden nasıl faydalanabiliriz konusuna bakmaya çalıştık.

https://github.com/GokGokalp/AzureTextAnalyticsAPI-Sentiment-Sample

Referanslar

https://docs.microsoft.com/en-us/azure/cognitive-services/text-analytics/quickstarts/csharp
https://docs.microsoft.com/en-us/azure/cognitive-services/text-analytics/overview

Bu makale toplam (568) kez okunmuştur.

11
0



Kategori: ASP.NET Core Azure

6 Yorum

  1. Asp.NET’te yazılan bir ERP projesine doğal dil işleme eklenmek istense, ve azurenin yapıtğı olayı farklı bir bakış acısı ile yazılması öngörülse,

    Bu algoritmayı sadece ar-ge olabilecek kısımlarının Pyhton ya da Core tabanlı olarak

    hangisinde yazılması daha isabetli olur. Bu noktada görüşünüzü alabilir miyim.

    • Merhaba ar-ge kapsamında değerlendirmek istiyorsanız, tabi ki bu logic’i kendiniz istediğiniz bir dil ile yazmanız isabetli olacaktır. Bu konuda Python diyebilirim, hem community hemde kullanabileceğiniz library’ler konusunda daha zengin bir seçim olacaktır.

      Teşekkürler.

  2. Father of Junior Dad Father of Junior Dad

    Merhaba. Gece 3 te okudum. Uykumdan ettin 🙂 kalktım denedim. Güzel bir anlatım olmuş. Teşekkürler

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.