public async Task RecognizeLinkedEntitiesWithLanguageTest()
        {
            TextAnalyticsClient    client         = GetClient();
            LinkedEntityCollection linkedEntities = await client.RecognizeLinkedEntitiesAsync(SpanishDocument1, "es");

            ValidateInDocumenResult(linkedEntities, s_document1ExpectedOutput);
        }
        private void ValidateInDocumenResult(LinkedEntityCollection entities, List <string> minimumExpectedOutput)
        {
            Assert.IsNotNull(entities.Warnings);
            Assert.GreaterOrEqual(entities.Count, minimumExpectedOutput.Count);
            foreach (LinkedEntity entity in entities)
            {
                Assert.That(entity.Name, Is.Not.Null.And.Not.Empty);
                Assert.That(entity.Language, Is.Not.Null.And.Not.Empty);
                Assert.That(entity.DataSource, Is.Not.Null.And.Not.Empty);
                Assert.IsNotNull(entity.Url);

                if (entity.DataSourceEntityId != null)
                {
                    Assert.IsNotEmpty(entity.DataSourceEntityId);
                }

                if (entity.BingEntitySearchApiId != null)
                {
                    Assert.IsNotEmpty(entity.BingEntitySearchApiId);
                }

                Assert.GreaterOrEqual(entity.Matches.Count(), 1);
                foreach (LinkedEntityMatch match in entity.Matches)
                {
                    Assert.That(match.Text, Is.Not.Null.And.Not.Empty);
                    Assert.IsTrue(minimumExpectedOutput.Contains(match.Text, StringComparer.OrdinalIgnoreCase));
                    Assert.GreaterOrEqual(match.ConfidenceScore, 0.0);
                    Assert.GreaterOrEqual(match.Offset, 0);
                    Assert.Greater(match.Length, 0);
                }
            }
        }
        public async Task RecognizeLinkedEntitiesWithAADTest()
        {
            TextAnalyticsClient    client         = GetClient(useTokenCredential: true);
            LinkedEntityCollection linkedEntities = await client.RecognizeLinkedEntitiesAsync(EnglishDocument1);

            ValidateInDocumenResult(linkedEntities, s_document1ExpectedOutput);
        }
        public async Task RecognizeLinkedEntitiesTest()
        {
            TextAnalyticsClient client = GetClient();
            string document            = singleEnglish;

            LinkedEntityCollection linkedEntities = await client.RecognizeLinkedEntitiesAsync(document);

            Assert.AreEqual(3, linkedEntities.Count);

            var entitiesList = new List <string> {
                "Bill Gates", "Microsoft", "Paul Allen"
            };

            foreach (LinkedEntity entity in linkedEntities)
            {
                Assert.IsTrue(entitiesList.Contains(entity.Name));
                Assert.IsNotNull(entity.DataSource);
                Assert.IsNotNull(entity.DataSourceEntityId);
                Assert.IsNotNull(entity.Language);
                Assert.IsNotNull(entity.Url);
                Assert.IsNotNull(entity.Matches);
                Assert.IsNotNull(entity.BingEntitySearchApiId);

                LinkedEntityMatch match = entity.Matches.First();
                Assert.IsNotNull(match.ConfidenceScore);
                Assert.IsNotNull(match.Text);
            }
        }
        public void ExtractEntityLinking()
        {
            string endpoint = TestEnvironment.Endpoint;
            string apiKey   = TestEnvironment.ApiKey;

            #region Snippet:TextAnalyticsSample6CreateClient
            var client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(apiKey));
            #endregion

            #region Snippet:RecognizeLinkedEntities
            string document = "Microsoft was founded by Bill Gates and Paul Allen.";

            LinkedEntityCollection linkedEntities = client.RecognizeLinkedEntities(document);

            Console.WriteLine($"Extracted {linkedEntities.Count} linked entit{(linkedEntities.Count > 1 ? "ies" : "y")}:");
            foreach (LinkedEntity linkedEntity in linkedEntities)
            {
                Console.WriteLine($"Name: {linkedEntity.Name}, Language: {linkedEntity.Language}, Data Source: {linkedEntity.DataSource}, Url: {linkedEntity.Url.ToString()}, Entity Id in Data Source: {linkedEntity.DataSourceEntityId}");
                foreach (LinkedEntityMatch match in linkedEntity.Matches)
                {
                    Console.WriteLine($"    Match Text: {match.Text}, Offset (in UTF-16 code units): {match.Offset}, Length (in UTF-16 code units): {match.Length}");
                    Console.WriteLine($"    Confidence score: {match.ConfidenceScore}");
                }
            }
            #endregion
        }
        public async Task RecognizeLinkedEntitiesWithLanguageTest()
        {
            TextAnalyticsClient client = GetClient();
            string document            = singleSpanish;

            LinkedEntityCollection linkedEntities = await client.RecognizeLinkedEntitiesAsync(document, "es");

            Assert.GreaterOrEqual(linkedEntities.Count, 3);
        }
        public async Task RecognizeLinkedEntitiesWithAADTest()
        {
            TextAnalyticsClient client = GetClient(useTokenCredential: true);
            string document            = singleEnglish;

            LinkedEntityCollection linkedEntities = await client.RecognizeLinkedEntitiesAsync(document);

            Assert.AreEqual(3, linkedEntities.Count);
        }
Example #8
0
        public async Task RecognizeLinkedEntitiesWithLanguageTest()
        {
            TextAnalyticsClient client = GetClient();
            string document            = "Microsoft fue fundado por Bill Gates y Paul Allen.";

            LinkedEntityCollection linkedEntities = await client.RecognizeLinkedEntitiesAsync(document, "es");

            Assert.GreaterOrEqual(linkedEntities.Count, 3);
        }
        public async Task RecognizeLinkedEntitiesNullText()
        {
            using var stream = new MemoryStream(Encoding.UTF8.GetBytes(@"
                {
                    ""kind"": ""EntityLinkingResults"",
                    ""results"": {                    
                        ""documents"": [
                            {
                                ""id"": ""0"",
                                ""entities"": [
                                    {
                                        ""name"": ""Microsoft"",
                                        ""matches"": [
                                            {
                                                ""text"": null,
                                                ""offset"": 0,
                                                ""length"": 9,
                                                ""confidenceScore"": 0.26
                                            }
                                        ],
                                        ""language"": ""en"",
                                        ""id"": ""Microsoft"",
                                        ""url"": ""https://en.wikipedia.org/wiki/Microsoft"",
                                        ""dataSource"": ""Wikipedia""
                                    }
                                ],
                                ""warnings"": []
                            }
                        ],
                        ""errors"": [],
                        ""modelVersion"": ""2020-02-01""
                    }
                }"));

            var mockResponse = new MockResponse(200);

            mockResponse.ContentStream = stream;

            var mockTransport = new MockTransport(new[] { mockResponse });
            var client        = CreateTestClient(mockTransport);

            var documents = "Microsoft was founded";

            LinkedEntityCollection response = await client.RecognizeLinkedEntitiesAsync(documents);

            Assert.AreEqual(string.Empty, response.FirstOrDefault().Matches.FirstOrDefault().Text);
        }
Example #10
0
        public void ExtractEntityLinking()
        {
            string endpoint = TestEnvironment.Endpoint;
            string apiKey   = TestEnvironment.ApiKey;

            var client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(apiKey));

            #region Snippet:RecognizeLinkedEntities
            string document = @"Microsoft was founded by Bill Gates with some friends he met at Harvard. One of his friends,
                                Steve Ballmer, eventually became CEO after Bill Gates as well. Steve Ballmer eventually stepped
                                down as CEO of Microsoft, and was succeeded by Satya Nadella.
                                Microsoft originally moved its headquarters to Bellevue, Washington in Januaray 1979, but is now
                                headquartered in Redmond";

            try
            {
                Response <LinkedEntityCollection> response       = client.RecognizeLinkedEntities(document);
                LinkedEntityCollection            linkedEntities = response.Value;

                Console.WriteLine($"Recognized {linkedEntities.Count} entities:");
                foreach (LinkedEntity linkedEntity in linkedEntities)
                {
                    Console.WriteLine($"  Name: {linkedEntity.Name}");
                    Console.WriteLine($"  Language: {linkedEntity.Language}");
                    Console.WriteLine($"  Data Source: {linkedEntity.DataSource}");
                    Console.WriteLine($"  URL: {linkedEntity.Url}");
                    Console.WriteLine($"  Entity Id in Data Source: {linkedEntity.DataSourceEntityId}");
                    foreach (LinkedEntityMatch match in linkedEntity.Matches)
                    {
                        Console.WriteLine($"    Match Text: {match.Text}");
                        Console.WriteLine($"    Offset: {match.Offset}");
                        Console.WriteLine($"    Length: {match.Length}");
                        Console.WriteLine($"    Confidence score: {match.ConfidenceScore}");
                    }
                    Console.WriteLine("");
                }
            }
            catch (RequestFailedException exception)
            {
                Console.WriteLine($"Error Code: {exception.ErrorCode}");
                Console.WriteLine($"Message: {exception.Message}");
            }
            #endregion
        }
Example #11
0
        public async Task ExtractEntityLinkingAsync()
        {
            string endpoint = TestEnvironment.Endpoint;
            string apiKey   = TestEnvironment.ApiKey;

            var client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(apiKey));

            string document = "Microsoft was founded by Bill Gates and Paul Allen.";

            LinkedEntityCollection linkedEntities = await client.RecognizeLinkedEntitiesAsync(document);

            Console.WriteLine($"Extracted {linkedEntities.Count} linked entit{(linkedEntities.Count > 1 ? "ies" : "y")}:");
            foreach (LinkedEntity linkedEntity in linkedEntities)
            {
                Console.WriteLine($"Name: {linkedEntity.Name}, Language: {linkedEntity.Language}, Data Source: {linkedEntity.DataSource}, Url: {linkedEntity.Url}, Entity Id in Data Source: {linkedEntity.DataSourceEntityId}");
                foreach (LinkedEntityMatch match in linkedEntity.Matches)
                {
                    Console.WriteLine($"    Match Text: {match.Text}, Confidence score: {match.ConfidenceScore}");
                }
            }
        }
        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;
            }
        }