diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/CHANGELOG.md b/sdk/textanalytics/Azure.AI.TextAnalytics/CHANGELOG.md index d053fa2b5e2f..e5065ecd625a 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/CHANGELOG.md +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/CHANGELOG.md @@ -3,15 +3,14 @@ ## 5.2.0-beta.2 (Unreleased) ### Features Added -- Added property `SingleCategoryClassifyAction` to `TextAnalyticsActions` to support the new 'Custom Single Classification' API. This action can be used to get a custom classification for an input document or batch of documents. - -- Added property `MultiCategoryClassifyAction` to `TextAnalyticsActions` to support the new 'Custom Multiple Classification' API. This action can be used to get multiple custom classifications for an input document or batch of documents. +- Adding support for three new actions in `StartAnalyzeActions`: `RecognizeCustomEntities`, `SingleCategoryClassify`, and `MultiCategoriesClassify`. The new actions allow you to use custom models to perform entity recognition and category classification. ### Breaking Changes ### Bugs Fixed ### Other Changes +- We are now targeting the service version `3.2-preview.2` API as the default instead of `3.2-preview.1`. ## 5.2.0-beta.1 (2021-08-09) diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/api/Azure.AI.TextAnalytics.netstandard2.0.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/api/Azure.AI.TextAnalytics.netstandard2.0.cs index 5ccade399602..11432f537249 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/api/Azure.AI.TextAnalytics.netstandard2.0.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/api/Azure.AI.TextAnalytics.netstandard2.0.cs @@ -38,6 +38,7 @@ internal AnalyzeActionsResult() { } public System.Collections.Generic.IReadOnlyCollection ExtractKeyPhrasesResults { get { throw null; } } public System.Collections.Generic.IReadOnlyCollection ExtractSummaryResults { get { throw null; } } public System.Collections.Generic.IReadOnlyCollection MultiCategoryClassifyResults { get { throw null; } } + public System.Collections.Generic.IReadOnlyCollection RecognizeCustomEntitiesResults { get { throw null; } } public System.Collections.Generic.IReadOnlyCollection RecognizeEntitiesResults { get { throw null; } } public System.Collections.Generic.IReadOnlyCollection RecognizeLinkedEntitiesResults { get { throw null; } } public System.Collections.Generic.IReadOnlyCollection RecognizePiiEntitiesResults { get { throw null; } } @@ -672,6 +673,25 @@ public enum PiiEntityDomain None = 0, ProtectedHealthInformation = 1, } + public partial class RecognizeCustomEntitiesAction + { + public RecognizeCustomEntitiesAction(string projectName, string deploymentName) { } + public string DeploymentName { get { throw null; } } + public bool? DisableServiceLogs { get { throw null; } set { } } + public string ProjectName { get { throw null; } } + } + public partial class RecognizeCustomEntitiesActionResult : Azure.AI.TextAnalytics.TextAnalyticsActionResult + { + internal RecognizeCustomEntitiesActionResult() { } + public Azure.AI.TextAnalytics.RecognizeCustomEntitiesResultCollection DocumentsResults { get { throw null; } } + } + public partial class RecognizeCustomEntitiesResultCollection : System.Collections.ObjectModel.ReadOnlyCollection + { + internal RecognizeCustomEntitiesResultCollection() : base (default(System.Collections.Generic.IList)) { } + public string DeploymentName { get { throw null; } } + public string ProjectName { get { throw null; } } + public Azure.AI.TextAnalytics.TextDocumentBatchStatistics Statistics { get { throw null; } } + } public partial class RecognizeEntitiesAction { public RecognizeEntitiesAction() { } @@ -847,6 +867,7 @@ public TextAnalyticsActions() { } public System.Collections.Generic.IReadOnlyCollection ExtractKeyPhrasesActions { get { throw null; } set { } } public System.Collections.Generic.IReadOnlyCollection ExtractSummaryActions { get { throw null; } set { } } public System.Collections.Generic.IReadOnlyCollection MultiCategoryClassifyActions { get { throw null; } set { } } + public System.Collections.Generic.IReadOnlyCollection RecognizeCustomEntitiesActions { get { throw null; } set { } } public System.Collections.Generic.IReadOnlyCollection RecognizeEntitiesActions { get { throw null; } set { } } public System.Collections.Generic.IReadOnlyCollection RecognizeLinkedEntitiesActions { get { throw null; } set { } } public System.Collections.Generic.IReadOnlyCollection RecognizePiiEntitiesActions { get { throw null; } set { } } @@ -983,7 +1004,7 @@ public static partial class TextAnalyticsModelFactory { [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public static Azure.AI.TextAnalytics.AnalyzeActionsResult AnalyzeActionsResult(System.Collections.Generic.IEnumerable extractKeyPhrasesActionResult, System.Collections.Generic.IEnumerable recognizeEntitiesActionResults, System.Collections.Generic.IEnumerable recognizePiiEntitiesActionResults, System.Collections.Generic.IEnumerable recognizeLinkedEntitiesActionsResults, System.Collections.Generic.IEnumerable analyzeSentimentActionsResults) { throw null; } - public static Azure.AI.TextAnalytics.AnalyzeActionsResult AnalyzeActionsResult(System.Collections.Generic.IEnumerable extractKeyPhrasesActionResults, System.Collections.Generic.IEnumerable recognizeEntitiesActionResults, System.Collections.Generic.IEnumerable recognizePiiEntitiesActionResults, System.Collections.Generic.IEnumerable recognizeLinkedEntitiesActionResults, System.Collections.Generic.IEnumerable analyzeSentimentActionResults, System.Collections.Generic.IEnumerable extractSummaryActionResults, System.Collections.Generic.IEnumerable singleCategoryClassifyActionResults, System.Collections.Generic.IEnumerable multiCategoryClassifyActionResults) { throw null; } + public static Azure.AI.TextAnalytics.AnalyzeActionsResult AnalyzeActionsResult(System.Collections.Generic.IEnumerable extractKeyPhrasesActionResults, System.Collections.Generic.IEnumerable recognizeEntitiesActionResults, System.Collections.Generic.IEnumerable recognizePiiEntitiesActionResults, System.Collections.Generic.IEnumerable recognizeLinkedEntitiesActionResults, System.Collections.Generic.IEnumerable analyzeSentimentActionResults, System.Collections.Generic.IEnumerable extractSummaryActionResults, System.Collections.Generic.IEnumerable recognizeCustomEntitiesActionResults, System.Collections.Generic.IEnumerable singleCategoryClassifyActionResults, System.Collections.Generic.IEnumerable multiCategoryClassifyActionResults) { throw null; } public static Azure.AI.TextAnalytics.AnalyzeHealthcareEntitiesResult AnalyzeHealthcareEntitiesResult(string id, Azure.AI.TextAnalytics.TextDocumentStatistics statistics, System.Collections.Generic.IEnumerable healthcareEntities, System.Collections.Generic.IEnumerable entityRelations, System.Collections.Generic.IEnumerable warnings) { throw null; } public static Azure.AI.TextAnalytics.AnalyzeHealthcareEntitiesResult AnalyzeHealthcareEntitiesResult(string id, string code, string message) { throw null; } public static Azure.AI.TextAnalytics.AnalyzeHealthcareEntitiesResultCollection AnalyzeHealthcareEntitiesResultCollection(System.Collections.Generic.IEnumerable list, Azure.AI.TextAnalytics.TextDocumentBatchStatistics statistics, string modelVersion) { throw null; } @@ -1034,6 +1055,8 @@ public static partial class TextAnalyticsModelFactory public static Azure.AI.TextAnalytics.MultiCategoryClassifyResultCollection MultiCategoryClassifyResultCollection(System.Collections.Generic.IEnumerable classificationResultList, Azure.AI.TextAnalytics.TextDocumentBatchStatistics statistics, string projectName, string deploymentName) { throw null; } public static Azure.AI.TextAnalytics.PiiEntity PiiEntity(string text, string category, string subCategory, double score, int offset, int length) { throw null; } public static Azure.AI.TextAnalytics.PiiEntityCollection PiiEntityCollection(System.Collections.Generic.IEnumerable entities, string redactedText, System.Collections.Generic.IEnumerable warnings = null) { throw null; } + public static Azure.AI.TextAnalytics.RecognizeCustomEntitiesActionResult RecognizeCustomEntitiesActionResult(Azure.AI.TextAnalytics.RecognizeCustomEntitiesResultCollection result, System.DateTimeOffset completedOn) { throw null; } + public static Azure.AI.TextAnalytics.RecognizeCustomEntitiesActionResult RecognizeCustomEntitiesActionResult(System.DateTimeOffset completedOn, string code, string message) { throw null; } public static Azure.AI.TextAnalytics.RecognizeEntitiesActionResult RecognizeEntitiesActionResult(Azure.AI.TextAnalytics.RecognizeEntitiesResultCollection result, System.DateTimeOffset completedOn) { throw null; } public static Azure.AI.TextAnalytics.RecognizeEntitiesActionResult RecognizeEntitiesActionResult(System.DateTimeOffset completedOn, string code, string message) { throw null; } public static Azure.AI.TextAnalytics.RecognizeEntitiesResult RecognizeEntitiesResult(string id, Azure.AI.TextAnalytics.TextAnalyticsError error) { throw null; } diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/samples/Sample9_RecognizeCustomEntities.md b/sdk/textanalytics/Azure.AI.TextAnalytics/samples/Sample9_RecognizeCustomEntities.md new file mode 100644 index 000000000000..d1c4b9ac63dd --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/samples/Sample9_RecognizeCustomEntities.md @@ -0,0 +1,112 @@ +# Recognizing Custom Entities from Documents +This sample demonstrates how to recognize custom entities in one or more documents. To get started you'll need a Text Analytics endpoint and credentials. See [README][README] for links and instructions. + +## Creating a `TextAnalyticsClient` + +To create a new `TextAnalyticsClient` to recognize custom entities in a document, you need a Text Analytics endpoint and credentials. You can use the [DefaultAzureCredential][DefaultAzureCredential] to try a number of common authentication methods optimized for both running as a service and development. In the sample below, however, you'll use a Text Analytics API key credential by creating an `AzureKeyCredential` object, that if needed, will allow you to update the API key without creating a new client. + +You can set `endpoint` and `apiKey` based on an environment variable, a configuration setting, or any way that works for your application. + +```C# Snippet:CreateTextAnalyticsClient +string endpoint = ""; +string apiKey = ""; +var client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); +``` + +## Recognizing custom entities in a single or multiple documents + +To recognize custom entities in documents, set up a `RecognizeCustomEntitiesAction` and call `StartAnalyzeActionsAsync` on the documents. The result is a Long Running operation of type `AnalyzeActionsOperation` which polls for the results from the API. You can use [Azure language studio][azure_language_studio] to train custom models. + +```C# Snippet:RecognizeCustomEntitiesActionAsync +// Create input documents. +string documentA = @"We love this trail and make the trip every year. The views are breathtaking and well + worth the hike! Yesterday was foggy though, so we missed the spectacular views. + We tried again today and it was amazing. Everyone in my family liked the trail although + it was too challenging for the less athletic among us."; + +string documentB = @"Last week we stayed at Hotel Foo to celebrate our anniversary. The staff knew about + our anniversary so they helped me organize a little surprise for my partner. + The room was clean and with the decoration I requested. It was perfect!"; + +var batchDocuments = new List +{ + new TextDocumentInput("1", documentA) + { + Language = "en", + }, + new TextDocumentInput("2", documentB) + { + Language = "en", + } +}; + +// prepare actions. +string projectName = ""; +string deploymentName = ""; +var actions = new TextAnalyticsActions() +{ + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(projectName, deploymentName); + } +}; + +AnalyzeActionsOperation operation = await client.StartAnalyzeActionsAsync(batchDocuments, actions); + +await operation.WaitForCompletionAsync(); +``` + +The returned `AnalyzeActionsOperation` contains general information about the status of the operation. It can be requested while the operation is running or when it has completed. For example: + +```C# Snippet:RecognizeCustomEntitiesActionOperationStatus +// View operation status. +Console.WriteLine($"AnalyzeActions operation has completed"); +Console.WriteLine(); +Console.WriteLine($"Created On : {operation.CreatedOn}"); +Console.WriteLine($"Expires On : {operation.ExpiresOn}"); +Console.WriteLine($"Id : {operation.Id}"); +Console.WriteLine($"Status : {operation.Status}"); +Console.WriteLine($"Last Modified: {operation.LastModified}"); +Console.WriteLine(); +``` + +To view the final results of the long-running operation: + +```C# Snippet:RecognizeCustomEntitiesActionAsyncViewResults +await foreach (AnalyzeActionsResult documentsInPage in operation.Value) +{ + IReadOnlyCollection customEntitiesActionResults = documentsInPage.RecognizeCustomEntitiesResults; + foreach (RecognizeCustomEntitiesActionResult customEntitiesActionResult in customEntitiesActionResults) + { + int docNumber = 1; + foreach (RecognizeEntitiesResult documentResults in customEntitiesActionResult.DocumentsResults) + { + Console.WriteLine($" Document #{docNumber++}"); + Console.WriteLine($" Recognized the following {documentResults.Entities.Count} entities:"); + + foreach (CategorizedEntity entity in documentResults.Entities) + { + Console.WriteLine($" Entity: {entity.Text}"); + Console.WriteLine($" Category: {entity.Category}"); + Console.WriteLine($" Offset: {entity.Offset}"); + Console.WriteLine($" Length: {entity.Length}"); + Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}"); + Console.WriteLine($" SubCategory: {entity.SubCategory}"); + } + Console.WriteLine(""); + } + } +} +``` + +To see the full example source files, see: + +* [Synchronously RecognizeCustomEntities](https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntities.cs) +* [Asynchronously RecognizeCustomEntities](https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples//Sample9_RecognizeCustomEntitiesAsync.cs) +* [Synchronously RecognizeCustomEntities Convenience](https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesConvenience.cs) +* [Asynchronously RecognizeCustomEntities Convenience](https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesConvenienceAsync.cs) + + +[azure_language_studio]: https://language.azure.com/ +[README]: https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/textanalytics/Azure.AI.TextAnalytics/README.md +[DefaultAzureCredential]: https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/identity/Azure.Identity/README.md \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeActionsResult.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeActionsResult.cs index 36c5a00a87b4..5611f4fe3a9c 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeActionsResult.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeActionsResult.cs @@ -17,6 +17,7 @@ internal AnalyzeActionsResult( IReadOnlyCollection recognizeLinkedEntitiesActionResults, IReadOnlyCollection analyzeSentimentActionResults, IReadOnlyCollection extractSummaryActionResults, + IReadOnlyCollection recognizeCustomEntitiesActionResults, IReadOnlyCollection singleCategoryClassifyActionResults, IReadOnlyCollection multiCategoryClassifyActionResults ) @@ -29,6 +30,7 @@ IReadOnlyCollection multiCategoryClassifyActi ExtractSummaryResults = extractSummaryActionResults; SingleCategoryClassifyResults = singleCategoryClassifyActionResults; MultiCategoryClassifyResults = multiCategoryClassifyActionResults; + RecognizeCustomEntitiesResults = recognizeCustomEntitiesActionResults; } /// @@ -61,6 +63,11 @@ IReadOnlyCollection multiCategoryClassifyActi /// public IReadOnlyCollection ExtractSummaryResults { get; } + /// + /// Determines the collection of . + /// + public IReadOnlyCollection RecognizeCustomEntitiesResults { get; } + /// /// Determines the collection of . /// diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/AnalyzeTasks.Serialization.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/AnalyzeTasks.Serialization.cs index 48ad9b8bbee5..47bdd8b4efdd 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/AnalyzeTasks.Serialization.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/AnalyzeTasks.Serialization.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Text.Json; +using Azure.AI.TextAnalytics.Internal; using Azure.Core; namespace Azure.AI.TextAnalytics.Models @@ -25,7 +26,7 @@ internal static AnalyzeTasks DeserializeAnalyzeTasks(JsonElement element) Optional> entityLinkingTasks = default; Optional> sentimentAnalysisTasks = default; Optional> extractiveSummarizationTasks = default; - Optional> customEntityRecognitionTasks = default; + Optional> customEntityRecognitionTasks = default; Optional> customSingleClassificationTasks = default; Optional> customMultiClassificationTasks = default; foreach (var property in element.EnumerateObject()) @@ -147,10 +148,10 @@ internal static AnalyzeTasks DeserializeAnalyzeTasks(JsonElement element) property.ThrowNonNullablePropertyIsNull(); continue; } - List array = new List(); + List array = new List(); foreach (var item in property.Value.EnumerateArray()) { - array.Add(TasksStateTasksCustomEntityRecognitionTasksItem.DeserializeTasksStateTasksCustomEntityRecognitionTasksItem(item)); + array.Add(CustomEntityRecognitionTasksItem.DeserializeCustomEntityRecognitionTasksItem(item)); } customEntityRecognitionTasks = array; continue; diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/AnalyzeTasks.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/AnalyzeTasks.cs index 0c53c42d5576..590ade9104d3 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/AnalyzeTasks.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/AnalyzeTasks.cs @@ -6,6 +6,7 @@ #nullable disable using System.Collections.Generic; +using Azure.AI.TextAnalytics.Internal; using Azure.Core; namespace Azure.AI.TextAnalytics.Models @@ -30,7 +31,7 @@ internal AnalyzeTasks(int completed, int failed, int inProgress, int total) EntityLinkingTasks = new ChangeTrackingList(); SentimentAnalysisTasks = new ChangeTrackingList(); ExtractiveSummarizationTasks = new ChangeTrackingList(); - CustomEntityRecognitionTasks = new ChangeTrackingList(); + CustomEntityRecognitionTasks = new ChangeTrackingList(); CustomSingleClassificationTasks = new ChangeTrackingList(); CustomMultiClassificationTasks = new ChangeTrackingList(); } @@ -49,7 +50,7 @@ internal AnalyzeTasks(int completed, int failed, int inProgress, int total) /// /// /// - internal AnalyzeTasks(int completed, int failed, int inProgress, int total, IReadOnlyList entityRecognitionTasks, IReadOnlyList entityRecognitionPiiTasks, IReadOnlyList keyPhraseExtractionTasks, IReadOnlyList entityLinkingTasks, IReadOnlyList sentimentAnalysisTasks, IReadOnlyList extractiveSummarizationTasks, IReadOnlyList customEntityRecognitionTasks, IReadOnlyList customSingleClassificationTasks, IReadOnlyList customMultiClassificationTasks) + internal AnalyzeTasks(int completed, int failed, int inProgress, int total, IReadOnlyList entityRecognitionTasks, IReadOnlyList entityRecognitionPiiTasks, IReadOnlyList keyPhraseExtractionTasks, IReadOnlyList entityLinkingTasks, IReadOnlyList sentimentAnalysisTasks, IReadOnlyList extractiveSummarizationTasks, IReadOnlyList customEntityRecognitionTasks, IReadOnlyList customSingleClassificationTasks, IReadOnlyList customMultiClassificationTasks) { Completed = completed; Failed = failed; @@ -76,7 +77,7 @@ internal AnalyzeTasks(int completed, int failed, int inProgress, int total, IRea public IReadOnlyList EntityLinkingTasks { get; } public IReadOnlyList SentimentAnalysisTasks { get; } public IReadOnlyList ExtractiveSummarizationTasks { get; } - public IReadOnlyList CustomEntityRecognitionTasks { get; } + public IReadOnlyList CustomEntityRecognitionTasks { get; } public IReadOnlyList CustomSingleClassificationTasks { get; } public IReadOnlyList CustomMultiClassificationTasks { get; } } diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/TasksStateTasksCustomEntityRecognitionTasksItem.Serialization.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/CustomEntityRecognitionTasksItem.Serialization.cs similarity index 80% rename from sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/TasksStateTasksCustomEntityRecognitionTasksItem.Serialization.cs rename to sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/CustomEntityRecognitionTasksItem.Serialization.cs index cb7c76586e8a..4cae5b599db8 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/TasksStateTasksCustomEntityRecognitionTasksItem.Serialization.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/CustomEntityRecognitionTasksItem.Serialization.cs @@ -8,13 +8,14 @@ using System; using System.Text.Json; using Azure.AI.TextAnalytics; +using Azure.AI.TextAnalytics.Models; using Azure.Core; -namespace Azure.AI.TextAnalytics.Models +namespace Azure.AI.TextAnalytics.Internal { - internal partial class TasksStateTasksCustomEntityRecognitionTasksItem + internal partial class CustomEntityRecognitionTasksItem { - internal static TasksStateTasksCustomEntityRecognitionTasksItem DeserializeTasksStateTasksCustomEntityRecognitionTasksItem(JsonElement element) + internal static CustomEntityRecognitionTasksItem DeserializeCustomEntityRecognitionTasksItem(JsonElement element) { Optional results = default; DateTimeOffset lastUpdateDateTime = default; @@ -48,7 +49,7 @@ internal static TasksStateTasksCustomEntityRecognitionTasksItem DeserializeTasks continue; } } - return new TasksStateTasksCustomEntityRecognitionTasksItem(lastUpdateDateTime, taskName.Value, status, results.Value); + return new CustomEntityRecognitionTasksItem(lastUpdateDateTime, taskName.Value, status, results.Value); } } } diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/CustomEntityRecognitionTasksItem.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/CustomEntityRecognitionTasksItem.cs new file mode 100644 index 000000000000..0948d4137855 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/CustomEntityRecognitionTasksItem.cs @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +// + +#nullable disable + +using System; +using Azure.AI.TextAnalytics; +using Azure.AI.TextAnalytics.Models; + +namespace Azure.AI.TextAnalytics.Internal +{ + /// The TasksStateTasksCustomEntityRecognitionTasksItem. + internal partial class CustomEntityRecognitionTasksItem : TaskState + { + /// Initializes a new instance of CustomEntityRecognitionTasksItem. + /// + /// + internal CustomEntityRecognitionTasksItem(DateTimeOffset lastUpdateDateTime, TextAnalyticsOperationStatus status) : base(lastUpdateDateTime, status) + { + } + + /// Initializes a new instance of CustomEntityRecognitionTasksItem. + /// + /// + /// + /// + internal CustomEntityRecognitionTasksItem(DateTimeOffset lastUpdateDateTime, string taskName, TextAnalyticsOperationStatus status, CustomEntitiesResult results) : base(lastUpdateDateTime, taskName, status) + { + Results = results; + } + + public CustomEntitiesResult Results { get; } + } +} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/JobManifestTasks.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/JobManifestTasks.cs index faba44bdb062..e2bcddf58cc7 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/JobManifestTasks.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/JobManifestTasks.cs @@ -27,6 +27,5 @@ public JobManifestTasks() CustomSingleClassificationTasks = new ChangeTrackingList(); CustomMultiClassificationTasks = new ChangeTrackingList(); } - public IList CustomEntityRecognitionTasks { get; } } } diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/TasksStateTasksCustomEntityRecognitionTasksItem.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/TasksStateTasksCustomEntityRecognitionTasksItem.cs deleted file mode 100644 index f40aa0fa71ea..000000000000 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Generated/Models/TasksStateTasksCustomEntityRecognitionTasksItem.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -// - -#nullable disable - -using System; -using Azure.AI.TextAnalytics; - -namespace Azure.AI.TextAnalytics.Models -{ - /// The TasksStateTasksCustomEntityRecognitionTasksItem. - internal partial class TasksStateTasksCustomEntityRecognitionTasksItem : TaskState - { - /// Initializes a new instance of TasksStateTasksCustomEntityRecognitionTasksItem. - /// - /// - internal TasksStateTasksCustomEntityRecognitionTasksItem(DateTimeOffset lastUpdateDateTime, TextAnalyticsOperationStatus status) : base(lastUpdateDateTime, status) - { - } - - /// Initializes a new instance of TasksStateTasksCustomEntityRecognitionTasksItem. - /// - /// - /// - /// - internal TasksStateTasksCustomEntityRecognitionTasksItem(DateTimeOffset lastUpdateDateTime, string taskName, TextAnalyticsOperationStatus status, CustomEntitiesResult results) : base(lastUpdateDateTime, taskName, status) - { - Results = results; - } - - public CustomEntitiesResult Results { get; } - } -} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Internal/TasksStateTasksCustomEntityRecognitionTasksItem.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Internal/TasksStateTasksCustomEntityRecognitionTasksItem.cs new file mode 100644 index 000000000000..02163cee555b --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Internal/TasksStateTasksCustomEntityRecognitionTasksItem.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Azure.Core; + +namespace Azure.AI.TextAnalytics.Internal +{ + /// + /// CustomEntityRecognitionTasksItem. + /// + [CodeGenModel("TasksStateTasksCustomEntityRecognitionTasksItem")] + internal partial class CustomEntityRecognitionTasksItem + { + } +} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/JobManifestTasks.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/JobManifestTasks.cs index e77a931509e3..dbf01ef02416 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/JobManifestTasks.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/JobManifestTasks.cs @@ -43,6 +43,11 @@ internal partial class JobManifestTasks /// public IList ExtractiveSummarizationTasks { get; set; } + /// + /// CustomEntityRecognitionTasks + /// + internal IList CustomEntityRecognitionTasks { get; set; } + /// /// CustomSingleClassificationTasks /// diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/RecognizeCustomEntitiesAction.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/RecognizeCustomEntitiesAction.cs new file mode 100644 index 000000000000..5c2e71049770 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/RecognizeCustomEntitiesAction.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Azure.AI.TextAnalytics +{ + /// + /// Configurations that allow callers to specify details about how to execute + /// a Recognize Custom Entities action in a set of documents. + /// + public class RecognizeCustomEntitiesAction + { + /// + /// Initializes a new instance of the + /// class which allows callers to specify details about how to execute + /// a Recognize Custom Entities action in a set of documents. + /// Sets the and properties. + /// + /// Sets the value of the property corresponding to the name of the project. + /// Sets the value of the property corresponding to the name of the deployment. + public RecognizeCustomEntitiesAction(string projectName, string deploymentName) + { + ProjectName = projectName; + DeploymentName = deploymentName; + } + + /// + /// Gets the value of the property corresponding to the name of the proejct. + /// + public string ProjectName { get; } + + /// + /// Gets the value of the property corresponding to the name of the deployment. + /// + public string DeploymentName { get; } + + /// + /// The default value of this property is 'false'. This means, Text Analytics service logs your input text for 48 hours, + /// solely to allow for troubleshooting issues. + /// Setting this property to true, disables input logging and may limit our ability to investigate issues that occur. + /// + /// Please see Cognitive Services Compliance and Privacy notes at for additional details, + /// and Microsoft Responsible AI principles at . + /// + /// + public bool? DisableServiceLogs { get; set; } + } +} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/RecognizeCustomEntitiesActionResult.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/RecognizeCustomEntitiesActionResult.cs new file mode 100644 index 000000000000..6b1a93ff1182 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/RecognizeCustomEntitiesActionResult.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using Azure.AI.TextAnalytics.Models; + +namespace Azure.AI.TextAnalytics +{ + /// + /// The result of the execution of a on the input documents. + /// + public class RecognizeCustomEntitiesActionResult : TextAnalyticsActionResult + { + private readonly RecognizeCustomEntitiesResultCollection _documentsResults; + + /// + /// Successful action. + /// + internal RecognizeCustomEntitiesActionResult(RecognizeCustomEntitiesResultCollection result, DateTimeOffset completedOn) + : base(completedOn) + { + _documentsResults = result; + } + + /// + /// Action with an error. + /// + internal RecognizeCustomEntitiesActionResult(DateTimeOffset completedOn, TextAnalyticsErrorInternal error) + : base(completedOn, error) { } + + /// + /// Gets the result of the execution of a per each input document. + /// + public RecognizeCustomEntitiesResultCollection DocumentsResults + { + get + { + if (HasError) + { +#pragma warning disable CA1065 // Do not raise exceptions in unexpected locations + throw new InvalidOperationException($"Cannot access the results of this action, due to error {Error.ErrorCode}: {Error.Message}"); +#pragma warning restore CA1065 // Do not raise exceptions in unexpected locations + } + return _documentsResults; + } + } + } +} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/RecognizeCustomEntitiesResultCollection.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/RecognizeCustomEntitiesResultCollection.cs new file mode 100644 index 000000000000..02392d78a439 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/RecognizeCustomEntitiesResultCollection.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Linq; + +namespace Azure.AI.TextAnalytics +{ + /// + /// Collection of objects corresponding + /// to a batch of documents, and information about the batch operation. + /// + [DebuggerTypeProxy(typeof(RecognizeCustomEntitiesResultCollectionDebugView))] + public class RecognizeCustomEntitiesResultCollection : ReadOnlyCollection + { + internal RecognizeCustomEntitiesResultCollection(IList list, TextDocumentBatchStatistics statistics, string projectName, string deploymentName) : base(list) + { + Statistics = statistics; + DeploymentName = deploymentName; + ProjectName = projectName; + } + + /// + /// Gets statistics about the documents and how it was processed + /// by the service. This property will have a value when IncludeStatistics + /// is set to true in the client call. + /// + public TextDocumentBatchStatistics Statistics { get; } + + /// + /// Gets the value of the property corresponding to the name of the deployment. + /// + public string DeploymentName { get; } + + /// + /// Gets the value of the property corresponding to the name of the project. + /// + public string ProjectName { get; } + + /// + /// Debugger Proxy class for . + /// + internal class RecognizeCustomEntitiesResultCollectionDebugView + { + private RecognizeCustomEntitiesResultCollection BaseCollection { get; } + + public RecognizeCustomEntitiesResultCollectionDebugView(RecognizeCustomEntitiesResultCollection collection) + { + BaseCollection = collection; + } + + [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] + public List Items + { + get + { + return BaseCollection.ToList(); + } + } + + public TextDocumentBatchStatistics Statistics + { + get + { + return BaseCollection.Statistics; + } + } + + public string ProjectName + { + get + { + return BaseCollection.ProjectName; + } + } + + public string DeploymentName + { + get + { + return BaseCollection.DeploymentName; + } + } + } + } +} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsActions.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsActions.cs index 7d8bb0863c6c..11cdced0ab7c 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsActions.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsActions.cs @@ -61,6 +61,15 @@ public TextAnalyticsActions() /// public IReadOnlyCollection ExtractSummaryActions { get; set; } + /// + /// The set of that will get executed on the input documents. + /// Note that currently only one is supported. + /// + /// + /// This property only applies for and up. + /// + public IReadOnlyCollection RecognizeCustomEntitiesActions { get; set; } + /// /// The set of that will get executed on the input documents. /// Note that currently only one is supported. diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient.cs index 7dd19a6f1c62..f3d8b37fbb65 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient.cs @@ -2458,6 +2458,10 @@ private static JobManifestTasks CreateTasks(TextAnalyticsActions actions) { tasks.EntityRecognitionTasks = Transforms.ConvertFromRecognizeEntitiesActionsToTasks(actions.RecognizeEntitiesActions); } + if (actions.RecognizeCustomEntitiesActions != null) + { + tasks.CustomEntityRecognitionTasks = Transforms.ConvertFromRecognizeCustomEntitiesActionsToTasks(actions.RecognizeCustomEntitiesActions); + } if (actions.ExtractKeyPhrasesActions != null) { tasks.KeyPhraseExtractionTasks = Transforms.ConvertFromExtractKeyPhrasesActionsToTasks(actions.ExtractKeyPhrasesActions); @@ -2493,6 +2497,7 @@ private static void ValidateActions(TextAnalyticsActions actions) actions.ExtractKeyPhrasesActions?.Count > 1 || actions.AnalyzeSentimentActions?.Count > 1 || actions.ExtractSummaryActions?.Count > 1 || + actions.RecognizeCustomEntitiesActions?.Count > 1 || actions.SingleCategoryClassifyActions?.Count > 1 || actions.MultiCategoryClassifyActions?.Count > 1 ) diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsModelFactory.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsModelFactory.cs index e4b8e3e147f0..83e4926bab7a 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsModelFactory.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsModelFactory.cs @@ -537,7 +537,7 @@ public static MultiCategoryClassifyResult MultiCategoryClassifyResult(string id, /// /// Sets the property. /// Sets the property. - /// A new instance of for mocking purposes. + /// A new instance of for mocking purposes. public static MultiCategoryClassifyResult MultiCategoryClassifyResult(string id, TextAnalyticsError error) { return new MultiCategoryClassifyResult(id, error); @@ -586,7 +586,7 @@ public static SingleCategoryClassifyResult SingleCategoryClassifyResult(string i /// /// Sets the property. /// Sets the property. - /// A new instance of for mocking purposes. + /// A new instance of for mocking purposes. public static SingleCategoryClassifyResult SingleCategoryClassifyResult(string id, TextAnalyticsError error) { return new SingleCategoryClassifyResult(id, error); @@ -775,6 +775,7 @@ public static AnalyzeActionsResult AnalyzeActionsResult( recognizeLinkedEntitiesActionsResults.ToList(), analyzeSentimentActionsResults.ToList(), new List(), + new List(), new List(), new List() ); @@ -789,6 +790,7 @@ public static AnalyzeActionsResult AnalyzeActionsResult( /// Sets the collection of . /// Sets the collection of . /// Sets the collection of . + /// Sets the collection of . /// Sets the collection of . /// Sets the collection of . /// A new instance of for mocking purposes. @@ -799,9 +801,9 @@ public static AnalyzeActionsResult AnalyzeActionsResult( IEnumerable recognizeLinkedEntitiesActionResults, IEnumerable analyzeSentimentActionResults, IEnumerable extractSummaryActionResults, + IEnumerable recognizeCustomEntitiesActionResults, IEnumerable singleCategoryClassifyActionResults, - IEnumerable multiCategoryClassifyActionResults - ) + IEnumerable multiCategoryClassifyActionResults) { return new AnalyzeActionsResult( extractKeyPhrasesActionResults.ToList(), @@ -810,6 +812,7 @@ IEnumerable multiCategoryClassifyActionResult recognizeLinkedEntitiesActionResults.ToList(), analyzeSentimentActionResults.ToList(), extractSummaryActionResults.ToList(), + recognizeCustomEntitiesActionResults.ToList(), singleCategoryClassifyActionResults.ToList(), multiCategoryClassifyActionResults.ToList() ); @@ -871,6 +874,34 @@ public static ExtractSummaryActionResult ExtractSummaryActionResult( return new ExtractSummaryActionResult(completedOn, new TextAnalyticsErrorInternal(code, message)); } + /// + /// Initializes a new instance of for mocking purposes. + /// + /// Sets the property. + /// Sets the property. + /// A new instance of for mocking purposes. + public static RecognizeCustomEntitiesActionResult RecognizeCustomEntitiesActionResult( + RecognizeCustomEntitiesResultCollection result, + DateTimeOffset completedOn) + { + return new RecognizeCustomEntitiesActionResult(result, completedOn); + } + + /// + /// Initializes a new instance of for mocking purposes. + /// + /// Sets the property. + /// Sets the property. + /// Sets the property. + /// A new instance of for mocking purposes. + public static RecognizeCustomEntitiesActionResult RecognizeCustomEntitiesActionResult( + DateTimeOffset completedOn, + string code, + string message) + { + return new RecognizeCustomEntitiesActionResult(completedOn, new TextAnalyticsErrorInternal(code, message)); + } + /// /// Initializes a new instance of for mocking purposes. /// diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Transforms.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Transforms.cs index aa55d4ae31c1..682e9fc5f745 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/src/Transforms.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/src/Transforms.cs @@ -14,6 +14,8 @@ internal static class Transforms { #region Common + public static readonly Regex _targetRegex = new Regex("#/tasks/(keyPhraseExtractionTasks|entityRecognitionPiiTasks|entityRecognitionTasks|entityLinkingTasks|sentimentAnalysisTasks|extractiveSummarizationTasks|customSingleClassificationTasks|customMultiClassificationTasks|customEntityRecognitionTasks)/(\\d+)", RegexOptions.Compiled, TimeSpan.FromSeconds(2)); + internal static TextAnalyticsError ConvertToError(TextAnalyticsErrorInternal error) { string errorCode = error.Code; @@ -73,7 +75,7 @@ internal static DetectedLanguage ConvertToDetectedLanguage(DocumentLanguage docu internal static DetectLanguageResultCollection ConvertToDetectLanguageResultCollection(LanguageResult results, IDictionary idToIndexMap) { - var detectedLanguages = new List(); + var detectedLanguages = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -98,7 +100,7 @@ internal static DetectLanguageResultCollection ConvertToDetectLanguageResultColl internal static AnalyzeSentimentResultCollection ConvertToAnalyzeSentimentResultCollection(SentimentResponse results, IDictionary idToIndexMap) { - var analyzedSentiments = new List(); + var analyzedSentiments = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -128,7 +130,7 @@ internal static KeyPhraseCollection ConvertToKeyPhraseCollection(DocumentKeyPhra internal static ExtractKeyPhrasesResultCollection ConvertToExtractKeyPhrasesResultCollection(KeyPhraseResult results, IDictionary idToIndexMap) { - var keyPhrases = new List(); + var keyPhrases = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -161,7 +163,7 @@ internal static CategorizedEntityCollection ConvertToCategorizedEntityCollection internal static RecognizeEntitiesResultCollection ConvertToRecognizeEntitiesResultCollection(EntitiesResult results, IDictionary idToIndexMap) { - var recognizeEntities = new List(); + var recognizeEntities = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -182,6 +184,29 @@ internal static RecognizeEntitiesResultCollection ConvertToRecognizeEntitiesResu #endregion + #region Recognize Custom Entities + internal static RecognizeCustomEntitiesResultCollection ConvertToRecognizeCustomEntitiesResultCollection(CustomEntitiesResult results, IDictionary idToIndexMap) + { + var recognizeEntities = new List(results.Errors.Count); + + //Read errors + foreach (DocumentError error in results.Errors) + { + recognizeEntities.Add(new RecognizeEntitiesResult(error.Id, ConvertToError(error.Error))); + } + + //Read document entities + foreach (DocumentEntities docEntities in results.Documents) + { + recognizeEntities.Add(new RecognizeEntitiesResult(docEntities.Id, docEntities.Statistics ?? default, ConvertToCategorizedEntityCollection(docEntities))); + } + + recognizeEntities = SortHeterogeneousCollection(recognizeEntities, idToIndexMap); + + return new RecognizeCustomEntitiesResultCollection(recognizeEntities, results.Statistics, results.ProjectName, results.DeploymentName); + } + #endregion + #region Recognize PII Entities internal static List ConvertToPiiEntityList(List entities) @@ -194,7 +219,7 @@ internal static PiiEntityCollection ConvertToPiiEntityCollection(PiiDocumentEnti internal static RecognizePiiEntitiesResultCollection ConvertToRecognizePiiEntitiesResultCollection(PiiEntitiesResult results, IDictionary idToIndexMap) { - var recognizeEntities = new List(); + var recognizeEntities = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -224,7 +249,7 @@ internal static LinkedEntityCollection ConvertToLinkedEntityCollection(DocumentL internal static RecognizeLinkedEntitiesResultCollection ConvertToRecognizeLinkedEntitiesResultCollection(EntityLinkingResult results, IDictionary idToIndexMap) { - var recognizeEntities = new List(); + var recognizeEntities = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -254,7 +279,7 @@ internal static List ConvertToHealthcareEntityCollection(IEnum internal static AnalyzeHealthcareEntitiesResultCollection ConvertToAnalyzeHealthcareEntitiesResultCollection(HealthcareResult results, IDictionary idToIndexMap) { - var healthcareEntititesResults = new List(); + var healthcareEntititesResults = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -330,7 +355,7 @@ internal static SummarySentenceCollection ConvertToSummarySentenceCollection(Ext internal static ExtractSummaryResultCollection ConvertToExtractSummaryResultCollection(ExtractiveSummarizationResult results, IDictionary idToIndexMap) { - var extractedSummaries = new List(); + var extractedSummaries = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -362,7 +387,7 @@ internal static ClassificationCategoryCollection ConvertToClassificationCategory internal static MultiCategoryClassifyResultCollection ConvertToMultiCategoryClassifyResultCollection(CustomMultiClassificationResult results, IDictionary idToIndexMap) { - var classifiedCustomCategoryResults = new List(); + var classifiedCustomCategoryResults = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -385,7 +410,7 @@ internal static MultiCategoryClassifyResultCollection ConvertToMultiCategoryClas #region SingleCategoryClassifyResult internal static SingleCategoryClassifyResultCollection ConvertToSingleCategoryClassifyResultCollection(CustomSingleClassificationResult results, IDictionary idToIndexMap) { - var classifiedCustomCategoryResults = new List(); + var classifiedCustomCategoryResults = new List(results.Errors.Count); //Read errors foreach (DocumentError error in results.Errors) @@ -495,6 +520,17 @@ internal static ExtractiveSummarizationTask ConvertToExtractiveSummarizationTask }; } + internal static CustomEntitiesTask ConvertToCustomEntitiesTask(RecognizeCustomEntitiesAction action) + { + return new CustomEntitiesTask() + { + Parameters = new CustomEntitiesTaskParameters(action.ProjectName, action.DeploymentName) + { + LoggingOptOut = action.DisableServiceLogs, + } + }; + } + internal static CustomSingleClassificationTask ConvertToCustomSingleClassificationTask(SingleCategoryClassifyAction action) { return new CustomSingleClassificationTask() @@ -519,7 +555,7 @@ internal static CustomMultiClassificationTask ConvertToCustomMultiClassification internal static IList ConvertFromRecognizeLinkedEntitiesActionsToTasks(IReadOnlyCollection recognizeLinkedEntitiesActions) { - List list = new List(); + List list = new List(recognizeLinkedEntitiesActions.Count); foreach (RecognizeLinkedEntitiesAction action in recognizeLinkedEntitiesActions) { @@ -531,7 +567,7 @@ internal static IList ConvertFromRecognizeLinkedEntitiesActio internal static IList ConvertFromRecognizeEntitiesActionsToTasks(IReadOnlyCollection recognizeEntitiesActions) { - List list = new List(); + List list = new List(recognizeEntitiesActions.Count); foreach (RecognizeEntitiesAction action in recognizeEntitiesActions) { @@ -543,7 +579,7 @@ internal static IList ConvertFromRecognizeEntitiesActionsToTasks(I internal static IList ConvertFromExtractKeyPhrasesActionsToTasks(IReadOnlyCollection extractKeyPhrasesActions) { - List list = new List(); + List list = new List(extractKeyPhrasesActions.Count); foreach (ExtractKeyPhrasesAction action in extractKeyPhrasesActions) { @@ -555,7 +591,7 @@ internal static IList ConvertFromExtractKeyPhrasesActionsToTasks internal static IList ConvertFromRecognizePiiEntitiesActionsToTasks(IReadOnlyCollection recognizePiiEntitiesActions) { - List list = new List(); + List list = new List(recognizePiiEntitiesActions.Count); foreach (RecognizePiiEntitiesAction action in recognizePiiEntitiesActions) { @@ -567,7 +603,7 @@ internal static IList ConvertFromRecognizePiiEntitiesActionsToTasks(IRe internal static IList ConvertFromAnalyzeSentimentActionsToTasks(IReadOnlyCollection analyzeSentimentActions) { - List list = new List(); + List list = new List(analyzeSentimentActions.Count); foreach (AnalyzeSentimentAction action in analyzeSentimentActions) { @@ -579,7 +615,7 @@ internal static IList ConvertFromAnalyzeSentimentActionsT internal static IList ConvertFromExtractSummaryActionsToTasks(IReadOnlyCollection extractSummaryActions) { - List list = new List(); + List list = new List(extractSummaryActions.Count); foreach (ExtractSummaryAction action in extractSummaryActions) { @@ -588,9 +624,21 @@ internal static IList ConvertFromExtractSummaryActi return list; } + internal static IList ConvertFromSingleCategoryClassifyActionsToTasks(IReadOnlyCollection singleCategoryClassifyActions) + { + List list = new List(singleCategoryClassifyActions.Count); + + foreach (SingleCategoryClassifyAction action in singleCategoryClassifyActions) + { + list.Add(ConvertToCustomSingleClassificationTask(action)); + } + + return list; + } + internal static IList ConvertFromMultiCategoryClassifyActionsToTasks(IReadOnlyCollection MultiCategoryClassifyActions) { - List list = new List(); + List list = new List(MultiCategoryClassifyActions.Count); foreach (MultiCategoryClassifyAction action in MultiCategoryClassifyActions) { @@ -599,14 +647,13 @@ internal static IList ConvertFromMultiCategoryCla return list; } - - internal static IList ConvertFromSingleCategoryClassifyActionsToTasks(IReadOnlyCollection singleCategoryClassifyActions) + internal static IList ConvertFromRecognizeCustomEntitiesActionsToTasks(IReadOnlyCollection recognizeCustomEntitiesActions) { - List list = new List(); + var list = new List(recognizeCustomEntitiesActions.Count); - foreach (SingleCategoryClassifyAction action in singleCategoryClassifyActions) + foreach (var action in recognizeCustomEntitiesActions) { - list.Add(ConvertToCustomSingleClassificationTask(action)); + list.Add(ConvertToCustomEntitiesTask(action)); } return list; @@ -618,7 +665,6 @@ private static string[] parseActionErrorTarget(string targetReference) { throw new InvalidOperationException("Expected an error with a target field referencing an action but did not get one"); } - Regex _targetRegex = new Regex("#/tasks/(keyPhraseExtractionTasks|entityRecognitionPiiTasks|entityRecognitionTasks|entityLinkingTasks|sentimentAnalysisTasks|extractiveSummarizationTasks|customSingleClassificationTasks|customMultiClassificationTasks)/(\\d+)", RegexOptions.Compiled, TimeSpan.FromSeconds(2)); // action could be failed and the target reference is "#/tasks/keyPhraseExtractionTasks/0"; Match targetMatch = _targetRegex.Match(targetReference); @@ -641,6 +687,7 @@ internal static AnalyzeActionsResult ConvertToAnalyzeActionsResult(AnalyzeJobSta IDictionary entitiesLinkingRecognitionErrors = new Dictionary(); IDictionary analyzeSentimentErrors = new Dictionary(); IDictionary extractSummaryErrors = new Dictionary(); + IDictionary customEntitiesRecognitionErrors = new Dictionary(); IDictionary singleCategoryClassifyErrors = new Dictionary(); IDictionary multiCategoryClassifyErrors = new Dictionary(); @@ -679,6 +726,10 @@ internal static AnalyzeActionsResult ConvertToAnalyzeActionsResult(AnalyzeJobSta { extractSummaryErrors.Add(taskIndex, error); } + else if ("customEntityRecognitionTasks".Equals(taskName)) + { + customEntitiesRecognitionErrors.Add(taskIndex, error); + } else if ("customSingleClassificationTasks".Equals(taskName)) { singleCategoryClassifyErrors.Add(taskIndex, error); @@ -701,6 +752,7 @@ internal static AnalyzeActionsResult ConvertToAnalyzeActionsResult(AnalyzeJobSta ConvertToRecognizeLinkedEntitiesActionsResults(jobState, map, entitiesLinkingRecognitionErrors), ConvertToAnalyzeSentimentActionsResults(jobState, map, analyzeSentimentErrors), ConvertToExtractSummaryActionsResults(jobState, map, extractSummaryErrors), + ConvertToRecognizeCustomEntitiesActionsResults(jobState, map, customEntitiesRecognitionErrors), ConvertToSingleCategoryClassifyResults(jobState, map, singleCategoryClassifyErrors), ConvertToMultiCategoryClassifyActionsResults(jobState, map, multiCategoryClassifyErrors) ); @@ -708,7 +760,7 @@ internal static AnalyzeActionsResult ConvertToAnalyzeActionsResult(AnalyzeJobSta private static IReadOnlyCollection ConvertToMultiCategoryClassifyActionsResults(AnalyzeJobState jobState, IDictionary idToIndexMap, IDictionary tasksErrors) { - var collection = new List(); + var collection = new List(jobState.Tasks.CustomMultiClassificationTasks.Count); int index = 0; foreach (CustomMultiClassificationTasksItem task in jobState.Tasks.CustomMultiClassificationTasks) { @@ -730,7 +782,7 @@ private static IReadOnlyCollection ConvertToM private static IReadOnlyCollection ConvertToSingleCategoryClassifyResults(AnalyzeJobState jobState, IDictionary idToIndexMap, IDictionary tasksErrors) { - var collection = new List(); + var collection = new List(jobState.Tasks.CustomSingleClassificationTasks.Count); int index = 0; foreach (CustomSingleClassificationTasksItem task in jobState.Tasks.CustomSingleClassificationTasks) { @@ -752,7 +804,7 @@ private static IReadOnlyCollection ConvertTo private static IReadOnlyCollection ConvertToAnalyzeSentimentActionsResults(AnalyzeJobState jobState, IDictionary idToIndexMap, IDictionary tasksErrors) { - var collection = new List(); + var collection = new List(jobState.Tasks.SentimentAnalysisTasks.Count); int index = 0; foreach (SentimentAnalysisTasksItem task in jobState.Tasks.SentimentAnalysisTasks) { @@ -774,7 +826,7 @@ private static IReadOnlyCollection ConvertToAnalyz private static IReadOnlyCollection ConvertToRecognizeLinkedEntitiesActionsResults(AnalyzeJobState jobState, IDictionary idToIndexMap, IDictionary tasksErrors) { - var collection = new List(); + var collection = new List(jobState.Tasks.EntityLinkingTasks.Count); int index = 0; foreach (EntityLinkingTasksItem task in jobState.Tasks.EntityLinkingTasks) { @@ -796,7 +848,7 @@ private static IReadOnlyCollection ConvertT private static IReadOnlyCollection ConvertToExtractKeyPhrasesActionResults(AnalyzeJobState jobState, IDictionary idToIndexMap, IDictionary tasksErrors) { - var collection = new List(); + var collection = new List(jobState.Tasks.KeyPhraseExtractionTasks.Count); int index = 0; foreach (KeyPhraseExtractionTasksItem task in jobState.Tasks.KeyPhraseExtractionTasks) { @@ -818,7 +870,7 @@ private static IReadOnlyCollection ConvertToExtra private static IReadOnlyCollection ConvertToRecognizePiiEntitiesActionsResults(AnalyzeJobState jobState, IDictionary idToIndexMap, IDictionary tasksErrors) { - var collection = new List(); + var collection = new List(jobState.Tasks.EntityRecognitionPiiTasks.Count); int index = 0; foreach (EntityRecognitionPiiTasksItem task in jobState.Tasks.EntityRecognitionPiiTasks) { @@ -840,7 +892,7 @@ private static IReadOnlyCollection ConvertToRe private static IReadOnlyCollection ConvertToRecognizeEntitiesActionsResults(AnalyzeJobState jobState, IDictionary idToIndexMap, IDictionary tasksErrors) { - var collection = new List(); + var collection = new List(jobState.Tasks.EntityRecognitionTasks.Count); int index = 0; foreach (EntityRecognitionTasksItem task in jobState.Tasks.EntityRecognitionTasks) { @@ -860,9 +912,31 @@ private static IReadOnlyCollection ConvertToRecog return collection; } + private static IReadOnlyCollection ConvertToRecognizeCustomEntitiesActionsResults(AnalyzeJobState jobState, IDictionary idToIndexMap, IDictionary tasksErrors) + { + var collection = new List(jobState.Tasks.CustomEntityRecognitionTasks.Count); + int index = 0; + foreach (var task in jobState.Tasks.CustomEntityRecognitionTasks) + { + tasksErrors.TryGetValue(index, out TextAnalyticsErrorInternal taskError); + + if (taskError != null) + { + collection.Add(new RecognizeCustomEntitiesActionResult(task.LastUpdateDateTime, taskError)); + } + else + { + collection.Add(new RecognizeCustomEntitiesActionResult(ConvertToRecognizeCustomEntitiesResultCollection(task.Results, idToIndexMap), task.LastUpdateDateTime)); + } + index++; + } + + return collection; + } + private static IReadOnlyCollection ConvertToExtractSummaryActionsResults(AnalyzeJobState jobState, IDictionary idToIndexMap, IDictionary tasksErrors) { - var collection = new List(); + var collection = new List(jobState.Tasks.ExtractiveSummarizationTasks.Count); int index = 0; foreach (ExtractiveSummarizationTasksItem task in jobState.Tasks.ExtractiveSummarizationTasks) { diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/AnalyzeOperationMockTests.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/AnalyzeOperationMockTests.cs index 69b04b7f92b3..83ac3e38371b 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/AnalyzeOperationMockTests.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/AnalyzeOperationMockTests.cs @@ -298,6 +298,68 @@ public void AnalyzeOperationRecognizeEntitiesWithTwoActions() #endregion entities + #region Custom Entities + + [Test] + public async Task AnalyzeOperationRecognizeCustomEntitiesWithDisableServiceLogs() + { + var mockResponse = new MockResponse(202); + mockResponse.AddHeader(new HttpHeader("Operation-Location", "something/jobs/2a96a91f-7edf-4931-a880-3fdee1d56f15")); + + var mockTransport = new MockTransport(new[] { mockResponse, mockResponse }); + var client = CreateTestClient(mockTransport); + + var documents = new List + { + "Elon Musk is the CEO of SpaceX and Tesla." + }; + + var actions = new RecognizeCustomEntitiesAction(FakeProjectName, FakeDeploymentName) + { + DisableServiceLogs = true + }; + + TextAnalyticsActions batchActions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() { actions }, + }; + + await client.StartAnalyzeActionsAsync(documents, batchActions); + + var contentString = GetString(mockTransport.Requests.Single().Content); + string logging = contentString.Substring(contentString.IndexOf("loggingOptOut"), 19); + + var expectedContent = "loggingOptOut\":true"; + Assert.AreEqual(expectedContent, logging); + } + + public void AnalyzeOperationRecognizeCustomEntitiesWithTwoActions() + { + var mockResponse = new MockResponse(202); + mockResponse.AddHeader(new HttpHeader("Operation-Location", "something/jobs/2a96a91f-7edf-4931-a880-3fdee1d56f15")); + + var mockTransport = new MockTransport(new[] { mockResponse, mockResponse }); + var client = CreateTestClient(mockTransport); + + var documents = new List + { + "Elon Musk is the CEO of SpaceX and Tesla." + }; + + TextAnalyticsActions batchActions = new() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(FakeProjectName, FakeDeploymentName), + new RecognizeCustomEntitiesAction(FakeProjectName, FakeDeploymentName) + }, + }; + + ArgumentException ex = Assert.ThrowsAsync(async () => await client.StartAnalyzeActionsAsync(documents, batchActions)); + Assert.AreEqual("Multiple of the same action is not currently supported.", ex.Message); + } + #endregion + #region linked entities [Test] @@ -950,6 +1012,11 @@ public async Task AnalyzeOperationWithActionsError() ""message"": ""Some error"", ""target"": ""#/tasks/extractiveSummarizationTasks/0"" }, + { + ""code"": ""InvalidRequest"", + ""message"": ""Some error"", + ""target"": ""#/tasks/customEntityRecognitionTasks/0"" + }, { ""code"": ""InvalidRequest"", ""message"": ""Some error"", @@ -967,9 +1034,9 @@ public async Task AnalyzeOperationWithActionsError() ""lastUpdateDateTime"": ""2021-03-03T22:39:37Z"" }, ""completed"": 0, - ""failed"": 7, + ""failed"": 9, ""inProgress"": 0, - ""total"": 7, + ""total"": 9, ""entityRecognitionTasks"": [ { ""lastUpdateDateTime"": ""2021-03-03T22:39:37.1716697Z"", @@ -1012,6 +1079,13 @@ public async Task AnalyzeOperationWithActionsError() ""state"": ""failed"" } ], + ""customEntityRecognitionTasks"": [ + { + ""lastUpdateDateTime"": ""2021-03-03T22:39:37.1716697Z"", + ""taskName"": ""something"", + ""state"": ""failed"" + } + ], ""customSingleClassificationTasks"": [ { ""lastUpdateDateTime"": ""2021-03-03T22:39:37.1716697Z"", @@ -1048,6 +1122,7 @@ public async Task AnalyzeOperationWithActionsError() RecognizeLinkedEntitiesActions = new List() { new RecognizeLinkedEntitiesAction() }, AnalyzeSentimentActions = new List() { new AnalyzeSentimentAction() }, ExtractSummaryActions = new List() { new ExtractSummaryAction() }, + RecognizeCustomEntitiesActions = new List() { new RecognizeCustomEntitiesAction(FakeProjectName, FakeDeploymentName) }, SingleCategoryClassifyActions = new List { new SingleCategoryClassifyAction(FakeProjectName, FakeDeploymentName)}, MultiCategoryClassifyActions = new List() { new MultiCategoryClassifyAction(FakeProjectName, FakeDeploymentName) }, DisplayName = "AnalyzeOperationBatchWithErrorTest" @@ -1070,6 +1145,7 @@ public async Task AnalyzeOperationWithActionsError() RecognizeLinkedEntitiesActionResult entityLinkingActionsResults = resultCollection.RecognizeLinkedEntitiesResults.FirstOrDefault(); AnalyzeSentimentActionResult analyzeSentimentActionsResults = resultCollection.AnalyzeSentimentResults.FirstOrDefault(); ExtractSummaryActionResult extractSummaryActionsResults = resultCollection.ExtractSummaryResults.FirstOrDefault(); + RecognizeCustomEntitiesActionResult recognizeCustomEntitiesActionResults = resultCollection.RecognizeCustomEntitiesResults.FirstOrDefault(); SingleCategoryClassifyActionResult singleCategoryClassifyActionResult = resultCollection.SingleCategoryClassifyResults.FirstOrDefault(); MultiCategoryClassifyActionResult multiCategoryClassifyActionResult = resultCollection.MultiCategoryClassifyResults.FirstOrDefault(); @@ -1091,6 +1167,9 @@ public async Task AnalyzeOperationWithActionsError() Assert.IsTrue(extractSummaryActionsResults.HasError); Assert.Throws(() => extractSummaryActionsResults.DocumentsResults.GetType()); + Assert.IsTrue(recognizeCustomEntitiesActionResults.HasError); + Assert.Throws(() => recognizeCustomEntitiesActionResults.DocumentsResults.GetType()); + Assert.IsTrue(singleCategoryClassifyActionResult.HasError); Assert.Throws(() => singleCategoryClassifyActionResult.DocumentsResults.GetType()); diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/AnalyzeOperationTests.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/AnalyzeOperationTests.cs index 3ec5a33cd82c..bc448968b663 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/AnalyzeOperationTests.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/AnalyzeOperationTests.cs @@ -83,6 +83,7 @@ public async Task AnalyzeOperationTest() IReadOnlyCollection entityLinkingActionsResults = resultCollection.RecognizeLinkedEntitiesResults; IReadOnlyCollection analyzeSentimentActionsResults = resultCollection.AnalyzeSentimentResults; IReadOnlyCollection extractSummaryActionsResults = resultCollection.ExtractSummaryResults; + IReadOnlyCollection recognizeCustomEntitiesActionResults = resultCollection.RecognizeCustomEntitiesResults; IReadOnlyCollection singleCategoryClassifyResults = resultCollection.SingleCategoryClassifyResults; IReadOnlyCollection multiCategoryClassifyResults = resultCollection.MultiCategoryClassifyResults; @@ -94,6 +95,7 @@ public async Task AnalyzeOperationTest() Assert.IsNotNull(extractSummaryActionsResults); Assert.IsNotNull(singleCategoryClassifyResults); Assert.IsNotNull(multiCategoryClassifyResults); + Assert.IsNotNull(recognizeCustomEntitiesActionResults); var keyPhrasesListId1 = new List { "CEO", "SpaceX", "Elon Musk", "Tesla" }; var keyPhrasesListId2 = new List { "Tesla stock" }; diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/Infrastructure/TextAnalyticsTestEnvironment.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/Infrastructure/TextAnalyticsTestEnvironment.cs index 9404d52f6e81..cfef61bcf2c0 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/Infrastructure/TextAnalyticsTestEnvironment.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/Infrastructure/TextAnalyticsTestEnvironment.cs @@ -13,5 +13,7 @@ public class TextAnalyticsTestEnvironment: TestEnvironment public string SingleClassificationDeploymentName = "659c1851-be0b-4142-b12a-087da9785926"; public string MultiClassificationProjectName = "7cdace98-537b-494a-b69a-c19754718025"; public string MultiClassificationDeploymentName = "7cdace98-537b-494a-b69a-c19754718025"; + public string RecognizeCustomEntitiesProjectName = "88ee0f78-fbca-444d-98e2-7c4c8631e494"; + public string RecognizeCustomEntitiesDeploymentName = "88ee0f78-fbca-444d-98e2-7c4c8631e494"; } } diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/RecognizeCustomEntitiesTests.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/RecognizeCustomEntitiesTests.cs new file mode 100644 index 000000000000..3d1809516841 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/RecognizeCustomEntitiesTests.cs @@ -0,0 +1,311 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Azure.Core.TestFramework; +using NUnit.Framework; + +namespace Azure.AI.TextAnalytics.Tests +{ + [ServiceVersion(Min = TextAnalyticsClientOptions.ServiceVersion.V3_2_Preview_2)] + public class RecognizeCustomEntitiesTests : TextAnalyticsClientLiveTestBase + { + public RecognizeCustomEntitiesTests(bool isAsync, TextAnalyticsClientOptions.ServiceVersion serviceVersion) + : base(isAsync, serviceVersion) + { + } + + private const string EnglishDocument1 = @"A recent report by the Government Accountability Office found a dramatic increase in oil."; + private static readonly List e_document1ExpectedOutput = new List + { + "recent", + "Government", + "Office", + "Accountability", + "dramatic", + "oil", + }; + + private const string EnglishDocument2 = @"Capital Call #20 for Berkshire Multifamily."; + private static readonly List e_document2ExpectedOutput = new List + { + "Berkshire Multifamily", + }; + + private const string SpanishDocument1 = @"Un informe reciente de la Oficina de Responsabilidad del Gobierno encontró un aumento dramático en el petróleo."; + private static readonly List s_document1ExpectedOutput = new List + { + "reciente", + "Responsabilidad", + "del", + "Gobierno", + "dramático", + "petróleo", + }; + + private static readonly List e_batchConvenienceDocuments = new List + { + EnglishDocument1, + EnglishDocument2 + }; + + private static readonly List s_batchDocuments = new List + { + new TextDocumentInput("1", EnglishDocument1) + { + Language = "en", + }, + new TextDocumentInput("2", SpanishDocument1) + { + Language = "es", + } + }; + + [RecordedTest] + public async Task RecognizeCustomEntitiesWithADDTest() + { + TextAnalyticsClient client = GetClient(useTokenCredential: true); + + TextAnalyticsActions batchActions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + var operation = await client.StartAnalyzeActionsAsync(new List { EnglishDocument1 }, batchActions); + + await operation.WaitForCompletionAsync(); + + RecognizeCustomEntitiesResultCollection results = ExtractDocumentsResultsFromResponse(operation); + RecognizeEntitiesResult firstResult = results.First(); + CategorizedEntityCollection entites = firstResult.Entities; + ValidateInDocumentResult(entites, s_document1ExpectedOutput); + } + + [RecordedTest] + public async Task RecognizeCustomEntitiesTest() + { + TextAnalyticsClient client = GetClient(); + + TextAnalyticsActions batchActions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + var operation = await client.StartAnalyzeActionsAsync(new List { EnglishDocument1 }, batchActions); + + await operation.WaitForCompletionAsync(); + RecognizeCustomEntitiesResultCollection results = ExtractDocumentsResultsFromResponse(operation); + RecognizeEntitiesResult firstResult = results.First(); + CategorizedEntityCollection entites = firstResult.Entities; + ValidateInDocumentResult(entites, e_document1ExpectedOutput); + } + + [RecordedTest] + public async Task RecognizeCustomEntitiesWithLanguageTest() + { + TextAnalyticsClient client = GetClient(); + + TextAnalyticsActions batchActions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + List documentsBatch = new List + { + new TextDocumentInput("1", SpanishDocument1) { Language = "es" } + }; + + var operation = await client.StartAnalyzeActionsAsync(documentsBatch, batchActions); + + await operation.WaitForCompletionAsync(); + + RecognizeCustomEntitiesResultCollection results = ExtractDocumentsResultsFromResponse(operation); + RecognizeEntitiesResult firstResult = results.First(); + CategorizedEntityCollection entites = firstResult.Entities; + ValidateInDocumentResult(entites, s_document1ExpectedOutput); + } + + [RecordedTest] + public async Task RecognizeCustomEntitiesBatchWithErrorTest() + { + TextAnalyticsClient client = GetClient(); + var documents = new List + { + "Microsoft was founded by Bill Gates and Paul Allen.", + "", + "My cat might need to see a veterinarian." + }; + + TextAnalyticsActions batchActions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + var operation = await client.StartAnalyzeActionsAsync(documents, batchActions); + + await operation.WaitForCompletionAsync(); + + var results = ExtractDocumentsResultsFromResponse(operation); + + Assert.IsTrue(!results[0].HasError); + Assert.IsTrue(!results[2].HasError); + + var exceptionMessage = "Cannot access result for document 1, due to error InvalidDocument: Document text is empty."; + Assert.IsTrue(results[1].HasError); + InvalidOperationException ex = Assert.Throws(() => results[1].Entities.GetType()); + Assert.AreEqual(exceptionMessage, ex.Message); + } + + [RecordedTest] + public async Task RecognizeCustomEntitiesBatchConvenienceTest() + { + TextAnalyticsClient client = GetClient(); + TextAnalyticsActions batchActions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + var operation = await client.StartAnalyzeActionsAsync(e_batchConvenienceDocuments, batchActions); + + await operation.WaitForCompletionAsync(); + + var results = ExtractDocumentsResultsFromResponse(operation); + + var expectedOutput = new Dictionary>() + { + { "0", e_document1ExpectedOutput }, + { "1", e_document2ExpectedOutput }, + }; + + ValidateBatchDocumentsResult(results, expectedOutput); + } + + [RecordedTest] + public async Task RecognizeCustomEntitiesBatchTest() + { + TextAnalyticsClient client = GetClient(); + TextAnalyticsActions batchActions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + var operation = await client.StartAnalyzeActionsAsync(s_batchDocuments, batchActions); + + await operation.WaitForCompletionAsync(); + + var results = ExtractDocumentsResultsFromResponse(operation); + + var expectedOutput = new Dictionary>() + { + { "1", e_document1ExpectedOutput }, + { "2", s_document1ExpectedOutput }, + }; + + ValidateBatchDocumentsResult(results, expectedOutput); + } + + [RecordedTest] + public void RecognizeCustomEntitiesBatchWithNullIdTest() + { + TextAnalyticsClient client = GetClient(); + var documents = new List { new TextDocumentInput(null, "Hello world") }; + + TextAnalyticsActions batchActions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + RequestFailedException ex = Assert.ThrowsAsync(async () => await client.StartAnalyzeActionsAsync(documents, batchActions)); + Assert.AreEqual(TextAnalyticsErrorCode.InvalidDocument, ex.ErrorCode); + } + + private RecognizeCustomEntitiesResultCollection ExtractDocumentsResultsFromResponse(AnalyzeActionsOperation analyzeActionOperation) + { + var resultCollection = analyzeActionOperation.Value.ToEnumerableAsync().Result.FirstOrDefault(); + var recognizeCustomEntitiesActionResult = resultCollection.RecognizeCustomEntitiesResults; + var actionResult = recognizeCustomEntitiesActionResult.First(); + return actionResult.DocumentsResults; + } + + private void ValidateInDocumentResult(CategorizedEntityCollection entities, List minimumExpectedOutput) + { + Assert.IsNotNull(entities.Warnings); + Assert.GreaterOrEqual(entities.Count, minimumExpectedOutput.Count); + foreach (CategorizedEntity entity in entities) + { + Assert.That(entity.Text, Is.Not.Null.And.Not.Empty); + Assert.IsTrue(minimumExpectedOutput.Contains(entity.Text, StringComparer.OrdinalIgnoreCase)); + Assert.IsNotNull(entity.Category); + Assert.GreaterOrEqual(entity.ConfidenceScore, 0.0); + Assert.GreaterOrEqual(entity.Offset, 0); + Assert.Greater(entity.Length, 0); + + if (entity.SubCategory != null) + { + Assert.IsNotEmpty(entity.SubCategory); + } + } + } + + private void ValidateBatchDocumentsResult(RecognizeCustomEntitiesResultCollection results, Dictionary> minimumExpectedOutput, bool includeStatistics = default) + { + if (includeStatistics) + { + Assert.IsNotNull(results.Statistics); + Assert.Greater(results.Statistics.DocumentCount, 0); + Assert.Greater(results.Statistics.TransactionCount, 0); + Assert.GreaterOrEqual(results.Statistics.InvalidDocumentCount, 0); + Assert.GreaterOrEqual(results.Statistics.ValidDocumentCount, 0); + } + else + Assert.IsNull(results.Statistics); + + foreach (RecognizeEntitiesResult entitiesInDocument in results) + { + Assert.That(entitiesInDocument.Id, Is.Not.Null.And.Not.Empty); + + Assert.False(entitiesInDocument.HasError); + + //Even though statistics are not asked for, TA 5.0.0 shipped with Statistics default always present. + Assert.IsNotNull(entitiesInDocument.Statistics); + + if (includeStatistics) + { + Assert.GreaterOrEqual(entitiesInDocument.Statistics.CharacterCount, 0); + Assert.Greater(entitiesInDocument.Statistics.TransactionCount, 0); + } + else + { + Assert.AreEqual(0, entitiesInDocument.Statistics.CharacterCount); + Assert.AreEqual(0, entitiesInDocument.Statistics.TransactionCount); + } + + ValidateInDocumentResult(entitiesInDocument.Entities, minimumExpectedOutput[entitiesInDocument.Id]); + } + } + } +} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchConvenienceTest.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchConvenienceTest.json new file mode 100644 index 000000000000..3643bfb2c507 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchConvenienceTest.json @@ -0,0 +1,210 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "410", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-d450a3b7ad199c40a3009218558f5ec9-7c6776d1735cb946-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "c3eb54e49604a79312c6b18e5927ea06", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "0", + "text": "A recent report by the Government Accountability Office found a dramatic increase in oil.", + "language": "en" + }, + { + "id": "1", + "text": "Capital Call #20 for Berkshire Multifamily.", + "language": "en" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "0ae60fa9-40e5-4574-a79c-05b2f9d524ab", + "Date": "Mon, 27 Sep 2021 14:28:59 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/0b3137b9-eaa3-4d87-a0a2-2d9abedc60d3", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "235" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/0b3137b9-eaa3-4d87-a0a2-2d9abedc60d3", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "8dc4d48801b8b544409fecdfe93766ef", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "faafcea0-eda4-4a3e-bb9a-908adef47f2c", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:28:59 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "24" + }, + "ResponseBody": { + "jobId": "0b3137b9-eaa3-4d87-a0a2-2d9abedc60d3", + "lastUpdateDateTime": "2021-09-27T14:28:59Z", + "createdDateTime": "2021-09-27T14:28:59Z", + "expirationDateTime": "2021-09-28T14:28:59Z", + "status": "running", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/0b3137b9-eaa3-4d87-a0a2-2d9abedc60d3", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "bc84030af5b83db90df750441ea7e52f", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "e44600c2-a1af-43e5-91b3-ce70d9cde6e4", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:01 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "234" + }, + "ResponseBody": { + "jobId": "0b3137b9-eaa3-4d87-a0a2-2d9abedc60d3", + "lastUpdateDateTime": "2021-09-27T14:29:00Z", + "createdDateTime": "2021-09-27T14:28:59Z", + "expirationDateTime": "2021-09-28T14:28:59Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:00.3596127Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "0", + "entities": [ + { + "text": "recent", + "category": "object_select", + "offset": 2, + "length": 6, + "confidenceScore": 0.08 + }, + { + "text": "Government", + "category": "restaurant_name", + "offset": 23, + "length": 10, + "confidenceScore": 0.05 + }, + { + "text": "Office", + "category": "restaurant_name", + "offset": 49, + "length": 6, + "confidenceScore": 0.11 + }, + { + "text": "Accountability", + "category": "geographic_poi", + "offset": 34, + "length": 14, + "confidenceScore": 0.07 + }, + { + "text": "dramatic", + "category": "sort", + "offset": 64, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "oil", + "category": "music_item", + "offset": 85, + "length": 3, + "confidenceScore": 0.06 + } + ], + "warnings": [] + }, + { + "id": "1", + "entities": [ + { + "text": "Berkshire Multifamily", + "category": "location_name", + "offset": 21, + "length": 21, + "confidenceScore": 0.46 + } + ], + "warnings": [] + } + ], + "errors": [], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "409427476", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchConvenienceTestAsync.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchConvenienceTestAsync.json new file mode 100644 index 000000000000..546d26ec93e1 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchConvenienceTestAsync.json @@ -0,0 +1,210 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "410", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-b6be1a1c03d4424dad2e90a615b16003-7d56f6717ea86546-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "105abf0c84dde23d1d3ef35c802eeb38", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "0", + "text": "A recent report by the Government Accountability Office found a dramatic increase in oil.", + "language": "en" + }, + { + "id": "1", + "text": "Capital Call #20 for Berkshire Multifamily.", + "language": "en" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "0d5133ab-74fb-49ae-ab8f-2466e57fbd2b", + "Date": "Mon, 27 Sep 2021 14:29:10 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/9a990597-54f2-4add-b89b-aeca7fc2ddcf", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "168" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/9a990597-54f2-4add-b89b-aeca7fc2ddcf", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "9686c181314c20590468c22aff06b020", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "2ff6b66f-d7a0-47ea-bde4-3104fabe64d5", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:10 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "6" + }, + "ResponseBody": { + "jobId": "9a990597-54f2-4add-b89b-aeca7fc2ddcf", + "lastUpdateDateTime": "2021-09-27T14:29:11Z", + "createdDateTime": "2021-09-27T14:29:11Z", + "expirationDateTime": "2021-09-28T14:29:11Z", + "status": "notStarted", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/9a990597-54f2-4add-b89b-aeca7fc2ddcf", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "77ad4f5c0741abde30727c4d4a50d26f", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "27fd7e04-e091-420e-b222-d5f9d8607e30", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:12 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "75" + }, + "ResponseBody": { + "jobId": "9a990597-54f2-4add-b89b-aeca7fc2ddcf", + "lastUpdateDateTime": "2021-09-27T14:29:12Z", + "createdDateTime": "2021-09-27T14:29:11Z", + "expirationDateTime": "2021-09-28T14:29:11Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:12.134283Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "0", + "entities": [ + { + "text": "recent", + "category": "object_select", + "offset": 2, + "length": 6, + "confidenceScore": 0.08 + }, + { + "text": "Government", + "category": "restaurant_name", + "offset": 23, + "length": 10, + "confidenceScore": 0.05 + }, + { + "text": "Office", + "category": "restaurant_name", + "offset": 49, + "length": 6, + "confidenceScore": 0.11 + }, + { + "text": "Accountability", + "category": "geographic_poi", + "offset": 34, + "length": 14, + "confidenceScore": 0.07 + }, + { + "text": "dramatic", + "category": "sort", + "offset": 64, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "oil", + "category": "music_item", + "offset": 85, + "length": 3, + "confidenceScore": 0.06 + } + ], + "warnings": [] + }, + { + "id": "1", + "entities": [ + { + "text": "Berkshire Multifamily", + "category": "location_name", + "offset": 21, + "length": 21, + "confidenceScore": 0.46 + } + ], + "warnings": [] + } + ], + "errors": [], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "950474278", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchTest.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchTest.json new file mode 100644 index 000000000000..88af149a0ded --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchTest.json @@ -0,0 +1,245 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "493", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-9c88c67df55fbc459b5edc589f7077da-f1918d856921d14f-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "edd30e0cf5da712a7f16e1fbdd0ac637", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "1", + "text": "A recent report by the Government Accountability Office found a dramatic increase in oil.", + "language": "en" + }, + { + "id": "2", + "text": "Un informe reciente de la Oficina de Responsabilidad del Gobierno encontr\u00F3 un aumento dram\u00E1tico en el petr\u00F3leo.", + "language": "es" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "f61f3fcc-52a7-4be0-b146-09a4de9faca1", + "Date": "Mon, 27 Sep 2021 14:29:02 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/6190d2cd-3a7b-450a-a517-3a919e50946c", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "193" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/6190d2cd-3a7b-450a-a517-3a919e50946c", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "4eae7ee08e5fea46934d00605573c4eb", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "0f66ab9b-e323-4e60-9490-a79e164cb2c4", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:02 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "11" + }, + "ResponseBody": { + "jobId": "6190d2cd-3a7b-450a-a517-3a919e50946c", + "lastUpdateDateTime": "2021-09-27T14:29:02Z", + "createdDateTime": "2021-09-27T14:29:02Z", + "expirationDateTime": "2021-09-28T14:29:02Z", + "status": "notStarted", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/6190d2cd-3a7b-450a-a517-3a919e50946c", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "8c4a55f93b72b963f2befa0124096077", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "7b3f1475-c0ff-404d-878d-23c27c67a2b5", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:03 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "85" + }, + "ResponseBody": { + "jobId": "6190d2cd-3a7b-450a-a517-3a919e50946c", + "lastUpdateDateTime": "2021-09-27T14:29:02Z", + "createdDateTime": "2021-09-27T14:29:02Z", + "expirationDateTime": "2021-09-28T14:29:02Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:02.9794296Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "1", + "entities": [ + { + "text": "recent", + "category": "object_select", + "offset": 2, + "length": 6, + "confidenceScore": 0.08 + }, + { + "text": "Government", + "category": "restaurant_name", + "offset": 23, + "length": 10, + "confidenceScore": 0.05 + }, + { + "text": "Office", + "category": "restaurant_name", + "offset": 49, + "length": 6, + "confidenceScore": 0.11 + }, + { + "text": "Accountability", + "category": "geographic_poi", + "offset": 34, + "length": 14, + "confidenceScore": 0.07 + }, + { + "text": "dramatic", + "category": "sort", + "offset": 64, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "oil", + "category": "music_item", + "offset": 85, + "length": 3, + "confidenceScore": 0.06 + } + ], + "warnings": [] + }, + { + "id": "2", + "entities": [ + { + "text": "reciente", + "category": "object_select", + "offset": 11, + "length": 8, + "confidenceScore": 0.05 + }, + { + "text": "Responsabilidad", + "category": "state", + "offset": 37, + "length": 15, + "confidenceScore": 0.03 + }, + { + "text": "del", + "category": "restaurant_name", + "offset": 53, + "length": 3, + "confidenceScore": 0.06 + }, + { + "text": "Gobierno", + "category": "location_name", + "offset": 57, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "dram\u00E1tico", + "category": "sort", + "offset": 86, + "length": 9, + "confidenceScore": 0.03 + }, + { + "text": "petr\u00F3leo", + "category": "timeRange", + "offset": 102, + "length": 8, + "confidenceScore": 0.02 + } + ], + "warnings": [] + } + ], + "errors": [], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "871702162", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchTestAsync.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchTestAsync.json new file mode 100644 index 000000000000..84c176dc2c20 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchTestAsync.json @@ -0,0 +1,282 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "493", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-e9b1ac0f5b5f0042aff077a4ac9f3b2a-8b531d2c631fc24f-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "4b0353aa0f1651f2538f45eecc005c85", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "1", + "text": "A recent report by the Government Accountability Office found a dramatic increase in oil.", + "language": "en" + }, + { + "id": "2", + "text": "Un informe reciente de la Oficina de Responsabilidad del Gobierno encontr\u00F3 un aumento dram\u00E1tico en el petr\u00F3leo.", + "language": "es" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "0dad7e61-96f2-4625-befd-76790b737bee", + "Date": "Mon, 27 Sep 2021 14:29:12 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/a34f25dd-3d55-4b14-a8e4-e2ea9e33dd30", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "167" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/a34f25dd-3d55-4b14-a8e4-e2ea9e33dd30", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "5b675418fae20b70884cffb922a64ed4", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "1c1b155f-c677-4c15-84df-8c7c2c0b57ce", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:13 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "6" + }, + "ResponseBody": { + "jobId": "a34f25dd-3d55-4b14-a8e4-e2ea9e33dd30", + "lastUpdateDateTime": "2021-09-27T14:29:12Z", + "createdDateTime": "2021-09-27T14:29:12Z", + "expirationDateTime": "2021-09-28T14:29:12Z", + "status": "notStarted", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/a34f25dd-3d55-4b14-a8e4-e2ea9e33dd30", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "83ce8125249808d136945c8ed4f7794f", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "b5ca0cd1-4c84-4616-8aed-ebf52c8c2509", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:14 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "9" + }, + "ResponseBody": { + "jobId": "a34f25dd-3d55-4b14-a8e4-e2ea9e33dd30", + "lastUpdateDateTime": "2021-09-27T14:29:13Z", + "createdDateTime": "2021-09-27T14:29:12Z", + "expirationDateTime": "2021-09-28T14:29:12Z", + "status": "running", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/a34f25dd-3d55-4b14-a8e4-e2ea9e33dd30", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "b2c7e0173e97b036e3f8c2c910392eac", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "39135485-2263-4b5a-ba7b-9c3acf5e1f00", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:15 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "90" + }, + "ResponseBody": { + "jobId": "a34f25dd-3d55-4b14-a8e4-e2ea9e33dd30", + "lastUpdateDateTime": "2021-09-27T14:29:14Z", + "createdDateTime": "2021-09-27T14:29:12Z", + "expirationDateTime": "2021-09-28T14:29:12Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:14.1653817Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "1", + "entities": [ + { + "text": "recent", + "category": "object_select", + "offset": 2, + "length": 6, + "confidenceScore": 0.08 + }, + { + "text": "Government", + "category": "restaurant_name", + "offset": 23, + "length": 10, + "confidenceScore": 0.05 + }, + { + "text": "Office", + "category": "restaurant_name", + "offset": 49, + "length": 6, + "confidenceScore": 0.11 + }, + { + "text": "Accountability", + "category": "geographic_poi", + "offset": 34, + "length": 14, + "confidenceScore": 0.07 + }, + { + "text": "dramatic", + "category": "sort", + "offset": 64, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "oil", + "category": "music_item", + "offset": 85, + "length": 3, + "confidenceScore": 0.06 + } + ], + "warnings": [] + }, + { + "id": "2", + "entities": [ + { + "text": "reciente", + "category": "object_select", + "offset": 11, + "length": 8, + "confidenceScore": 0.05 + }, + { + "text": "Responsabilidad", + "category": "state", + "offset": 37, + "length": 15, + "confidenceScore": 0.03 + }, + { + "text": "del", + "category": "restaurant_name", + "offset": 53, + "length": 3, + "confidenceScore": 0.06 + }, + { + "text": "Gobierno", + "category": "location_name", + "offset": 57, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "dram\u00E1tico", + "category": "sort", + "offset": 86, + "length": 9, + "confidenceScore": 0.03 + }, + { + "text": "petr\u00F3leo", + "category": "timeRange", + "offset": 102, + "length": 8, + "confidenceScore": 0.02 + } + ], + "warnings": [] + } + ], + "errors": [], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "1000683860", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithErrorTest.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithErrorTest.json new file mode 100644 index 000000000000..e16e7cd13a46 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithErrorTest.json @@ -0,0 +1,220 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "406", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-1ff2bdebc0bd7345bf0c2d0327cf8b40-1cedd615f7d3464a-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "74c58b3926e0889e80427ddefcedfe72", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "0", + "text": "Microsoft was founded by Bill Gates and Paul Allen.", + "language": "en" + }, + { + "id": "1", + "text": "", + "language": "en" + }, + { + "id": "2", + "text": "My cat might need to see a veterinarian.", + "language": "en" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "6258cc8f-f10d-4602-a015-55a419426d95", + "Date": "Mon, 27 Sep 2021 14:29:03 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/8c0842f5-2e33-4efc-985e-87c53ecf2967", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "211" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/8c0842f5-2e33-4efc-985e-87c53ecf2967", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "a4929114c7dba9c0bda3307af4684b7a", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "6107b77e-89b5-432a-9ea2-39ae055ed482", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:03 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "10" + }, + "ResponseBody": { + "jobId": "8c0842f5-2e33-4efc-985e-87c53ecf2967", + "lastUpdateDateTime": "2021-09-27T14:29:03Z", + "createdDateTime": "2021-09-27T14:29:03Z", + "expirationDateTime": "2021-09-28T14:29:03Z", + "status": "notStarted", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/8c0842f5-2e33-4efc-985e-87c53ecf2967", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "e7adef42e44692733d49d530d3684c2c", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "7e8179e0-f1a5-4f54-8cbe-b692ff7cc530", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:05 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "89" + }, + "ResponseBody": { + "jobId": "8c0842f5-2e33-4efc-985e-87c53ecf2967", + "lastUpdateDateTime": "2021-09-27T14:29:05Z", + "createdDateTime": "2021-09-27T14:29:03Z", + "expirationDateTime": "2021-09-28T14:29:03Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:05.0603484Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "0", + "entities": [ + { + "text": "Microsoft", + "category": "service", + "offset": 0, + "length": 9, + "confidenceScore": 0.07 + }, + { + "text": "Bill Gates", + "category": "artist", + "offset": 25, + "length": 10, + "confidenceScore": 0.58 + }, + { + "text": "Paul Allen", + "category": "artist", + "offset": 40, + "length": 10, + "confidenceScore": 0.78 + }, + { + "text": "and", + "category": "party_size_description", + "offset": 36, + "length": 3, + "confidenceScore": 0.32 + } + ], + "warnings": [] + }, + { + "id": "2", + "entities": [ + { + "text": "cat", + "category": "current_location", + "offset": 3, + "length": 3, + "confidenceScore": 0.05 + }, + { + "text": "veterinarian", + "category": "facility", + "offset": 27, + "length": 12, + "confidenceScore": 0.06 + } + ], + "warnings": [] + } + ], + "errors": [ + { + "id": "1", + "error": { + "code": "InvalidArgument", + "message": "Invalid document in request.", + "innererror": { + "code": "InvalidDocument", + "message": "Document text is empty." + } + } + } + ], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "1422884364", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithErrorTestAsync.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithErrorTestAsync.json new file mode 100644 index 000000000000..809b65462f02 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithErrorTestAsync.json @@ -0,0 +1,220 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "406", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-454c85df61324f478368f0008b657260-0e0c9a6ce6230d41-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "dbe0afe67ce79b2b693dae40ad813deb", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "0", + "text": "Microsoft was founded by Bill Gates and Paul Allen.", + "language": "en" + }, + { + "id": "1", + "text": "", + "language": "en" + }, + { + "id": "2", + "text": "My cat might need to see a veterinarian.", + "language": "en" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "72084c2d-9d2b-4922-9287-c08912a9cf29", + "Date": "Mon, 27 Sep 2021 14:29:15 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/9c09391c-a25a-4a23-b5ea-6c85e7d0db35", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "329" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/9c09391c-a25a-4a23-b5ea-6c85e7d0db35", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "c4a0d928bf6e8664354ca0981c7872fc", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "9b9b288a-2d2f-485b-a477-19f09fd10341", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:15 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "11" + }, + "ResponseBody": { + "jobId": "9c09391c-a25a-4a23-b5ea-6c85e7d0db35", + "lastUpdateDateTime": "2021-09-27T14:29:15Z", + "createdDateTime": "2021-09-27T14:29:15Z", + "expirationDateTime": "2021-09-28T14:29:15Z", + "status": "notStarted", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/9c09391c-a25a-4a23-b5ea-6c85e7d0db35", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "1680984ed338facc289226a82980a8fd", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "bcbe403f-cd0e-43fc-9fd2-25445da24436", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:17 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "107" + }, + "ResponseBody": { + "jobId": "9c09391c-a25a-4a23-b5ea-6c85e7d0db35", + "lastUpdateDateTime": "2021-09-27T14:29:16Z", + "createdDateTime": "2021-09-27T14:29:15Z", + "expirationDateTime": "2021-09-28T14:29:15Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:16.297647Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "0", + "entities": [ + { + "text": "Microsoft", + "category": "service", + "offset": 0, + "length": 9, + "confidenceScore": 0.07 + }, + { + "text": "Bill Gates", + "category": "artist", + "offset": 25, + "length": 10, + "confidenceScore": 0.58 + }, + { + "text": "Paul Allen", + "category": "artist", + "offset": 40, + "length": 10, + "confidenceScore": 0.78 + }, + { + "text": "and", + "category": "party_size_description", + "offset": 36, + "length": 3, + "confidenceScore": 0.32 + } + ], + "warnings": [] + }, + { + "id": "2", + "entities": [ + { + "text": "cat", + "category": "current_location", + "offset": 3, + "length": 3, + "confidenceScore": 0.05 + }, + { + "text": "veterinarian", + "category": "facility", + "offset": 27, + "length": 12, + "confidenceScore": 0.06 + } + ], + "warnings": [] + } + ], + "errors": [ + { + "id": "1", + "error": { + "code": "InvalidArgument", + "message": "Invalid document in request.", + "innererror": { + "code": "InvalidDocument", + "message": "Document text is empty." + } + } + } + ], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "1044415089", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithNullIdTest.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithNullIdTest.json new file mode 100644 index 000000000000..35ef75b3c880 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithNullIdTest.json @@ -0,0 +1,66 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "253", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-22339ccd25ad6b41b8cbd5e9436187d4-11fba93eaece9a4e-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "701610698e4e2836b2896021426da6ec", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": null, + "text": "Hello world", + "language": "en" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 400, + "ResponseHeaders": { + "apim-request-id": "dad2f079-7925-45b4-b379-97aad0933429", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:05 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "7" + }, + "ResponseBody": { + "error": { + "code": "InvalidRequest", + "message": "Invalid document in request.", + "innererror": { + "code": "InvalidDocument", + "message": "At least one document is missing an Id attribute." + } + } + } + } + ], + "Variables": { + "RandomSeed": "1937417632", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithNullIdTestAsync.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithNullIdTestAsync.json new file mode 100644 index 000000000000..65384fa67dea --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesBatchWithNullIdTestAsync.json @@ -0,0 +1,66 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "253", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-ab24f51dc64fb946a6ff2426381ac8e7-cc6394362df2754e-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "031f365b46e49dc4ece8c8872a44234a", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": null, + "text": "Hello world", + "language": "en" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 400, + "ResponseHeaders": { + "apim-request-id": "faf28fce-c9ed-4394-85b2-3a35819a5684", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:17 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "5" + }, + "ResponseBody": { + "error": { + "code": "InvalidRequest", + "message": "Invalid document in request.", + "innererror": { + "code": "InvalidDocument", + "message": "At least one document is missing an Id attribute." + } + } + } + } + ], + "Variables": { + "RandomSeed": "1272363559", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesTest.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesTest.json new file mode 100644 index 000000000000..c60a3ed51ebb --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesTest.json @@ -0,0 +1,192 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "330", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-08776a98efe42e48a06134cf42558e8c-aaf45ba443cb1349-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "70dcf60840f7ecaa22659829d5e36ecf", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "0", + "text": "A recent report by the Government Accountability Office found a dramatic increase in oil.", + "language": "en" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "cb7d19ec-4ed6-4014-8146-0ce964a12fec", + "Date": "Mon, 27 Sep 2021 14:29:05 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/d5863151-c3eb-413d-b8f0-bb7d442fac29", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "164" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/d5863151-c3eb-413d-b8f0-bb7d442fac29", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "8f5d632e99738948001123455ce65d3c", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "9d7fd746-8072-4604-a554-e7fcf6bd4cbf", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:05 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "7" + }, + "ResponseBody": { + "jobId": "d5863151-c3eb-413d-b8f0-bb7d442fac29", + "lastUpdateDateTime": "2021-09-27T14:29:06Z", + "createdDateTime": "2021-09-27T14:29:05Z", + "expirationDateTime": "2021-09-28T14:29:05Z", + "status": "notStarted", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/d5863151-c3eb-413d-b8f0-bb7d442fac29", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "8a32edc4d34fec971212a900a31d191e", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "20c29846-104b-44f8-be71-6b9a149e67f5", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:06 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "68" + }, + "ResponseBody": { + "jobId": "d5863151-c3eb-413d-b8f0-bb7d442fac29", + "lastUpdateDateTime": "2021-09-27T14:29:07Z", + "createdDateTime": "2021-09-27T14:29:05Z", + "expirationDateTime": "2021-09-28T14:29:05Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:06.998622Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "0", + "entities": [ + { + "text": "recent", + "category": "object_select", + "offset": 2, + "length": 6, + "confidenceScore": 0.08 + }, + { + "text": "Government", + "category": "restaurant_name", + "offset": 23, + "length": 10, + "confidenceScore": 0.05 + }, + { + "text": "Office", + "category": "restaurant_name", + "offset": 49, + "length": 6, + "confidenceScore": 0.11 + }, + { + "text": "Accountability", + "category": "geographic_poi", + "offset": 34, + "length": 14, + "confidenceScore": 0.07 + }, + { + "text": "dramatic", + "category": "sort", + "offset": 64, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "oil", + "category": "music_item", + "offset": 85, + "length": 3, + "confidenceScore": 0.06 + } + ], + "warnings": [] + } + ], + "errors": [], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "1714539574", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesTestAsync.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesTestAsync.json new file mode 100644 index 000000000000..795999796c5d --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesTestAsync.json @@ -0,0 +1,192 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "330", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-59b09bac88d2714bb110e3bcfa3e5ae7-34bac844a31b104b-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "64a871e0e89498a4691673572a2e8f64", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "0", + "text": "A recent report by the Government Accountability Office found a dramatic increase in oil.", + "language": "en" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "a61ffcc8-011c-4909-bcb7-12863e45a75c", + "Date": "Mon, 27 Sep 2021 14:29:17 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/00b0474d-ad8e-4266-b34e-44ceb64be0f9", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "158" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/00b0474d-ad8e-4266-b34e-44ceb64be0f9", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "c6d92b6214f4777946cbe3bff02452bd", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "afd92868-a872-4621-a6de-e349f803f341", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:17 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "10" + }, + "ResponseBody": { + "jobId": "00b0474d-ad8e-4266-b34e-44ceb64be0f9", + "lastUpdateDateTime": "2021-09-27T14:29:17Z", + "createdDateTime": "2021-09-27T14:29:17Z", + "expirationDateTime": "2021-09-28T14:29:17Z", + "status": "notStarted", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/00b0474d-ad8e-4266-b34e-44ceb64be0f9", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "e0413a2ec18584e4fcb6ba8bf733acdf", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "569cee4e-0088-445d-8054-c97478f54241", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:18 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "67" + }, + "ResponseBody": { + "jobId": "00b0474d-ad8e-4266-b34e-44ceb64be0f9", + "lastUpdateDateTime": "2021-09-27T14:29:18Z", + "createdDateTime": "2021-09-27T14:29:17Z", + "expirationDateTime": "2021-09-28T14:29:17Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:18.1484336Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "0", + "entities": [ + { + "text": "recent", + "category": "object_select", + "offset": 2, + "length": 6, + "confidenceScore": 0.08 + }, + { + "text": "Government", + "category": "restaurant_name", + "offset": 23, + "length": 10, + "confidenceScore": 0.05 + }, + { + "text": "Office", + "category": "restaurant_name", + "offset": 49, + "length": 6, + "confidenceScore": 0.11 + }, + { + "text": "Accountability", + "category": "geographic_poi", + "offset": 34, + "length": 14, + "confidenceScore": 0.07 + }, + { + "text": "dramatic", + "category": "sort", + "offset": 64, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "oil", + "category": "music_item", + "offset": 85, + "length": 3, + "confidenceScore": 0.06 + } + ], + "warnings": [] + } + ], + "errors": [], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "616315711", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesWithLanguageTest.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesWithLanguageTest.json new file mode 100644 index 000000000000..601d99b656c4 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesWithLanguageTest.json @@ -0,0 +1,192 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "367", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-9eef6aa8c3804246905bae43a49be9de-612aa5eab342ec4a-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "20b2726b6f72ee77862e98bbfb8ef41b", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "1", + "text": "Un informe reciente de la Oficina de Responsabilidad del Gobierno encontr\u00F3 un aumento dram\u00E1tico en el petr\u00F3leo.", + "language": "es" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "002df656-a8b1-4f52-980f-a1ef6d8082c8", + "Date": "Mon, 27 Sep 2021 14:29:08 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/4c0e44ed-6d5c-4a0d-9243-d81bbb38399e", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "141" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/4c0e44ed-6d5c-4a0d-9243-d81bbb38399e", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "96569e75810e8734457b06ee9d1971d5", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "69345d67-52bf-4f0e-870f-4ddee8983726", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:08 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "6" + }, + "ResponseBody": { + "jobId": "4c0e44ed-6d5c-4a0d-9243-d81bbb38399e", + "lastUpdateDateTime": "2021-09-27T14:29:09Z", + "createdDateTime": "2021-09-27T14:29:09Z", + "expirationDateTime": "2021-09-28T14:29:09Z", + "status": "notStarted", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 0, + "failed": 0, + "inProgress": 1, + "total": 1 + } + } + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/4c0e44ed-6d5c-4a0d-9243-d81bbb38399e", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "a26c7ed5ef2f5bb1ae0a76384973c0ab", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "bc8017b6-2118-4d81-88f6-906e2dddc077", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:10 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "57" + }, + "ResponseBody": { + "jobId": "4c0e44ed-6d5c-4a0d-9243-d81bbb38399e", + "lastUpdateDateTime": "2021-09-27T14:29:10Z", + "createdDateTime": "2021-09-27T14:29:09Z", + "expirationDateTime": "2021-09-28T14:29:09Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:10.1076609Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "1", + "entities": [ + { + "text": "reciente", + "category": "object_select", + "offset": 11, + "length": 8, + "confidenceScore": 0.05 + }, + { + "text": "Responsabilidad", + "category": "state", + "offset": 37, + "length": 15, + "confidenceScore": 0.03 + }, + { + "text": "del", + "category": "restaurant_name", + "offset": 53, + "length": 3, + "confidenceScore": 0.06 + }, + { + "text": "Gobierno", + "category": "location_name", + "offset": 57, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "dram\u00E1tico", + "category": "sort", + "offset": 86, + "length": 9, + "confidenceScore": 0.03 + }, + { + "text": "petr\u00F3leo", + "category": "timeRange", + "offset": 102, + "length": 8, + "confidenceScore": 0.02 + } + ], + "warnings": [] + } + ], + "errors": [], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "522932983", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesWithLanguageTestAsync.json b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesWithLanguageTestAsync.json new file mode 100644 index 000000000000..b3c048ef5f7e --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/SessionRecords/RecognizeCustomEntitiesTests/RecognizeCustomEntitiesWithLanguageTestAsync.json @@ -0,0 +1,155 @@ +{ + "Entries": [ + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze", + "RequestMethod": "POST", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Content-Length": "367", + "Content-Type": "application/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "traceparent": "00-ce18a279b7b750448d57f44a9ee8c99f-3b29cbe6b9670a49-00", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "7d887a21c360dd0e46c78f0debb18a38", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": { + "analysisInput": { + "documents": [ + { + "id": "1", + "text": "Un informe reciente de la Oficina de Responsabilidad del Gobierno encontr\u00F3 un aumento dram\u00E1tico en el petr\u00F3leo.", + "language": "es" + } + ] + }, + "tasks": { + "customEntityRecognitionTasks": [ + { + "parameters": { + "project-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deployment-name": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + }, + "StatusCode": 202, + "ResponseHeaders": { + "apim-request-id": "6febff9d-9c41-48ff-821e-a65415a436be", + "Date": "Mon, 27 Sep 2021 14:29:19 GMT", + "operation-location": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/208d2931-8a60-4b4b-aaeb-6f6726282fde", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "158" + }, + "ResponseBody": [] + }, + { + "RequestUri": "https://cognitiveweppe.azure-api.net/text/analytics/v3.2-preview.2/analyze/jobs/208d2931-8a60-4b4b-aaeb-6f6726282fde", + "RequestMethod": "GET", + "RequestHeaders": { + "Accept": "application/json, text/json", + "Ocp-Apim-Subscription-Key": "Sanitized", + "User-Agent": "azsdk-net-AI.TextAnalytics/5.2.0-alpha.20210927.1 (.NET Framework 4.8.4341.0; Microsoft Windows 10.0.19043 )", + "x-ms-client-request-id": "6ad520feb24348dd00a9200b83146ed4", + "x-ms-return-client-request-id": "true" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "apim-request-id": "c7958de5-0125-4d3f-8114-28afbfeb8450", + "Content-Type": "application/json; charset=utf-8", + "Date": "Mon, 27 Sep 2021 14:29:20 GMT", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", + "Transfer-Encoding": "chunked", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "68" + }, + "ResponseBody": { + "jobId": "208d2931-8a60-4b4b-aaeb-6f6726282fde", + "lastUpdateDateTime": "2021-09-27T14:29:20Z", + "createdDateTime": "2021-09-27T14:29:19Z", + "expirationDateTime": "2021-09-28T14:29:19Z", + "status": "succeeded", + "errors": [], + "displayName": "NA", + "tasks": { + "completed": 1, + "failed": 0, + "inProgress": 0, + "total": 1, + "customEntityRecognitionTasks": [ + { + "lastUpdateDateTime": "2021-09-27T14:29:20.1437663Z", + "state": "succeeded", + "results": { + "documents": [ + { + "id": "1", + "entities": [ + { + "text": "reciente", + "category": "object_select", + "offset": 11, + "length": 8, + "confidenceScore": 0.05 + }, + { + "text": "Responsabilidad", + "category": "state", + "offset": 37, + "length": 15, + "confidenceScore": 0.03 + }, + { + "text": "del", + "category": "restaurant_name", + "offset": 53, + "length": 3, + "confidenceScore": 0.06 + }, + { + "text": "Gobierno", + "category": "location_name", + "offset": 57, + "length": 8, + "confidenceScore": 0.03 + }, + { + "text": "dram\u00E1tico", + "category": "sort", + "offset": 86, + "length": 9, + "confidenceScore": 0.03 + }, + { + "text": "petr\u00F3leo", + "category": "timeRange", + "offset": 102, + "length": 8, + "confidenceScore": 0.02 + } + ], + "warnings": [] + } + ], + "errors": [], + "projectName": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "deploymentName": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } + } + ] + } + } + } + ], + "Variables": { + "RandomSeed": "120361969", + "TEXT_ANALYTICS_API_KEY": "Sanitized", + "TEXT_ANALYTICS_DEPLOYMENT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494", + "TEXT_ANALYTICS_ENDPOINT": "https://cognitiveweppe.azure-api.net", + "TEXT_ANALYTICS_PROJECT_NAME": "88ee0f78-fbca-444d-98e2-7c4c8631e494" + } +} \ No newline at end of file diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/TextAnalyticsModelFactoryTests.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/TextAnalyticsModelFactoryTests.cs index 220d24d7e21b..f3886512eaae 100644 --- a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/TextAnalyticsModelFactoryTests.cs +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/TextAnalyticsModelFactoryTests.cs @@ -136,6 +136,12 @@ public void AnalyzeActionsResult() TextAnalyticsModelFactory.AnalyzeSentimentActionResult(default, default) }; + var recognizeCustomEntitiesActionResults = new List() + { + TextAnalyticsModelFactory.RecognizeCustomEntitiesActionResult(default, default), + TextAnalyticsModelFactory.RecognizeCustomEntitiesActionResult(default, default) + }; + var singleCategoryClassifyActionResults = new List() { TextAnalyticsModelFactory.SingleCategoryClassifyActionResult(default, default), @@ -175,6 +181,7 @@ public void AnalyzeActionsResult() recognizeLinkedEntitiesActionResults, analyzeSentimentActionResults, extractSummaryActionResults, + recognizeCustomEntitiesActionResults, singleCategoryClassifyActionResults, multiCategoryClassifyActionResults); @@ -184,6 +191,7 @@ public void AnalyzeActionsResult() CollectionAssert.AreEquivalent(recognizeLinkedEntitiesActionResults, actionsResult.RecognizeLinkedEntitiesResults); CollectionAssert.AreEquivalent(analyzeSentimentActionResults, actionsResult.AnalyzeSentimentResults); CollectionAssert.AreEquivalent(extractSummaryActionResults, actionsResult.ExtractSummaryResults); + CollectionAssert.AreEquivalent(recognizeCustomEntitiesActionResults, actionsResult.RecognizeCustomEntitiesResults); CollectionAssert.AreEquivalent(singleCategoryClassifyActionResults, actionsResult.SingleCategoryClassifyResults); CollectionAssert.AreEquivalent(multiCategoryClassifyActionResults, actionsResult.MultiCategoryClassifyResults); } diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntities.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntities.cs new file mode 100644 index 000000000000..02ac498b1540 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntities.cs @@ -0,0 +1,108 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Threading; +using Azure.Core.TestFramework; +using NUnit.Framework; + +namespace Azure.AI.TextAnalytics.Tests.Samples +{ + public partial class TextAnalyticsSamples : SamplesBase + { + [Test] + public void RecognizeCustomEntities() + { + // Create a text analytics client. + string endpoint = TestEnvironment.Endpoint; + string apiKey = TestEnvironment.ApiKey; + var client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); + + // Create input documents. + string documentA = @"A recent report by the Government Accountability Office (GAO) found that the dramatic + increase in oil and natural gas development on federal lands over the past six years + has stretched the staff of the BLM to a point that it has been unable to meet its + environmental protection responsibilities."; + + string documentB = @"David Schmidt, senior vice president--Food Safety, International Food Information + Council (IFIC), Washington, D.C., discussed the physical activity component."; + + var batchDocuments = new List + { + new TextDocumentInput("1", documentA) + { + Language = "en", + }, + new TextDocumentInput("2", documentB) + { + Language = "en", + } + }; + + // prepare actions. + var actions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + // Start analysis process. + AnalyzeActionsOperation operation = client.StartAnalyzeActions(batchDocuments, actions); + + // Wait for completion with manual polling. + TimeSpan pollingInterval = new TimeSpan(1000); + + while (true) + { + Console.WriteLine($"Status: {operation.Status}"); + operation.UpdateStatus(); + if (operation.HasCompleted) + { + break; + } + + Thread.Sleep(pollingInterval); + } + + // View operation status. + Console.WriteLine($"AnalyzeActions operation has completed"); + Console.WriteLine(); + + Console.WriteLine($"Created On : {operation.CreatedOn}"); + Console.WriteLine($"Expires On : {operation.ExpiresOn}"); + Console.WriteLine($"Id : {operation.Id}"); + Console.WriteLine($"Status : {operation.Status}"); + Console.WriteLine($"Last Modified: {operation.LastModified}"); + Console.WriteLine(); + + // View operation results. + foreach (AnalyzeActionsResult documentsInPage in operation.GetValues()) + { + IReadOnlyCollection customEntitiesActionResults = documentsInPage.RecognizeCustomEntitiesResults; + foreach (RecognizeCustomEntitiesActionResult customEntitiesActionResult in customEntitiesActionResults) + { + int docNumber = 1; + foreach (RecognizeEntitiesResult documentResults in customEntitiesActionResult.DocumentsResults) + { + Console.WriteLine($" Document #{docNumber++}"); + Console.WriteLine($" Recognized the following {documentResults.Entities.Count} entities:"); + + foreach (CategorizedEntity entity in documentResults.Entities) + { + Console.WriteLine($" Entity: {entity.Text}"); + Console.WriteLine($" Category: {entity.Category}"); + Console.WriteLine($" Offset: {entity.Offset}"); + Console.WriteLine($" Length: {entity.Length}"); + Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}"); + Console.WriteLine($" SubCategory: {entity.SubCategory}"); + } + Console.WriteLine(""); + } + } + } + } + } +} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesAsync.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesAsync.cs new file mode 100644 index 000000000000..12786cb975e5 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesAsync.cs @@ -0,0 +1,113 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Azure.Core.TestFramework; +using NUnit.Framework; + +namespace Azure.AI.TextAnalytics.Tests.Samples +{ + public partial class TextAnalyticsSamples : SamplesBase + { + [Test] + public async Task RecognizeCustomEntitiesAsync() + { + // Create a text analytics client. + string endpoint = TestEnvironment.Endpoint; + string apiKey = TestEnvironment.ApiKey; + var client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); + + #region Snippet:RecognizeCustomEntitiesActionAsync + // Create input documents. + string documentA = @"We love this trail and make the trip every year. The views are breathtaking and well + worth the hike! Yesterday was foggy though, so we missed the spectacular views. + We tried again today and it was amazing. Everyone in my family liked the trail although + it was too challenging for the less athletic among us."; + + string documentB = @"Last week we stayed at Hotel Foo to celebrate our anniversary. The staff knew about + our anniversary so they helped me organize a little surprise for my partner. + The room was clean and with the decoration I requested. It was perfect!"; + + var batchDocuments = new List + { + new TextDocumentInput("1", documentA) + { + Language = "en", + }, + new TextDocumentInput("2", documentB) + { + Language = "en", + } + }; + + // prepare actions. +#if SNIPPET + string projectName = ""; + string deploymentName = ""; + var actions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(projectName, deploymentName); + } + }; +#else + var actions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; +#endif + + AnalyzeActionsOperation operation = await client.StartAnalyzeActionsAsync(batchDocuments, actions); + + await operation.WaitForCompletionAsync(); + #endregion + + #region Snippet:RecognizeCustomEntitiesActionOperationStatus + // View operation status. + Console.WriteLine($"AnalyzeActions operation has completed"); + Console.WriteLine(); + Console.WriteLine($"Created On : {operation.CreatedOn}"); + Console.WriteLine($"Expires On : {operation.ExpiresOn}"); + Console.WriteLine($"Id : {operation.Id}"); + Console.WriteLine($"Status : {operation.Status}"); + Console.WriteLine($"Last Modified: {operation.LastModified}"); + Console.WriteLine(); + #endregion + + #region Snippet:RecognizeCustomEntitiesActionAsyncViewResults + + await foreach (AnalyzeActionsResult documentsInPage in operation.Value) + { + IReadOnlyCollection customEntitiesActionResults = documentsInPage.RecognizeCustomEntitiesResults; + foreach (RecognizeCustomEntitiesActionResult customEntitiesActionResult in customEntitiesActionResults) + { + int docNumber = 1; + foreach (RecognizeEntitiesResult documentResults in customEntitiesActionResult.DocumentsResults) + { + Console.WriteLine($" Document #{docNumber++}"); + Console.WriteLine($" Recognized the following {documentResults.Entities.Count} entities:"); + + foreach (CategorizedEntity entity in documentResults.Entities) + { + Console.WriteLine($" Entity: {entity.Text}"); + Console.WriteLine($" Category: {entity.Category}"); + Console.WriteLine($" Offset: {entity.Offset}"); + Console.WriteLine($" Length: {entity.Length}"); + Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}"); + Console.WriteLine($" SubCategory: {entity.SubCategory}"); + } + Console.WriteLine(""); + } + } + } + #endregion + } + } +} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesConvenience.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesConvenience.cs new file mode 100644 index 000000000000..85904830e3e8 --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesConvenience.cs @@ -0,0 +1,103 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Threading; +using Azure.Core.TestFramework; +using NUnit.Framework; + +namespace Azure.AI.TextAnalytics.Tests.Samples +{ + public partial class TextAnalyticsSamples : SamplesBase + { + [Test] + public void RecognizeCustomEntitiesConvenience() + { + // Create a text analytics client. + string endpoint = TestEnvironment.Endpoint; + string apiKey = TestEnvironment.ApiKey; + var client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); + + // Create input documents. + string documentA = @"We love this trail and make the trip every year. The views are breathtaking and well + worth the hike! Yesterday was foggy though, so we missed the spectacular views. + We tried again today and it was amazing. Everyone in my family liked the trail although + it was too challenging for the less athletic among us."; + + string documentB = @"Last week we stayed at Hotel Foo to celebrate our anniversary. The staff knew about + our anniversary so they helped me organize a little surprise for my partner. + The room was clean and with the decoration I requested. It was perfect!"; + + var batchDocuments = new List + { + documentA, + documentB + }; + + // prepare actions. + var actions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + // Start analysis process. + AnalyzeActionsOperation operation = client.StartAnalyzeActions(batchDocuments, actions); + + // Wait for completion with manual polling. + TimeSpan pollingInterval = new TimeSpan(1000); + + while (true) + { + Console.WriteLine($"Status: {operation.Status}"); + operation.UpdateStatus(); + if (operation.HasCompleted) + { + break; + } + + Thread.Sleep(pollingInterval); + } + + // View operation status. + Console.WriteLine($"AnalyzeActions operation has completed"); + Console.WriteLine(); + + Console.WriteLine($"Created On : {operation.CreatedOn}"); + Console.WriteLine($"Expires On : {operation.ExpiresOn}"); + Console.WriteLine($"Id : {operation.Id}"); + Console.WriteLine($"Status : {operation.Status}"); + Console.WriteLine($"Last Modified: {operation.LastModified}"); + Console.WriteLine(); + + // View operation results. + foreach (AnalyzeActionsResult documentsInPage in operation.GetValues()) + { + IReadOnlyCollection customEntitiesActionResults = documentsInPage.RecognizeCustomEntitiesResults; + foreach (RecognizeCustomEntitiesActionResult customEntitiesActionResult in customEntitiesActionResults) + { + int docNumber = 1; + foreach (RecognizeEntitiesResult documentResults in customEntitiesActionResult.DocumentsResults) + { + Console.WriteLine($" Document #{docNumber++}"); + Console.WriteLine($" Recognized the following {documentResults.Entities.Count} entities:"); + + foreach (CategorizedEntity entity in documentResults.Entities) + { + Console.WriteLine($" Entity: {entity.Text}"); + Console.WriteLine($" Category: {entity.Category}"); + Console.WriteLine($" Offset: {entity.Offset}"); + Console.WriteLine($" Length: {entity.Length}"); + Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}"); + Console.WriteLine($" SubCategory: {entity.SubCategory}"); + } + Console.WriteLine(""); + } + } + } + } + } +} diff --git a/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesConvenienceAsync.cs b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesConvenienceAsync.cs new file mode 100644 index 000000000000..7c9ef55cd06e --- /dev/null +++ b/sdk/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample9_RecognizeCustomEntitiesConvenienceAsync.cs @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Azure.Core.TestFramework; +using NUnit.Framework; + +namespace Azure.AI.TextAnalytics.Tests.Samples +{ + public partial class TextAnalyticsSamples : SamplesBase + { + [Test] + public async Task RecognizeCustomEntitiesConvenienceAsync() + { + // Create a text analytics client. + string endpoint = TestEnvironment.Endpoint; + string apiKey = TestEnvironment.ApiKey; + var client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); + + // Create input documents. + string documentA = @"We love this trail and make the trip every year. The views are breathtaking and well + worth the hike! Yesterday was foggy though, so we missed the spectacular views. + We tried again today and it was amazing. Everyone in my family liked the trail although + it was too challenging for the less athletic among us."; + + string documentB = @"Last week we stayed at Hotel Foo to celebrate our anniversary. The staff knew about + our anniversary so they helped me organize a little surprise for my partner. + The room was clean and with the decoration I requested. It was perfect!"; + + var batchDocuments = new List + { + documentA, + documentB + }; + + // prepare actions + var actions = new TextAnalyticsActions() + { + RecognizeCustomEntitiesActions = new List() + { + new RecognizeCustomEntitiesAction(TestEnvironment.RecognizeCustomEntitiesProjectName, TestEnvironment.RecognizeCustomEntitiesDeploymentName) + } + }; + + AnalyzeActionsOperation operation = await client.StartAnalyzeActionsAsync(batchDocuments, actions); + + await operation.WaitForCompletionAsync(); + + await foreach (AnalyzeActionsResult documentsInPage in operation.Value) + { + IReadOnlyCollection customEntitiesActionResults = documentsInPage.RecognizeCustomEntitiesResults; + foreach (RecognizeCustomEntitiesActionResult customEntitiesActionResult in customEntitiesActionResults) + { + int docNumber = 1; + foreach (RecognizeEntitiesResult documentResults in customEntitiesActionResult.DocumentsResults) + { + Console.WriteLine($" Document #{docNumber++}"); + Console.WriteLine($" Recognized the following {documentResults.Entities.Count} entities:"); + + foreach (CategorizedEntity entity in documentResults.Entities) + { + Console.WriteLine($" Entity: {entity.Text}"); + Console.WriteLine($" Category: {entity.Category}"); + Console.WriteLine($" Offset: {entity.Offset}"); + Console.WriteLine($" Length: {entity.Length}"); + Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}"); + Console.WriteLine($" SubCategory: {entity.SubCategory}"); + } + Console.WriteLine(""); + } + } + } + } + } +}