{"id":2286,"date":"2018-12-25T22:11:54","date_gmt":"2018-12-25T19:11:54","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=2286"},"modified":"2018-12-25T22:16:29","modified_gmt":"2018-12-25T19:16:29","slug":"sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/","title":{"rendered":".NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Bir s\u00fcredir b\u00fcy\u00fck ilgi alanlar\u0131m aras\u0131nda olan &#8220;<em>Machine Learning<\/em>&#8221; ve &#8220;<em>Natural Language Processing<\/em>&#8221;\u00a0konular\u0131 \u00fczerinde ara\u015ft\u0131rmalar ve denemeler yapmaktay\u0131m. Bu ara\u015ft\u0131rmalar\u0131m ve denemelerim s\u0131ras\u0131nda ise i\u015f hayat\u0131mda bulunuyor oldu\u011fum domain i\u00e7erisinde, bu konular\u0131 nas\u0131l ve nerede implemente edebilirim sorular\u0131n\u0131 da d\u00fc\u015f\u00fcnmekteyim. (G\u00fcn\u00fcn sonunda, implemente etti\u011fimiz bir fikrin son kullan\u0131c\u0131ya olan g\u00fczel etkisini g\u00f6rebilmek, bir developer olarak mutluluk veriyor de\u011fil mi?)<\/p>\n<p>Bu makale kapsam\u0131nda ise <em><strong>.NET Core<\/strong><\/em> ve <em><strong>Azure Text Analytics API<\/strong><\/em> kullanarak, bir e-ticaret firmas\u0131ndaki \u00fcr\u00fcn yorumlar\u0131 \u00fczerinde <strong>s<em>entiment<\/em><\/strong> analizi ger\u00e7ekle\u015ftirece\u011fiz. Sentiment analizindeki amac\u0131m\u0131z ise bir son kullan\u0131c\u0131n\u0131n bir \u00fcr\u00fcn hakk\u0131ndaki yorumlar\u0131 okumadan, h\u0131zl\u0131 bir \u015fekilde fikir sahibi olabilmesini sa\u011flamak y\u00f6n\u00fcnde olacakt\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2018\/07\/sentiment-analysis.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-2287 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/07\/sentiment-analysis.jpg\" alt=\"\" width=\"894\" height=\"436\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/07\/sentiment-analysis.jpg 1600w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/07\/sentiment-analysis-300x146.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/07\/sentiment-analysis-768x374.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/07\/sentiment-analysis-1024x499.jpg 1024w\" data-sizes=\"(max-width: 894px) 100vw, 894px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 894px; --smush-placeholder-aspect-ratio: 894\/436;\" \/><\/a><\/p>\n<p>\u00d6ncelikle <em>sentiment<\/em> analizi nedir, k\u0131saca bir giri\u015f yapmak istiyorum.<\/p>\n<h2>1)<em> Sentiment<\/em> Analizi Nedir?<\/h2>\n<p>K\u0131saca <em>sentiment<\/em> analizi i\u00e7in:<\/p>\n<blockquote><p>Bir yaz\u0131 par\u00e7as\u0131ndan <em>olumlu<\/em> veya <em>olumsuz<\/em> g\u00f6r\u00fc\u015flerin belirlenmesi s\u00fcrecidir diyebiliriz.<\/p><\/blockquote>\n<p>Ayr\u0131ca bir konu\u015fmac\u0131n\u0131n d\u00fc\u015f\u00fcncesini veya tutumunu inceleyen, fikir madencili\u011fi olarak da bilinir. \u00d6zellikle <em>machine learning<\/em>&#8216;in h\u0131zla ilerlemesiyle beraber, g\u00fcn\u00fcm\u00fcz teknoloji \u00e7a\u011f\u0131nda sentiment analizleri \u00fczerinde de b\u00fcy\u00fck \u00e7al\u0131\u015fmalar yap\u0131lmaktad\u0131r.. Ge\u00e7mi\u015fe d\u00f6n\u00fcp bir 10 y\u0131l \u00f6ncesini hat\u0131rlarsak, forex firmalar\u0131 i\u00e7erisinde de piyasalar\u0131n sentiment analizlerinin \u00e7\u0131kart\u0131l\u0131p, bu analizler do\u011frultusunda al\u0131m ve sat\u0131m i\u015flemlerinin yap\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz. (Oynayanlar bilir)<\/p>\n<p>G\u00fcn\u00fcm\u00fczde ise firmalar, kendi \u00fcr\u00fcnleri hakk\u0131nda sosyal medya \u00fczerinde ne d\u00fc\u015f\u00fcn\u00fcl\u00fcyor gibi fikirleri \u00f6\u011frenebilmek i\u00e7in, olduk\u00e7a yayg\u0131n olarak sentiment analizi gibi hizmetleri kullanmaktad\u0131rlar.<\/p>\n<p>\u00d6rne\u011fin\u00a0<em>twitter<\/em> veya <em>instagram<\/em> \u00fczerinde yedi\u011fimiz-i\u00e7ti\u011fimiz \u015feyleri, duygular\u0131m\u0131z\u0131 genelde payla\u015fmaktay\u0131z. Bu payla\u015f\u0131m i\u015flemleri basit bir olay gibi g\u00f6z\u00fckebilir, fakat bir \u00e7ok firma hangi \u00fcr\u00fcnlere veya hangi y\u00f6ne a\u011f\u0131rl\u0131k vermeleri gerekti\u011fi bilgilerini bu payla\u015f\u0131mlardan ve analizlerinden yola \u00e7\u0131karak belirleyebilmektedir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2018\/11\/WhichWay.jpeg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2350 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/11\/WhichWay.jpeg\" alt=\"\" width=\"480\" height=\"360\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/WhichWay.jpeg 480w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/WhichWay-300x225.jpeg 300w\" data-sizes=\"(max-width: 480px) 100vw, 480px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 480px; --smush-placeholder-aspect-ratio: 480\/360;\" \/><\/a><\/p>\n<p>Biz ise bu makale kapsam\u0131nda\u00a0sentiment analizini, kullan\u0131c\u0131lar\u0131n \u00fcr\u00fcnler hakk\u0131nda ne hissettiklerini ke\u015ffedip, bir sonraki kullan\u0131c\u0131ya tercih edece\u011fi \u00fcr\u00fcn hakk\u0131nda daha h\u0131zl\u0131 karar verip, sat\u0131n alabilmesi amac\u0131yla esneklik sa\u011flamak i\u00e7in kullanaca\u011f\u0131z.<\/p>\n<p>Sentiment analizini ger\u00e7ekle\u015ftirebilmenin bir \u00e7ok farkl\u0131 y\u00f6ntemi mevcut. \u00d6rne\u011fin,\u00a0<em>Python<\/em>&#8216;\u0131n <em>VADER<\/em>\u00a0<a href=\"https:\/\/www.nltk.org\/_modules\/nltk\/sentiment\/vader.html\" target=\"_blank\" rel=\"noopener\"><em>NLTK<\/em><\/a> paketi ile kendi sentiment analyser&#8217;\u0131n\u0131z\u0131 olu\u015fturabilirsiniz (\u00dczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m bir tool, ilerleyen makale konusu olarak de\u011ferlendirebilirim) veya bizi h\u0131zland\u0131racak bir cloud provider <em>API<\/em>&#8216;\u0131 tercih edebilirsiniz.<\/p>\n<p>Biz bu makale kapsam\u0131nda ise sentiment analizini,\u00a0<em>Azure Text Analytics API<\/em>&#8216;\u0131 kullanarak ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<h2>2)\u00a0<em>Azure Text Analytics API<\/em><\/h2>\n<p><a href=\"\/wp-content\/uploads\/2018\/08\/sentiment_analysis.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2296 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/08\/sentiment_analysis.png\" alt=\"\" width=\"810\" height=\"430\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/08\/sentiment_analysis.png 810w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/08\/sentiment_analysis-300x159.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/08\/sentiment_analysis-768x408.png 768w\" data-sizes=\"(max-width: 810px) 100vw, 810px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 810px; --smush-placeholder-aspect-ratio: 810\/430;\" \/><\/a><\/p>\n<p>Peki nedir bu<em> Azure Text Analytics API <\/em>ve bize neler sunuyor?<\/p>\n<p><em>Azure Text Analytics API<\/em>, raw text \u00fczerinden\u00a0<em>advanced natural language processing<\/em>(geli\u015fmi\u015f do\u011fal dil i\u015fleme) ger\u00e7ekle\u015ftirebilmemize olanak sa\u011flayan bir cloud-based hizmettir. \u00d6zellikle &#8220;<em>time to market<\/em>&#8221; s\u00f6z konusu oldu\u011funda, <em>Azure Text Analytics API<\/em> gibi cloud hizmetleri bizlere olduk\u00e7a fazla &#8220;<strong>h\u0131z<\/strong>&#8221; ve &#8220;<strong>zaman<\/strong>&#8221; kazand\u0131rmaktad\u0131r.<\/p>\n<p><em>Azure Text Analytics API<\/em>, a\u015fa\u011f\u0131daki 4 ana fonksiyonu i\u00e7ermektedir:<\/p>\n<ol>\n<li><strong>Sentiment Analysis<\/strong>: Makalemizin de konusu olan, kullan\u0131c\u0131lar\u0131n \u00fcr\u00fcnler hakk\u0131nda ne d\u00fc\u015f\u00fcnd\u00fcklerini analiz edebilmemizi sa\u011flayan hizmeti.<\/li>\n<li><strong>Key Phrase Extraction<\/strong>: Bir c\u00fcmle i\u00e7erisindeki ana noktalar\u0131 h\u0131zl\u0131ca tan\u0131mlayabilmemiz i\u00e7in anahtar s\u00f6zc\u00fckleri \u00e7\u0131kartabilmemizi sa\u011flayan hizmeti.<\/li>\n<li><strong>Language Detection<\/strong>: 120 dile kadar giri\u015f metninin hangi dilde yaz\u0131ld\u0131\u011f\u0131n\u0131 tespit edebilmemizi sa\u011flayan hizmeti.<\/li>\n<li><strong>Entity Linking<\/strong>: Metin i\u00e7erisindeki bilinen varl\u0131klar\u0131n hakk\u0131nda daha fazla bilgiye ula\u015f\u0131labilmesi i\u00e7in, linkleyebilmemizi sa\u011flayan hizmeti. (Hen\u00fcz preview durumda)<\/li>\n<\/ol>\n<blockquote><p><strong>NOT<\/strong>: Free tier&#8217;\u0131 se\u00e7erek, ayl\u0131k <strong><em>5000<\/em><\/strong> transaction&#8217;a kadar \u00fccretsiz olarak kullanabilmek m\u00fcmk\u00fcnd\u00fcr.<\/p><\/blockquote>\n<h3>2.1)<em>\u00a0Text Analytics Resource&#8217;unu Olu\u015fturmak<\/em><\/h3>\n<p><em>Text Analytics API<\/em>&#8216;\u0131 kullanabilmek i\u00e7in <em>Azure<\/em>\u00a0marketplace \u00fczerinden &#8220;<em>AI + Machine Learning<\/em>&#8221; sekmesine girelim ve &#8220;<em>Text Analytics<\/em>&#8221; i se\u00e7elim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2018\/11\/text_analytics_api.jpeg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2315 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/11\/text_analytics_api.jpeg\" alt=\"\" width=\"1626\" height=\"1224\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api.jpeg 1626w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api-300x226.jpeg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api-768x578.jpeg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api-1024x771.jpeg 1024w\" data-sizes=\"(max-width: 1626px) 100vw, 1626px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1626px; --smush-placeholder-aspect-ratio: 1626\/1224;\" \/><\/a><\/p>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki gerekli alanlar\u0131, kendi se\u00e7imlerimize g\u00f6re doldural\u0131m ve <strong>create<\/strong> butonuna basal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2018\/11\/text_analytics_api_create_1.jpeg\"><img decoding=\"async\" class=\"size-full wp-image-2316 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2018\/11\/text_analytics_api_create_1.jpeg\" alt=\"\" width=\"1080\" height=\"884\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api_create_1.jpeg 1080w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api_create_1-300x246.jpeg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api_create_1-768x629.jpeg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api_create_1-1024x838.jpeg 1024w\" data-sizes=\"(max-width: 1080px) 100vw, 1080px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1080px; --smush-placeholder-aspect-ratio: 1080\/884;\" \/><\/a><\/p>\n<p>Art\u0131k API haz\u0131r durumda.<\/p>\n<p>A\u015fa\u011f\u0131daki overview ekran&#8217;\u0131 \u00fczerinden <em>Azure Text Analytics API<\/em>&#8216;\u0131n\u0131n, makalenin ilerleyen b\u00f6l\u00fcmlerinde kullanabilmek i\u00e7in &#8220;<em>endpoint<\/em>&#8221; ve &#8220;<em>key<\/em>&#8221; bilgilerine eri\u015febilmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2018\/11\/text_analytics_api_endpoint.jpeg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2320 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/11\/text_analytics_api_endpoint.jpeg\" alt=\"\" width=\"2974\" height=\"640\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api_endpoint.jpeg 2974w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api_endpoint-300x65.jpeg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api_endpoint-768x165.jpeg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/text_analytics_api_endpoint-1024x220.jpeg 1024w\" data-sizes=\"(max-width: 2974px) 100vw, 2974px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2974px; --smush-placeholder-aspect-ratio: 2974\/640;\" \/><\/a><\/p>\n<h2>3) .NET Core ile\u00a0<em>Azure Text Analytics API Kullan\u0131m\u0131<\/em><\/h2>\n<p>Bir e-ticaret firmas\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z\u0131 ve kullan\u0131c\u0131lar\u0131n sat\u0131n ald\u0131klar\u0131 \u00fcr\u00fcnler i\u00e7in yorum yapabildiklerini varsayal\u0131m. San\u0131r\u0131m bir \u00fcr\u00fcn\u00fc sat\u0131n almadan \u00f6nce o \u00fcr\u00fcn i\u00e7in yap\u0131lm\u0131\u015f olan yorumlar\u0131 okuyabilmek, hem son kullan\u0131c\u0131 a\u00e7\u0131s\u0131ndan hem de ilgili firma a\u00e7\u0131s\u0131ndan \u00f6nemli bir fonksiyonalitedir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2018\/11\/reading.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-2325 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/11\/reading.jpg\" alt=\"\" width=\"810\" height=\"540\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/reading.jpg 1000w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/reading-300x200.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/reading-768x512.jpg 768w\" data-sizes=\"(max-width: 810px) 100vw, 810px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 810px; --smush-placeholder-aspect-ratio: 810\/540;\" \/><\/a><\/p>\n<p>Peki, son kullan\u0131c\u0131lar\u0131n t\u00fcm yorumlar\u0131 okuyup bir \u00fcr\u00fcn se\u00e7imi yapmalar\u0131n\u0131n yerine, biz onlar i\u00e7in t\u00fcm \u00fcr\u00fcn yorumlar\u0131 \u00fczerinde bir sentiment analizi ger\u00e7ekle\u015ftirerek, her bir \u00fcr\u00fcn i\u00e7in ortalama bir son kullan\u0131c\u0131 puan\u0131 g\u00f6sterebilsek, harika olmaz m\u0131? Hem son kullan\u0131c\u0131lar t\u00fcm yorumlar\u0131 okuyarak fazla vakit kaybetmemi\u015f olurlar hem de biz son kullan\u0131c\u0131n\u0131n ziyaretini h\u0131zl\u0131ca sat\u0131\u015fa \u00e7evirebilme imkan\u0131 elde etmi\u015f olabiliriz.<\/p>\n<p>Haydi ozaman i\u015f ba\u015f\u0131na.<\/p>\n<p>\u0130lk olarak a\u015fa\u011f\u0131daki gibi &#8220;<em>SentimentAnalysisWithNETCoreExample<\/em>&#8221; isminde bir <em>.NET Core<\/em>\u00a0&#8220;<em>webapi<\/em>&#8221; projesi olu\u015ftural\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">dotnet new webapi -n SentimentAnalysisWithNETCoreExample<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2018\/08\/create-new-project-for-sentiment.jpeg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2298 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/08\/create-new-project-for-sentiment.jpeg\" alt=\"\" width=\"2306\" height=\"778\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/08\/create-new-project-for-sentiment.jpeg 2306w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/08\/create-new-project-for-sentiment-300x101.jpeg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/08\/create-new-project-for-sentiment-768x259.jpeg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/08\/create-new-project-for-sentiment-1024x345.jpeg 1024w\" data-sizes=\"(max-width: 2306px) 100vw, 2306px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2306px; --smush-placeholder-aspect-ratio: 2306\/778;\" \/><\/a><\/p>\n<p>Ard\u0131ndan projeye a\u015fa\u011f\u0131daki komut sat\u0131r\u0131 ile &#8220;<em>Microsoft.EntityFrameworkCore<\/em>&#8221; paketini dahil edelim.<\/p>\n<pre class=\"lang:default decode:true \">dotnet add package Microsoft.EntityFrameworkCore<\/pre>\n<p>Art\u0131k domain modellerimizi tan\u0131mlayabiliriz.<\/p>\n<p>&#8220;<em>Models<\/em>&#8221; isminde bir klas\u00f6r olu\u015fturarak, i\u00e7erisinde &#8220;<em>Domain<\/em>&#8221; isminde yeni bir klas\u00f6r daha olu\u015ftural\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">-&gt; SentimentAnalysisWithNETCoreExample\r\n--&gt; Models\r\n---&gt; Domain<\/pre>\n<p>\u015eimdi &#8220;<em>Domain<\/em>&#8221; klas\u00f6r\u00fc i\u00e7erisinde ise, a\u015fa\u011f\u0131daki gibi bir &#8220;<em>Product<\/em>&#8221; class&#8217;\u0131 ekleyelim.<\/p>\n<pre class=\"lang:default decode:true\">using System.Collections.Generic;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Models.Domain\r\n{\r\n    public class Product\r\n    {\r\n        public Product()\r\n        {\r\n            this.Comments = new List&lt;Comment&gt;();\r\n        }\r\n\r\n        public int ID { get; set; }\r\n        public string Name { get; set; }\r\n        public string Category { get; set; }\r\n        public double Price { get; set; }\r\n        public double CustomerRating { get; set; }\r\n\r\n        public ICollection&lt;Comment&gt; Comments { get; set; }\r\n    }\r\n}<\/pre>\n<p>Bizim i\u00e7in buradaki \u00f6nemli nokta, &#8220;<em>CustomerRating<\/em>&#8221; property&#8217;si. Bu property&#8217;nin value&#8217;sunu, product comment&#8217;lerinin sentiment analizi sonucunda \u00e7\u0131kan score&#8217;lar\u0131n ortalamas\u0131 ile dolduraca\u011f\u0131z.<\/p>\n<p>\u015eimdi ise &#8220;<em>Domain<\/em>&#8221; klas\u00f6r\u00fc i\u00e7erisine, &#8220;<em>Comment<\/em>&#8221; isminde bir class daha ekleyelim.<\/p>\n<pre class=\"lang:default decode:true\">namespace SentimentAnalysisWithNETCoreExample.Models.Domain\r\n{\r\n    public class Comment\r\n    {\r\n        public int ID { get; set; }\r\n        public int ProductID { get; set; }\r\n        public string Content { get; set; }\r\n        public double? SentimentScore { get; set; }\r\n    }\r\n}<\/pre>\n<p>Bu class i\u00e7erisindeki &#8220;<em>SentimentScore<\/em>&#8221; property&#8217;sinin value&#8217;sunda ise, her bir comment&#8217;in kendi sentiment score&#8217;unu tutaca\u011f\u0131z.<\/p>\n<p>Art\u0131k data context&#8217;i ve sample dataset&#8217;i olu\u015fturabiliriz. &#8220;<em>Data<\/em>&#8221; isminde root dizinde bir klas\u00f6r olu\u015ftural\u0131m ve i\u00e7erisinde &#8220;<em>ProductDBContext<\/em>&#8221; isminde a\u015fa\u011f\u0131daki gibi bir class ekleyelim.<\/p>\n<pre class=\"lang:default decode:true\">using Microsoft.EntityFrameworkCore;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Domain;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Data\r\n{\r\n    public class ProductDBContext : DbContext\r\n    {\r\n        public ProductDBContext(DbContextOptions&lt;ProductDBContext&gt; options)\r\n            : base(options)\r\n        {\r\n\r\n        }\r\n\r\n        public DbSet&lt;Product&gt; Products { get; set; }\r\n        public DbSet&lt;Comment&gt; Comments { get; set; }\r\n\r\n        protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n        {\r\n            #region Products\r\n            var product_1 = new Product()\r\n            {\r\n                ID = 1,\r\n                Name = \"Samsung Note 9\",\r\n                Category = \"Cep Telefonu\",\r\n                Price = 600\r\n            };\r\n\r\n            var product_2 = new Product()\r\n            {\r\n                ID = 2,\r\n                Name = \"Samsung Galaxy 9\",\r\n                Category = \"Cep Telefonu\",\r\n                Price = 550\r\n            };\r\n\r\n            modelBuilder.Entity&lt;Product&gt;().HasData(product_1, product_2);\r\n            #endregion\r\n\r\n            #region Comments\r\n            var comment_1 = new Comment()\r\n            {\r\n                ID = 1,\r\n                ProductID = 1,\r\n                Content = \"\u00c7ok harika bir telefon. \u00c7ok memnunum. Herkese tavsiye ederim.\"\r\n            };\r\n\r\n            var comment_2 = new Comment()\r\n            {\r\n                ID = 2,\r\n                ProductID = 1,\r\n                Content = \"G\u00fczel telefon, gayet kullan\u0131\u015fl\u0131.\"\r\n            };\r\n\r\n            var comment_3 = new Comment()\r\n            {\r\n                ID = 3,\r\n                ProductID = 1,\r\n                Content = \"H\u0131zl\u0131 telefon, be\u011fendim.\"\r\n            };\r\n\r\n            var comment_4 = new Comment()\r\n            {\r\n                ID = 4,\r\n                ProductID = 1,\r\n                Content = \"Bataryas\u0131 \u00e7ok iyi dayan\u0131yor tavsiye ederim.\"\r\n            };\r\n\r\n            var comment_5 = new Comment()\r\n            {\r\n                ID = 5,\r\n                ProductID = 2,\r\n                Content = \"Fena de\u011fil. Biraz \u0131s\u0131n\u0131yor. Daha iyi olabilirdi.\"\r\n            };\r\n\r\n            var comment_6 = new Comment()\r\n            {\r\n                ID = 6,\r\n                ProductID = 2,\r\n                Content = \"Kasas\u0131n\u0131 be\u011fenmedim. Elden \u00e7ok kay\u0131yor.\"\r\n            };\r\n\r\n            var comment_7 = new Comment()\r\n            {\r\n                ID = 7,\r\n                ProductID = 2,\r\n                Content = \"Memnunum, kameras\u0131 \u00e7ok iyi.\"\r\n            };\r\n\r\n            var comment_8 = new Comment()\r\n            {\r\n                ID = 8,\r\n                ProductID = 2,\r\n                Content = \"Kameras\u0131n\u0131n gece \u00e7ekimini be\u011fenmedim.\"\r\n            };\r\n\r\n            modelBuilder.Entity&lt;Comment&gt;().HasData(comment_1, comment_2, comment_3, comment_4, comment_5, comment_6, comment_7, comment_8);\r\n            #endregion\r\n\r\n            base.OnModelCreating(modelBuilder);\r\n        }\r\n    }\r\n}<\/pre>\n<p>Data context&#8217;i standart olarak &#8220;<em>DbContext<\/em>&#8221; class&#8217;\u0131ndan inherit alarak olu\u015fturduk. \u0130\u00e7erisinde &#8220;<em>Products<\/em>&#8221; ve &#8220;<em>Comments<\/em>&#8221; dbset&#8217;lerini tan\u0131mlad\u0131k. \u00d6rnek dataset&#8217;e sahip olabilmek i\u00e7in, &#8220;<em>OnModelCreating<\/em>&#8221; method&#8217;u i\u00e7erisinde bir ka\u00e7 product ve onlara comment&#8217;ler ekledik.<\/p>\n<p>\u015eimdi ise, business service&#8217;leri kodlamaya ba\u015flamadan \u00f6nce request &amp; response modellerimizi tan\u0131mlayal\u0131m.<\/p>\n<p>Bunun i\u00e7in &#8220;<em>Models<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda, &#8220;<em>Requests<\/em>&#8221; ve &#8220;<em>Responses<\/em>&#8221; klas\u00f6r\u00fclerini olu\u015ftural\u0131m. Ard\u0131ndan &#8220;<em>Requests<\/em>&#8221; klas\u00f6r\u00fcn\u00fcn i\u00e7erisinde a\u015fa\u011f\u0131daki gibi &#8220;<em>GetSentimentAnalysisRequest<\/em>&#8221; ve &#8220;<em>GetSentimentAnalysisRequestItem<\/em>&#8221; class&#8217;lar\u0131n\u0131 tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">using System.Collections.Generic;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Models.Requests\r\n{\r\n    public class GetSentimentAnalysisRequest\r\n    {\r\n        public GetSentimentAnalysisRequest()\r\n        {\r\n            Documents = new List&lt;GetSentimentAnalysisRequestItem&gt;();\r\n        }\r\n\r\n        public IList&lt;GetSentimentAnalysisRequestItem&gt; Documents { get; set; }\r\n    }\r\n}<\/pre>\n<pre class=\"lang:default decode:true\">namespace SentimentAnalysisWithNETCoreExample.Models.Requests\r\n{\r\n    public class GetSentimentAnalysisRequestItem\r\n    {\r\n        public string Language { get; set; }\r\n        public string Id { get; set; }\r\n        public string Text { get; set; }\r\n    }\r\n}<\/pre>\n<p>&#8220;<em>GetSentimentAnalysisRequest<\/em>&#8221; ve &#8220;<em>GetSentimentAnalysisRequestItem<\/em>&#8221; class&#8217;lar\u0131n\u0131, <em>Azure Text Analytics API<\/em>&#8216;\u0131n sentiment endpoint&#8217;ini call edebilmek i\u00e7in kullanaca\u011f\u0131z.<\/p>\n<p>Sentiment endpoint&#8217;i a\u015fa\u011f\u0131daki gibi bir request&#8217;i bizden beklemektedir:<\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"documents\": [\r\n    {\r\n      \"language\": \"comment lang\",\r\n      \"id\": \"comment id\",\r\n      \"text\": \"comment\"\r\n    },\r\n    {\r\n      \"language\": \"comment lang\",\r\n      \"id\": \"comment id\",\r\n      \"text\": \"comment\"\r\n    }\r\n  ]\r\n}<\/pre>\n<blockquote><p><strong>NOT<\/strong>: <em>Azure Text Analytics API<\/em>&#8216;\u0131n sentiment endpoint&#8217;ini kullanabilmek i\u00e7in haz\u0131r bir <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Azure.CognitiveServices.Language.TextAnalytics\/2.8.0-preview\" target=\"_blank\" rel=\"noopener\"><em>NuGet<\/em><\/a> package&#8217;\u0131 mevcut. Fakat preview durumdad\u0131r ve hen\u00fcz\u00a0<em>.NET Standard<\/em> 1.4&#8217;\u00fc desteklemektedir. Bu sebeple\u00a0<em>.NET Core 2.1<\/em> uygulamas\u0131nda kullanabilmek i\u00e7in, kendi request modellerimizi ve service&#8217;imizi implemente edece\u011fiz.<\/p><\/blockquote>\n<p>Sentiment endpoint&#8217;inin response modellerini ise, olu\u015fturmu\u015f oldu\u011fumuz &#8220;<em>Responses<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda tan\u0131mlayaca\u011f\u0131z.<\/p>\n<p>&#8220;<em>GetSentimentAnalysisResponse<\/em>&#8221; ve &#8220;<em>GetSentimentAnalysisResponseItem<\/em>&#8221; ismindeki iki adet class&#8217;\u0131, &#8220;<em>Responses<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda a\u015fa\u011f\u0131daki gibi olu\u015ftural\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">using System.Collections.Generic;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Models.Responses\r\n{\r\n    public class GetSentimentAnalysisResponse\r\n    {\r\n        public IList&lt;GetSentimentAnalysisResponseItem&gt; Documents { get; set; }\r\n    }\r\n}<\/pre>\n<pre class=\"lang:default decode:true\">namespace SentimentAnalysisWithNETCoreExample.Models.Responses\r\n{\r\n    public class GetSentimentAnalysisResponseItem\r\n    {\r\n        public string Id { get; set; }\r\n        public double? Score { get; set; }\r\n    }\r\n}<\/pre>\n<p>Art\u0131k sentiment sonu\u00e7lar\u0131n\u0131 alabilece\u011fimiz response modellerini de tan\u0131mlad\u0131\u011f\u0131m\u0131za g\u00f6re, service&#8217;i implemente etmeye ba\u015flayabiliriz.<\/p>\n<p>Bunun i\u00e7in root dizinde &#8220;<em>Services<\/em>&#8221; isminde yeni bir klas\u00f6r olu\u015ftural\u0131m ve i\u00e7erisinde &#8220;<em>ITextAnalyticsService<\/em>&#8221; isminde bir interface tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">using System.Threading.Tasks;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Requests;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Responses;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Services\r\n{\r\n    public interface ITextAnalyticsService\r\n    {\r\n         Task&lt;GetSentimentAnalysisResponse&gt; GetSentimentAsync(GetSentimentAnalysisRequest request);\r\n    }\r\n}<\/pre>\n<p>Ard\u0131ndan &#8220;<em>Services<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda &#8220;<em>Implementations<\/em>&#8221; isminde bir yeni klas\u00f6r daha olu\u015ftural\u0131m ve i\u00e7erisine &#8220;<em>TextAnalyticsService<\/em>&#8221; isminde bir class yarat\u0131p, &#8220;<em>ITextAnalyticsService<\/em>&#8221; interface&#8217;ini a\u015fa\u011f\u0131daki gibi implemente edelim.<\/p>\n<pre class=\"lang:default decode:true\">using System.Net;\r\nusing System.Net.Http;\r\nusing System.Threading.Tasks;\r\nusing Microsoft.Extensions.Configuration;\r\nusing Newtonsoft.Json;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Requests;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Responses;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Services.Implementations\r\n{\r\n    public class TextAnalyticsService : ITextAnalyticsService\r\n    {\r\n        private readonly IHttpClientFactory _httpClientFactory;\r\n        private readonly IConfiguration _configuration;\r\n\r\n        public TextAnalyticsService(IHttpClientFactory httpClientFactory, IConfiguration configuration)\r\n        {\r\n            _httpClientFactory = httpClientFactory;\r\n            _configuration = configuration;\r\n        }\r\n\r\n        public async Task&lt;GetSentimentAnalysisResponse&gt; GetSentimentAsync(GetSentimentAnalysisRequest request)\r\n        {\r\n            HttpClient client = _httpClientFactory.CreateClient(\"TextAnalyticsAPI\");\r\n\r\n            var sentimentResponse = await client.PostAsJsonAsync(\r\n                    requestUri: _configuration.GetValue&lt;string&gt;(\"TextAnalyticsAPISentimentResourceURI\"), \r\n                    value: request);\r\n\r\n            GetSentimentAnalysisResponse getSentimentAnalysisResponse = null;\r\n\r\n            if(sentimentResponse.StatusCode == HttpStatusCode.OK)\r\n            {\r\n                getSentimentAnalysisResponse = await sentimentResponse.Content.ReadAsAsync&lt;GetSentimentAnalysisResponse&gt;();\r\n            }\r\n\r\n            return getSentimentAnalysisResponse;\r\n        }\r\n    }\r\n}<\/pre>\n<p>&#8220;<em>TextAnalyticsService<\/em>&#8221; i\u00e7erisinde yapt\u0131\u011f\u0131m\u0131z i\u015flem gayet basit.<\/p>\n<p><em>HttpClientFactory<\/em>&#8216;i &#8220;<em>TextAnalyticsAPI<\/em>&#8221; key&#8217;i \u00fczerinden named-client y\u00f6ntemi ile olu\u015fturduk. Ard\u0131ndan &#8220;<em>IConfiguration<\/em>&#8221; service&#8217;i \u00fczerinden ilgili <em>Azure Text Analytics API<\/em>&#8216;\u0131n sentiment resource <em>URI<\/em>&#8216;\u0131n\u0131 alarak, <em>POST<\/em> i\u015flemini ger\u00e7ekle\u015ftirdik. E\u011fer i\u015flem ba\u015far\u0131l\u0131ysa tamamlan\u0131yorsa, response&#8217;u daha \u00f6nce olu\u015fturmu\u015f oldu\u011fumuz &#8220;<em>GetSentimentAnalysisResponse<\/em>&#8221; model&#8217;i ile map&#8217;liyoruz.<\/p>\n<p>\u015eimdi ise product comment&#8217;leri ile ilgili i\u015flemleri implemente edece\u011fimiz service&#8217;in interface&#8217;ini, a\u015fa\u011f\u0131daki gibi &#8220;<em>Services<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda tan\u0131mlayal\u0131m.<\/p>\n<p>&#8220;<em>IProductCommentService<\/em>&#8221;<\/p>\n<pre class=\"lang:default decode:true\">using System.Collections.Generic;\r\nusing System.Threading.Tasks;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Domain;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Services\r\n{\r\n    public interface IProductCommentService\r\n    {\r\n        Task&lt;List&lt;Comment&gt;&gt; GetComments(int productId);\r\n        Task&lt;List&lt;Comment&gt;&gt; CalculateCommentsSentimentScoreAsync(List&lt;Comment&gt; comments);\r\n    }\r\n}<\/pre>\n<p>Ard\u0131ndan &#8220;<em>Services<\/em>&#8221; klas\u00f6r\u00fc alt\u0131ndaki &#8220;<em>Implementations<\/em>&#8221; klas\u00f6r\u00fc i\u00e7erisinde, &#8220;<em>ProductCommentService<\/em>&#8221; isminde bir class daha olu\u015ftural\u0131m ve &#8220;<em>IProductCommentService<\/em>&#8221; interface&#8217;ini a\u015fa\u011f\u0131daki gibi implemente edelim.<\/p>\n<pre class=\"lang:default decode:true\">using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\nusing Microsoft.EntityFrameworkCore;\r\nusing SentimentAnalysisWithNETCoreExample.Data;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Domain;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Requests;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Responses;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Services.Implementations\r\n{\r\n    public class ProductCommentService : IProductCommentService\r\n    {\r\n        private const string LANG = \"tr\";\r\n        private readonly ProductDBContext _productDBContext;\r\n        private readonly ITextAnalyticsService _textAnalyticsService;\r\n\r\n        public ProductCommentService(ProductDBContext productDBContext, ITextAnalyticsService textAnalyticsService)\r\n        {\r\n            _productDBContext = productDBContext;\r\n            _textAnalyticsService = textAnalyticsService;\r\n        }\r\n\r\n        public async Task&lt;List&lt;Comment&gt;&gt; GetComments(int productId)\r\n        {\r\n            List&lt;Comment&gt; comments = await _productDBContext.Comments.Where(c =&gt; c.ProductID == productId)\r\n                                        .ToListAsync();\r\n\r\n            return comments;\r\n        }\r\n\r\n        public async Task&lt;List&lt;Comment&gt;&gt; CalculateCommentsSentimentScoreAsync(List&lt;Comment&gt; comments)\r\n        {\r\n            var getSentimentAnalysisRequest = new GetSentimentAnalysisRequest();\r\n\r\n            comments.ForEach(comment =&gt;\r\n            {\r\n                var multiLanguageInput = new GetSentimentAnalysisRequestItem()\r\n                {\r\n                    Language = LANG,\r\n                    Id = comment.ID.ToString(),\r\n                    Text = comment.Content\r\n                };\r\n\r\n                getSentimentAnalysisRequest.Documents.Add(multiLanguageInput);\r\n            });\r\n\r\n            GetSentimentAnalysisResponse getSentimentAnalysisResponse = await _textAnalyticsService.GetSentimentAsync(getSentimentAnalysisRequest);\r\n\r\n            if (getSentimentAnalysisResponse != null &amp;&amp; getSentimentAnalysisResponse.Documents.Count &gt; 0)\r\n            {\r\n                \/\/ Add sentiment analysis result to the comments\r\n                foreach (GetSentimentAnalysisResponseItem getSentimentAnalysisResponseItem in getSentimentAnalysisResponse.Documents)\r\n                {\r\n                    Comment comment = comments.FirstOrDefault(c =&gt; c.ID == Convert.ToInt32(getSentimentAnalysisResponseItem.Id));\r\n\r\n                    comment.SentimentScore = getSentimentAnalysisResponseItem.Score;\r\n                }\r\n            }\r\n\r\n            return comments;\r\n        }\r\n    }\r\n}<\/pre>\n<p>&#8220;<em>GetCommentsAsync<\/em>&#8221; method&#8217;u ile ilgili product&#8217;\u0131n comment&#8217;lerini, database&#8217;den al\u0131yoruz. &#8220;<em>CalculateCommentsSentimentScoreAsync<\/em>&#8221; method&#8217;u i\u00e7erisinde ise olu\u015fturmu\u015f oldu\u011fumuz <em>Azure Text Analytics API<\/em>&#8216;\u0131n service&#8217;ini kullanarak, t\u00fcm comment&#8217;lerin sentiment score&#8217;lar\u0131n\u0131 hesapl\u0131yoruz. E\u011fer <em>API<\/em> call&#8217;\u0131 s\u0131ras\u0131nda herhangi bir problem olu\u015fmazsa, comment&#8217;lerin sentiment score&#8217;lar\u0131n\u0131 map&#8217;liyoruz.<\/p>\n<p>\u015eimdi ise product&#8217;lar ile ilgili i\u015flemleri ger\u00e7ekle\u015ftirebilece\u011fimiz bir service&#8217;e daha ihtiyac\u0131m\u0131z var.<\/p>\n<p>\u00d6ncelikle d\u0131\u015far\u0131ya domain model&#8217;ini expose etmemek ad\u0131na product response modelini, daha \u00f6nce olu\u015fturmu\u015f oldu\u011fumuz &#8220;<em>Models\/Responses<\/em>&#8221; klas\u00f6r\u00fc i\u00e7erisinde tan\u0131mlamam\u0131z gerekmektedir.<\/p>\n<p>&#8220;<em>GetProductResponse<\/em>&#8221; ve &#8220;<em>GetProductCommentResponse<\/em>&#8221; class&#8217;lar\u0131n\u0131 a\u015fa\u011f\u0131daki gibi &#8220;<em>Responses<\/em>&#8221; klas\u00f6r\u00fc i\u00e7erisinde tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">using System.Collections.Generic;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Models.Responses\r\n{\r\n    public class GetProductResponse\r\n    {\r\n        public int ID { get; set; }\r\n        public string Name { get; set; }\r\n        public string Category { get; set; }\r\n        public double Price { get; set; }\r\n        public double CustomerRating { get; set; }\r\n        public List&lt;GetProductCommentResponse&gt; Comments { get; set; }\r\n    }\r\n}<\/pre>\n<pre class=\"lang:default decode:true\">namespace SentimentAnalysisWithNETCoreExample.Models.Responses\r\n{\r\n    public class GetProductCommentResponse\r\n    {\r\n        public string Content { get; set; }\r\n    }\r\n}<\/pre>\n<p>Model&#8217;leri tan\u0131mlaman\u0131n ard\u0131ndan, &#8220;<em>Services<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda &#8220;<em>IProductService<\/em>&#8221; isminde a\u015fa\u011f\u0131daki gibi yeni bir interface olu\u015ftural\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">using System.Collections.Generic;\r\nusing System.Threading.Tasks;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Domain;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Responses;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Services\r\n{\r\n    public interface IProductService\r\n    {\r\n         Task&lt;GetProductResponse&gt; GetProductAsync(int id);\r\n    }\r\n}<\/pre>\n<p>Ard\u0131ndan &#8220;<em>Services<\/em>&#8221; klas\u00f6r\u00fc alt\u0131ndaki &#8220;<em>Implementations<\/em>&#8221; klas\u00f6r\u00fc i\u00e7erisinde, &#8220;<em>ProductService<\/em>&#8221; isminde bir class daha olu\u015fturarak, a\u015fa\u011f\u0131daki gibi implemente edelim.<\/p>\n<pre class=\"lang:default decode:true\">using System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\nusing Microsoft.EntityFrameworkCore;\r\nusing SentimentAnalysisWithNETCoreExample.Data;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Domain;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Responses;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Services.Implementations\r\n{\r\n    public class ProductService : IProductService\r\n    {\r\n        private readonly ProductDBContext _productDBContext;\r\n        private readonly IProductCommentService _productCommentService;\r\n\r\n        public ProductService(ProductDBContext productDBContext, IProductCommentService productCommentService)\r\n        {\r\n            _productDBContext = productDBContext;\r\n            _productCommentService = productCommentService;\r\n        }\r\n\r\n        public async Task&lt;GetProductResponse&gt; GetProductAsync(int id)\r\n        {\r\n            Product product =  await _productDBContext.Products.Where(p =&gt; p.ID == id)\r\n                                    .FirstOrDefaultAsync();\r\n\r\n            GetProductResponse productResponse = null;\r\n\r\n            if (product != null)\r\n            {\r\n                productResponse = new GetProductResponse();\r\n                \r\n                productResponse.ID = product.ID;\r\n                productResponse.Name = product.Name;\r\n                productResponse.Category = product.Category;\r\n                productResponse.Price = product.Price;\r\n\r\n                List&lt;Comment&gt; comments = await _productCommentService.GetComments(id);\r\n\r\n                productResponse.Comments = comments.Select(c =&gt; new GetProductCommentResponse()\r\n                {\r\n                    Content = c.Content\r\n                }).ToList();\r\n\r\n                if (comments.Count &gt; 0)\r\n                {\r\n                    List&lt;Comment&gt; commentsWithSentimentAnalysis = await _productCommentService.CalculateCommentsSentimentScoreAsync(comments);\r\n\r\n                    productResponse.CustomerRating = await CalculateProductCustomerRatingScore(commentsWithSentimentAnalysis);\r\n                }\r\n            }\r\n\r\n            return productResponse;\r\n        }\r\n\r\n        private async Task&lt;double&gt; CalculateProductCustomerRatingScore(List&lt;Comment&gt; comments)\r\n        {\r\n            double sentimentScores = 0;\r\n            double customerRating = 0;\r\n\r\n            comments.ForEach(_comment =&gt;\r\n            {\r\n                sentimentScores += _comment.SentimentScore.Value;\r\n            });\r\n\r\n            customerRating = (sentimentScores \/ comments.Count());\r\n\r\n            return await Task.FromResult(customerRating);\r\n        }\r\n    }\r\n}<\/pre>\n<p>Olu\u015fturdu\u011fumuz &#8220;<em>GetProductAsync<\/em>&#8221; method&#8217;una bakarsak, ilgili product&#8217;\u0131n comment&#8217;lerini inject etmi\u015f oldu\u011fumuz &#8220;<em>IProductCommentService<\/em>&#8221; vas\u0131tas\u0131yla \u00e7ekiyoruz.<\/p>\n<p>E\u011fer ilgili product&#8217;\u0131n comment&#8217;leri bo\u015f de\u011filse &#8220;<em>IProductCommentService<\/em>&#8221; i\u00e7erisindeki &#8220;<em>CalculateCommentsSentimentScoreAsync<\/em>&#8221; method&#8217;unu kullanarak, ilgili comment&#8217;lerin sentiment score&#8217;lar\u0131n\u0131 hesapl\u0131yoruz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2018\/11\/think-monkey.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-2335 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/11\/think-monkey.jpg\" alt=\"\" width=\"928\" height=\"522\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/think-monkey.jpg 1280w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/think-monkey-300x169.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/think-monkey-768x432.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/11\/think-monkey-1024x576.jpg 1024w\" data-sizes=\"(max-width: 928px) 100vw, 928px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 928px; --smush-placeholder-aspect-ratio: 928\/522;\" \/><\/a><\/p>\n<p>Ard\u0131ndan kullan\u0131c\u0131lar\u0131n ilgili \u00fcr\u00fcn hakk\u0131nda ne hissettiklerinin (olumlu\/olumsuz) bir ortalamas\u0131n\u0131 alabilmek i\u00e7in ise, &#8220;<em>CalculateProductCustomerRatingScoreAsync<\/em>&#8221; isimli private method&#8217;u kullan\u0131yoruz.<\/p>\n<p>Sonunda service&#8217;lerin tan\u0131mlanmas\u0131 ve implemente edilmesi i\u015flemlerini tamamlad\u0131k.<\/p>\n<p>\u015eimdi, &#8220;<em>Controllers<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda &#8220;<em>ProductsController<\/em>&#8221; isminde a\u015fa\u011f\u0131daki gibi bir controller tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">using System.Collections.Generic;\r\nusing System.Threading.Tasks;\r\nusing Microsoft.AspNetCore.Mvc;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Domain;\r\nusing SentimentAnalysisWithNETCoreExample.Models.Responses;\r\nusing SentimentAnalysisWithNETCoreExample.Services;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample.Controllers\r\n{\r\n    [Route(\"api\/[controller]\")]\r\n    [ApiController]\r\n    public class ProductsController : ControllerBase\r\n    {\r\n        private readonly IProductService _productService;\r\n\r\n        public ProductsController(IProductService productService)\r\n        {\r\n            _productService = productService;\r\n        }\r\n\r\n        [HttpGet(\"{id}\")]\r\n        public async Task&lt;ActionResult&gt; GetProduct(int id)\r\n        {\r\n            GetProductResponse product = await _productService.GetProductAsync(id);\r\n\r\n            if (product != null)\r\n            {\r\n                return Ok(product);\r\n            }\r\n            else\r\n            {\r\n                return NotFound();\r\n            }\r\n        }\r\n    }\r\n}<\/pre>\n<p>Yukar\u0131daki controller i\u00e7erisinde ise &#8220;<em>IProductService<\/em>&#8221; interface&#8217;ini inject ettikten sonra, d\u0131\u015far\u0131ya bir <em>GET<\/em> endpoint&#8217;i expose ettik. Art\u0131k product&#8217;lar\u0131, &#8220;<em>id<\/em>&#8221; bazl\u0131 alabilece\u011fimiz bir endpoint&#8217;e sahibiz.<\/p>\n<p>\u015eimdi ise injection vb. gibi gerekli i\u015flemleri sa\u011flayabilmek ad\u0131na, &#8220;<em>Startup<\/em>&#8221; class&#8217;\u0131n\u0131 da a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim.<\/p>\n<pre class=\"lang:default decode:true\">using System;\r\nusing Microsoft.AspNetCore.Builder;\r\nusing Microsoft.AspNetCore.Hosting;\r\nusing Microsoft.AspNetCore.Mvc;\r\nusing Microsoft.EntityFrameworkCore;\r\nusing Microsoft.Extensions.Configuration;\r\nusing Microsoft.Extensions.DependencyInjection;\r\nusing SentimentAnalysisWithNETCoreExample.Data;\r\nusing SentimentAnalysisWithNETCoreExample.Services;\r\nusing SentimentAnalysisWithNETCoreExample.Services.Implementations;\r\n\r\nnamespace SentimentAnalysisWithNETCoreExample\r\n{\r\n    public class Startup\r\n    {\r\n        public Startup(IConfiguration configuration)\r\n        {\r\n            Configuration = configuration;\r\n        }\r\n\r\n        public IConfiguration Configuration { get; }\r\n\r\n        \/\/ This method gets called by the runtime. Use this method to add services to the container.\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);\r\n\r\n            services.AddHttpClient(\"TextAnalyticsAPI\", c =&gt;\r\n            {\r\n                c.BaseAddress = new Uri(Configuration.GetValue&lt;string&gt;(\"TextAnalyticsAPIBaseAddress\"));\r\n                c.DefaultRequestHeaders.Add(\"Ocp-Apim-Subscription-Key\", Configuration.GetValue&lt;string&gt;(\"TextAnalyticsAPIKey\"));\r\n            });\r\n\r\n            \/\/Services\r\n            services.AddTransient&lt;ITextAnalyticsService, TextAnalyticsService&gt;();\r\n            services.AddTransient&lt;IProductService, ProductService&gt;();\r\n            services.AddTransient&lt;IProductCommentService, ProductCommentService&gt;();\r\n\r\n            \/\/Data\r\n            services.AddDbContext&lt;ProductDBContext&gt;(option =&gt; option.UseInMemoryDatabase(\"ProductDBContext\"));\r\n        }\r\n\r\n        \/\/ This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            if (env.IsDevelopment())\r\n            {\r\n                app.UseDeveloperExceptionPage();\r\n            }\r\n            else\r\n            {\r\n                app.UseHsts();\r\n            }\r\n\r\n            using (var serviceScope = app.ApplicationServices.CreateScope())\r\n            {\r\n                var context = serviceScope.ServiceProvider.GetService&lt;ProductDBContext&gt;();\r\n                context.Database.EnsureCreated();\r\n            }\r\n\r\n            app.UseHttpsRedirection();\r\n            app.UseMvc();\r\n        }\r\n    }\r\n}<\/pre>\n<p>Yukar\u0131daki kod blo\u011funa bakarsak <em>HttpClient<\/em>&#8216;\u0131, <em>Azure<\/em> subscription key&#8217;i ve &#8220;<em>TextAnalyticsAPI<\/em>&#8221; name&#8217;i ile inject ettik. Ard\u0131ndan olu\u015fturmu\u015f oldu\u011fumuz &#8220;<em>ITextAnalyticsService<\/em>&#8220;, &#8220;<em>IProductService<\/em>&#8221; ve &#8220;<em>IProductCommentService<\/em>&#8221; interface&#8217;lerinin injection i\u015flemlerini ger\u00e7ekle\u015ftirdik.<\/p>\n<p>DbContext&#8217;i ise, in-memory olarak belirledik. &#8220;<em>Configure<\/em>&#8221; method&#8217;u i\u00e7erisinde ise DbContext&#8217;e eri\u015ferek, sample dataset&#8217;imizin initialize edilmesini sa\u011flad\u0131k.<\/p>\n<p>\u015eimdi ise ilgili cofiguration key&#8217;lerini, &#8220;<em>appsettings<\/em>&#8221; json file&#8217;\u0131 i\u00e7erisine a\u015fa\u011f\u0131daki gibi ekleyelim.<\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"Logging\": {\r\n    \"LogLevel\": {\r\n      \"Default\": \"Warning\"\r\n    }\r\n  },\r\n  \"AllowedHosts\": \"*\",\r\n  \"TextAnalyticsAPIBaseAddress\" : \"https:\/\/westcentralus.api.cognitive.microsoft.com\",\r\n  \"TextAnalyticsAPISentimentResourceURI\" : \"text\/analytics\/v2.0\/sentiment\",\r\n  \"TextAnalyticsAPIKey\" : \"YOUR_KEY\"\r\n}<\/pre>\n<p>Burada eklemi\u015f oldu\u011fumuz &#8220;<em>TextAnalyticsAPIBaseAddress<\/em>&#8220;, &#8220;<em>TextAnalyticsAPISentimentResourceURI<\/em>&#8221; ve &#8220;<em>TextAnalyticsAPIKey<\/em>&#8221; bilgilerine, makalenin giri\u015f b\u00f6l\u00fcm\u00fcnde <em>Azure Portal<\/em> \u00fczerinden olu\u015fturmu\u015f oldu\u011fumuz <em>Text Analytics<\/em> resource&#8217;u i\u00e7erisinden ula\u015fabilirsiniz.<\/p>\n<p>Art\u0131k test etmeye haz\u0131r\u0131z.<\/p>\n<p>\u00d6ncelikle <em>API<\/em>&#8216;\u0131, &#8220;<em>dotnet run<\/em>&#8221; komutu ile \u00e7al\u0131\u015ft\u0131ral\u0131m. Ard\u0131ndan olumlu comment&#8217;ler ile haz\u0131rlam\u0131\u015f oldu\u011fumuz &#8220;<em>1<\/em>&#8221; numaral\u0131 \u00f6rnek product&#8217;\u0131, &#8220;<em>https:\/\/localhost:5001\/api\/products\/1<\/em>&#8221; endpoint&#8217;i \u00fczerinden <em>GET<\/em> edelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumlu.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2438 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumlu.png\" alt=\"\" width=\"1852\" height=\"1106\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumlu.png 1852w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumlu-300x179.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumlu-768x459.png 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumlu-1024x612.png 1024w\" data-sizes=\"(max-width: 1852px) 100vw, 1852px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1852px; --smush-placeholder-aspect-ratio: 1852\/1106;\" \/><\/a><\/p>\n<p>Gelen response&#8217;a bakarsak, 4 comment&#8217;in sentiment sonu\u00e7lar\u0131ndan yola \u00e7\u0131karak ortalama bir &#8220;<em>customerRating<\/em>&#8221; oran\u0131 elde etti\u011fimizi g\u00f6rebiliriz. &#8220;<em>0<\/em>&#8221; ile &#8220;<em>1<\/em>&#8221; aral\u0131\u011f\u0131nda de\u011ferlendirilen bu sonu\u00e7 ile, kullan\u0131c\u0131lar\u0131n bu \u00fcr\u00fcn\u00fc ortalama <strong>%77<\/strong> lik bir oran ile <strong>olumlu<\/strong> de\u011ferlendirdiklerini s\u00f6yleyebiliriz.<\/p>\n<p>\u015eimdi ise biraz olumsuz comment&#8217;ler i\u00e7eren &#8220;<em>2<\/em>&#8221; numaral\u0131 \u00f6rnek product&#8217;\u0131 <em>GET<\/em> edelim ve sonucuna bir g\u00f6z atal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumsuz.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2439 lazyload\" data-src=\"\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumsuz.png\" alt=\"\" width=\"1764\" height=\"1018\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumsuz.png 1764w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumsuz-300x173.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumsuz-768x443.png 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/sentiment-analysis-olumsuz-1024x591.png 1024w\" data-sizes=\"(max-width: 1764px) 100vw, 1764px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1764px; --smush-placeholder-aspect-ratio: 1764\/1018;\" \/><\/a><\/p>\n<p>Bu senaryoda ise product biraz olumsuz comment&#8217;ler i\u00e7erdi\u011fi i\u00e7in, sentiment analizi sonucunda ortalama <strong><em>%49<\/em><\/strong>\u00a0luk bir &#8220;<em>customerRating<\/em>&#8221; oran\u0131 ile response olarak kar\u015f\u0131m\u0131za gelmektedir.<\/p>\n<h2>4) Sonu\u00e7<\/h2>\n<p>Makalenin giri\u015f b\u00f6l\u00fcm\u00fcnde de bahsetti\u011fim gibi, dilerseniz kendi sentiment analyser&#8217;\u0131n\u0131z\u0131\u00a0<em>Python<\/em>&#8216;\u0131n <em>VADER<\/em> <em>NLTK\u00a0<\/em>paketi gibi farkl\u0131 dil ve tool&#8217;lar ile olu\u015fturabilirsiniz. \u0130sterseniz de bizlere bir \u00e7ok a\u00e7\u0131dan h\u0131z katan haz\u0131r cloud provider&#8217;lar\u0131ndan yararlanabilirsiniz. Bu makale kapsam\u0131nda ise <em>Azure Text Analytics API<\/em>&#8216;\u0131n\u0131 kullanarak, h\u0131zl\u0131 bir \u015fekilde .NET Core 2.1 ortam\u0131nda bir e-ticaret platformundaki \u00fcr\u00fcn yorumlar\u0131 \u00fczerinde sentiment analizinden nas\u0131l faydalanabiliriz konusuna bakmaya \u00e7al\u0131\u015ft\u0131k.<\/p>\n<p><em><a href=\"https:\/\/github.com\/GokGokalp\/AzureTextAnalyticsAPI-Sentiment-Sample\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/GokGokalp\/AzureTextAnalyticsAPI-Sentiment-Sample<\/a><\/em><\/p>\n<h4>Referanslar<\/h4>\n<blockquote><p>https:\/\/docs.microsoft.com\/en-us\/azure\/cognitive-services\/text-analytics\/quickstarts\/csharp<br \/>\nhttps:\/\/docs.microsoft.com\/en-us\/azure\/cognitive-services\/text-analytics\/overview<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Bir s\u00fcredir b\u00fcy\u00fck ilgi alanlar\u0131m aras\u0131nda olan &#8220;Machine Learning&#8221; ve &#8220;Natural Language Processing&#8221;\u00a0konular\u0131 \u00fczerinde ara\u015ft\u0131rmalar ve denemeler yapmaktay\u0131m. Bu ara\u015ft\u0131rmalar\u0131m ve denemelerim s\u0131ras\u0131nda ise i\u015f hayat\u0131mda bulunuyor oldu\u011fum domain i\u00e7erisinde, bu konular\u0131 nas\u0131l ve nerede implemente edebilirim sorular\u0131n\u0131 da d\u00fc\u015f\u00fcnmekteyim. (G\u00fcn\u00fcn sonunda, implemente&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">.NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":2433,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[417,418],"tags":[419,504,502,503],"class_list":["post-2286","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core","category-azure","tag-asp-net-core","tag-asp-net-core-sentiment-analysis","tag-azure-text-analytics-api","tag-sentiment-analysis","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>.NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\".NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2018-12-25T19:11:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-12-25T19:16:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/asp-net-core-sentiment-analysis-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1952\" \/>\n\t<meta property=\"og:image:height\" content=\"1088\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"33 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\".NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme\",\"datePublished\":\"2018-12-25T19:11:54+00:00\",\"dateModified\":\"2018-12-25T19:16:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/\"},\"wordCount\":4099,\"commentCount\":9,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2018\\\/12\\\/asp-net-core-sentiment-analysis-1.jpg\",\"keywords\":[\"asp.net core\",\"asp.net core sentiment analysis\",\"azure text analytics api\",\"sentiment analysis\"],\"articleSection\":[\"ASP.NET Core\",\"Azure\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/\",\"name\":\".NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2018\\\/12\\\/asp-net-core-sentiment-analysis-1.jpg\",\"datePublished\":\"2018-12-25T19:11:54+00:00\",\"dateModified\":\"2018-12-25T19:16:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2018\\\/12\\\/asp-net-core-sentiment-analysis-1.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2018\\\/12\\\/asp-net-core-sentiment-analysis-1.jpg\",\"width\":1952,\"height\":1088},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sentiment Analysis on Product Comments Using .NET Core and Azure Text Analytics API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":".NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/","og_locale":"tr_TR","og_type":"article","og_title":".NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2018-12-25T19:11:54+00:00","article_modified_time":"2018-12-25T19:16:29+00:00","og_image":[{"width":1952,"height":1088,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/asp-net-core-sentiment-analysis-1.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"33 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":".NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme","datePublished":"2018-12-25T19:11:54+00:00","dateModified":"2018-12-25T19:16:29+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/"},"wordCount":4099,"commentCount":9,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/asp-net-core-sentiment-analysis-1.jpg","keywords":["asp.net core","asp.net core sentiment analysis","azure text analytics api","sentiment analysis"],"articleSection":["ASP.NET Core","Azure"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/","url":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/","name":".NET Core ve Azure Text Analytics API Kullanarak \u00dcr\u00fcn Yorumlar\u0131 \u00dczerinde Sentiment Analizi Ger\u00e7ekle\u015ftirme - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/asp-net-core-sentiment-analysis-1.jpg","datePublished":"2018-12-25T19:11:54+00:00","dateModified":"2018-12-25T19:16:29+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/asp-net-core-sentiment-analysis-1.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2018\/12\/asp-net-core-sentiment-analysis-1.jpg","width":1952,"height":1088},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/sentiment-analysis-on-product-comments-using-dotnet-core-and-azure-text-analytics-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Sentiment Analysis on Product Comments Using .NET Core and Azure Text Analytics API"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/2286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=2286"}],"version-history":[{"count":74,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/2286\/revisions"}],"predecessor-version":[{"id":2442,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/2286\/revisions\/2442"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/2433"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=2286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=2286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=2286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}