public CommentAnalysis GetTextAnalysis()

in DAT - Getting the most out of your data/DAT30/lp3s3-comments-function/CogSvc/TextAnalyser.cs [36:145]


        public CommentAnalysis GetTextAnalysis(int id, string comment)
        {
            // 1. Get Language
            var lang = "en";
            var byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new
            {
                documents = new[] {
                    new {id= 1, text = comment}
                }
            }));

            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = client.PostAsync("text/analytics/v2.0/languages", content).Result;
                var result = response.Content.ReadAsStringAsync().Result;
                var jobject = JObject.Parse(result);
                lang = (string)(jobject["documents"][0]["detectedLanguages"][0]["iso6391Name"]);
                lang = VerifyIetfStandard(lang);
            }

            // 2. Get Sentiment
            int sentiment = 0;
            byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new
            {
                documents = new[] {
                    new {id= 1, text = comment, language = lang}
                }
            }));

            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = client.PostAsync("text/analytics/v2.0/sentiment", content).Result;
                var result = response.Content.ReadAsStringAsync().Result;
                var jobject = JObject.Parse(result);
                sentiment = (int)((decimal)(jobject["documents"][0]["score"]) * 100);
            }

            // 3. Get Keywords
            var keywords = "";
            byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new
            {
                documents = new[] {
                    new {id= 1, text = comment, language = lang}
                }
            }));

            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = client.PostAsync("text/analytics/v2.0/keyPhrases", content).Result;
                var result = response.Content.ReadAsStringAsync().Result;
                var jobject = JObject.Parse(result);
                if (((JArray)jobject["errors"]).Count > 0)
                {
                    var err = (string)(jobject["errors"][0]["message"]);
                    keywords = err.Substring(0, err.IndexOf("."));
                }
                else
                {
                    keywords = string.Join(",", (jobject["documents"][0]["keyPhrases"]).ToObject<IEnumerable<string>>());
                }
            }

            // 4. Translate if not English
            var translation = "";
            if (lang != "en")
            {
                var translationClient = new HttpClient();

                var stringData = JsonConvert.SerializeObject(new[] {
                    new {Text = comment}
                });

                using (var content = new ByteArrayContent(byteData))
                {
                    using (var request = new HttpRequestMessage())
                    {
                        request.Method = HttpMethod.Post;
                        request.RequestUri = new Uri($"https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&from={lang}&to=en");
                        request.Content = new StringContent(stringData, Encoding.UTF8, "application/json");
                        request.Headers.Add("Ocp-Apim-Subscription-Key", translatorSubscriptionKey);
                        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                        var response = translationClient.SendAsync(request).Result;
                        var result = response.Content.ReadAsStringAsync().Result;
                        if (result.StartsWith("{\"error"))
                        {
                            var jobject = JObject.Parse(result);
                            translation = $"unable to translate text - {jobject["error"]["message"]}";
                        }
                        else
                        {
                            var jarray = JArray.Parse(result);
                            translation = (string)(jarray[0]["translations"][0]["text"]);
                        }
                    }
                }
            }

            return new CommentAnalysis()
            {
                Id = id,
                Sentiment = sentiment,
                Language = lang,
                EnglishTranslation = translation,
                Keywords = keywords
            };
        }