private async Task AnalyzeTextAsync() { try { if (!string.IsNullOrEmpty(this.speechRecognitionTextBox.Text)) { DocumentSentiment textAnalysisResult = await TextAnalyticsHelper.AnalyzeSentimentAsync(this.speechRecognitionTextBox.Text); this.sentimentControl.Sentiment = GetSentimentScore(textAnalysisResult); } else { this.sentimentControl.Sentiment = 0.5; } this.OnSpeechRecognitionAndSentimentProcessed(new SpeechRecognitionAndSentimentResult { SpeechRecognitionText = this.speechRecognitionTextBox.Text, TextAnalysisSentiment = this.sentimentControl.Sentiment }); } catch (Exception ex) { await Util.GenericApiCallExceptionHandler(ex, "Error during Text Analytics call."); } }
private async Task <AnalyzeTextResult> AnalyzeNewsAsync(IEnumerable <NewsArticle> news, string userLanguage) { var scores = new List <double>(); var topKeyPhrases = new List <KeyPhraseCount>(); // prepare news titles to text string string[] newsTitleList = news.Select(n => n.Title.Replace(".", ";")).ToArray(); string newsTitles = string.Join(". ", newsTitleList); var strInfo = new StringInfo(newsTitles); int lenInTextElements = strInfo.LengthInTextElements; // check Text Analytics data limits string languageCode = GetTextAnalyticsLanguageCodeFromLanguage(userLanguage); bool isLangSupportedForKeyPhrases = IsLanguageSupportedByKeyPhraseAPI(userLanguage); if (lenInTextElements < TextAnalyticsHelper.MaximumLengthOfTextDocument) { Task <DocumentSentiment> sentimentTask = TextAnalyticsHelper.AnalyzeSentimentAsync(newsTitles, languageCode); Task <KeyPhraseCollection> keyPhrasesTask = isLangSupportedForKeyPhrases ? TextAnalyticsHelper.ExtractKeyPhrasesAsync(newsTitles, languageCode) : Task.FromResult <KeyPhraseCollection>(null); await Task.WhenAll(sentimentTask, keyPhrasesTask); var sentimentResult = sentimentTask.Result; var keyPhrasesResult = keyPhrasesTask.Result; scores = sentimentResult.Sentences.Select(s => GetSentimentScore(s)).ToList(); var wordGroups = keyPhrasesResult?.GroupBy(phrase => phrase, StringComparer.OrdinalIgnoreCase).OrderByDescending(g => g.Count()).Take(10).OrderBy(g => g.Key).ToList(); topKeyPhrases = wordGroups != null && wordGroups.Any() ? wordGroups.Select(w => new KeyPhraseCount { KeyPhrase = w.Key, Count = w.Count() }).ToList() : new List <KeyPhraseCount>() { new KeyPhraseCount { KeyPhrase = "Not available in this language", Count = 1 } }; } else { // if the input data is larger than max limit then split the input data into several different requests var sentimentTaskList = new List <Task <AnalyzeSentimentResultCollection> >(); var keyPhrasesTaskList = new List <Task <ExtractKeyPhrasesResultCollection> >(); int maxDocsPerRequest = Math.Min(TextAnalyticsHelper.MaxDocumentsPerRequestForSentimentAnalysis, TextAnalyticsHelper.MaxDocumentsPerRequestForKeyPhraseExtraction); int batchSize = Math.Min((int)Math.Ceiling((decimal)TotalNewsCount / maxDocsPerRequest), maxDocsPerRequest); for (int i = 0; i < TextAnalyticsHelper.MaxRequestsPerSecond; i++) { int skip = i * batchSize; string[] newsTitlesBatch = newsTitleList.Skip(skip).Take(batchSize).ToArray(); if (!newsTitlesBatch.Any()) { break; } sentimentTaskList.Add(TextAnalyticsHelper.AnalyzeSentimentAsync(newsTitlesBatch, languageCode)); if (isLangSupportedForKeyPhrases) { keyPhrasesTaskList.Add(TextAnalyticsHelper.ExtractKeyPhrasesAsync(newsTitlesBatch, languageCode)); } } var taskList = new List <Task>(); taskList.AddRange(sentimentTaskList); taskList.AddRange(keyPhrasesTaskList); await Task.WhenAll(taskList); foreach (var sentimentTask in sentimentTaskList) { AnalyzeSentimentResultCollection sentimentResult = sentimentTask.Result; scores.AddRange(sentimentResult.SelectMany(d => d.DocumentSentiment.Sentences).Select(s => GetSentimentScore(s)).ToList()); } var keyPhrasesList = new List <string>(); foreach (var keyPhrasesTask in keyPhrasesTaskList) { ExtractKeyPhrasesResultCollection keyPhrasesResult = keyPhrasesTask.Result; keyPhrasesList.AddRange(keyPhrasesResult.SelectMany(k => k.KeyPhrases)); } var wordGroups = keyPhrasesList.GroupBy(phrase => phrase, StringComparer.OrdinalIgnoreCase).OrderByDescending(g => g.Count()).Take(10).OrderBy(g => g.Key).ToList(); topKeyPhrases = wordGroups.Any() ? wordGroups.Select(w => new KeyPhraseCount { KeyPhrase = w.Key, Count = w.Count() }).ToList() : new List <KeyPhraseCount>() { new KeyPhraseCount { KeyPhrase = "Not available in this language", Count = 1 } }; } return(new AnalyzeTextResult { Scores = scores, TopKeyPhrases = topKeyPhrases }); }
private async Task AnalyzeTextAsync() { try { this.progressControl.IsActive = true; DisplayProcessingUI(); string input = this.inputText.Text; var detectedLanguageTask = TextAnalyticsHelper.DetectLanguageAsync(input); var detectedKeyPhrasesTask = TextAnalyticsHelper.ExtractKeyPhrasesAsync(input); var documentSentimentTask = TextAnalyticsHelper.AnalyzeSentimentAsync(input, sentimentAnalyses: AdditionalSentimentAnalyses.OpinionMining); var namedEntitiesResponseTask = TextAnalyticsHelper.RecognizeEntitiesAsync(input); var linkedEntitiesResponseTask = TextAnalyticsHelper.RecognizeLinkedEntitiesAsync(input); await Task.WhenAll(detectedLanguageTask, detectedKeyPhrasesTask, documentSentimentTask, namedEntitiesResponseTask, linkedEntitiesResponseTask); var detectedLanguage = detectedLanguageTask.Result; var detectedKeyPhrases = detectedKeyPhrasesTask.Result; var documentSentiment = documentSentimentTask.Result; var namedEntitiesResponse = namedEntitiesResponseTask.Result; var linkedEntitiesResponse = linkedEntitiesResponseTask.Result; // detected language and key phrases this.detectedLangTextBlock.Text = !string.IsNullOrEmpty(detectedLanguage.Name) ? $"{detectedLanguage.Name} (confidence: {(int)(detectedLanguage.ConfidenceScore * 100)}%)" : "Not found"; this.detectedKeyPhrasesTextBlock.Text = detectedKeyPhrases.Any() ? string.Join(", ", detectedKeyPhrases) : "Not found"; // document sentiment CreateSentimentChart(documentSentiment); // mined opinions OpinionMiningCollection.Clear(); var minedOpinions = documentSentiment?.Sentences.SelectMany(s => s.MinedOpinions); if (minedOpinions != null && minedOpinions.Any()) { var minedOpinionList = minedOpinions.Select(om => new MinedOpinion() { Aspect = om.Aspect.Text, Opinions = string.Join(", ", om.Opinions.Select(o => $"{o.Text} ({o.Sentiment.ToString("G")})")) }); OpinionMiningCollection.AddRange(minedOpinionList); } // entities if (namedEntitiesResponse.Any()) { this.namesEntitiesGridView.ItemsSource = namedEntitiesResponse.Select(x => new { x.Text, Category = $"[{x.Category}]" }); } else { this.namesEntitiesGridView.ItemsSource = new[] { new { Text = "No entities" } }; } // linked entities if (linkedEntitiesResponse.Any()) { this.linkedEntitiesGridView.ItemsSource = linkedEntitiesResponse.Select(x => new { Name = $"{x.Name} ({x.DataSource})", x.Url }); } else { this.linkedEntitiesGridView.ItemsSource = new[] { new { Name = "No linked entities" } }; } // prepare json result var jsonResult = new { LanguageDetection = detectedLanguage, KeyPhrases = detectedKeyPhrases, Sentiment = documentSentiment, Entities = namedEntitiesResponse, EntityLinking = linkedEntitiesResponse }; this.jsonResultTextBlock.Text = JsonConvert.SerializeObject(jsonResult, Formatting.Indented); } catch (Exception ex) { await Util.GenericApiCallExceptionHandler(ex, "Failure analyzing text"); } finally { this.progressControl.IsActive = false; } }
private async Task AnalyzeTextAsync() { try { this.progressControl.IsActive = true; DisplayProcessingUI(); // detect language string input = this.inputText.Text; DetectedLanguage detectedLanguage = await TextAnalyticsHelper.DetectLanguageAsync(input); string languageCode = TextAnalyticsHelper.GetLanguageCode(detectedLanguage); // check supported languages bool isOpinionMiningSupported = TextAnalyticsHelper.OpinionMiningSupportedLanguages.Any(l => string.Equals(l, languageCode, StringComparison.OrdinalIgnoreCase)); bool isSentimentSupported = TextAnalyticsHelper.SentimentAnalysisSupportedLanguages.Any(l => string.Equals(l, languageCode, StringComparison.OrdinalIgnoreCase)); bool isKeyPhraseSupported = TextAnalyticsHelper.KeyPhraseExtractionSupportedLanguages.Any(l => string.Equals(l, languageCode, StringComparison.OrdinalIgnoreCase)); bool isNamedEntitySupported = TextAnalyticsHelper.NamedEntitySupportedLanguages.Any(l => string.Equals(l, languageCode, StringComparison.OrdinalIgnoreCase)); bool isEntityLinkingSupported = TextAnalyticsHelper.EntityLinkingSupportedLanguages.Any(l => string.Equals(l, languageCode, StringComparison.OrdinalIgnoreCase)); // sentiment analysis, key phrase extraction, named entity recognition and entity linking Task <DocumentSentiment> documentSentimentTask = isSentimentSupported ? TextAnalyticsHelper.AnalyzeSentimentAsync(input, languageCode, isOpinionMiningSupported) : Task.FromResult <DocumentSentiment>(null); Task <KeyPhraseCollection> detectedKeyPhrasesTask = isKeyPhraseSupported ? TextAnalyticsHelper.ExtractKeyPhrasesAsync(input, languageCode) : Task.FromResult <KeyPhraseCollection>(null); Task <CategorizedEntityCollection> namedEntitiesResponseTask = isNamedEntitySupported ? TextAnalyticsHelper.RecognizeEntitiesAsync(input, languageCode) : Task.FromResult <CategorizedEntityCollection>(null); Task <LinkedEntityCollection> linkedEntitiesResponseTask = isEntityLinkingSupported ? TextAnalyticsHelper.RecognizeLinkedEntitiesAsync(input, languageCode) : Task.FromResult <LinkedEntityCollection>(null); await Task.WhenAll(documentSentimentTask, detectedKeyPhrasesTask, namedEntitiesResponseTask, linkedEntitiesResponseTask); DocumentSentiment documentSentiment = documentSentimentTask.Result; KeyPhraseCollection detectedKeyPhrases = detectedKeyPhrasesTask.Result; CategorizedEntityCollection namedEntitiesResponse = namedEntitiesResponseTask.Result; LinkedEntityCollection linkedEntitiesResponse = linkedEntitiesResponseTask.Result; // display results this.detectedLangTextBlock.Text = !string.IsNullOrEmpty(detectedLanguage.Name) ? $"{detectedLanguage.Name} (confidence: {(int)(detectedLanguage.ConfidenceScore * 100)}%)" : NotFound; this.detectedKeyPhrasesTextBlock.Text = detectedKeyPhrases != null && detectedKeyPhrases.Any() ? string.Join(", ", detectedKeyPhrases) : isKeyPhraseSupported?NotFound : LanguageNotSupported; this.namesEntitiesGridView.ItemsSource = namedEntitiesResponse != null && namedEntitiesResponse.Any() ? namedEntitiesResponse.Select(x => new { x.Text, Category = $"[{x.Category}]" }) : new[] { new { Text = isNamedEntitySupported ? "No entities" : LanguageNotSupported, Category = "" } }; this.linkedEntitiesGridView.ItemsSource = linkedEntitiesResponse != null && linkedEntitiesResponse.Any() ? linkedEntitiesResponse.Select(x => new { Name = $"{x.Name} ({x.DataSource})", x.Url }) : new[] { isEntityLinkingSupported ? new { Name = "No linked entities", Url = new Uri("about:blank") } : new { Name = LanguageNotSupported, Url = TextAnalyticsHelper.LanguageSupportUri } }; if (isSentimentSupported) { CreateSentimentChart(documentSentiment); // mined opinions OpinionMiningCollection.Clear(); var minedOpinions = documentSentiment?.Sentences.SelectMany(s => s.MinedOpinions); if (minedOpinions != null && minedOpinions.Any()) { var minedOpinionList = minedOpinions.Select(om => new MinedOpinion() { Aspect = om.Aspect.Text, Opinions = string.Join(", ", om.Opinions.Select(o => $"{o.Text} ({o.Sentiment.ToString("G")})")) }); OpinionMiningCollection.AddRange(minedOpinionList); } } else { this.sentimentTextBlock.Text = LanguageNotSupported; this.sentimentChart.Visibility = Visibility.Collapsed; } // prepare json result var jsonResult = new { LanguageDetection = detectedLanguage, KeyPhrases = detectedKeyPhrases, Sentiment = documentSentiment, Entities = namedEntitiesResponse, EntityLinking = linkedEntitiesResponse }; this.jsonResultTextBlock.Text = JsonConvert.SerializeObject(jsonResult, Formatting.Indented); } catch (Exception ex) { await Util.GenericApiCallExceptionHandler(ex, "Failure analyzing text"); } finally { this.progressControl.IsActive = false; } }