From 24a8f2e9a4bd40b55af3d5acc0e92dfd2fa15e5f Mon Sep 17 00:00:00 2001 From: Anne Thompson Date: Thu, 5 Dec 2019 08:18:17 -0800 Subject: [PATCH] TextAnalytics API Refactoring (#8905) * move errors to document result * api updates per feedback * Remove interface * Include Statistics * updates per API feedback * shift to result collections * TextAnalysisOptions * reenable recognize entity single * reenable recognize entity batch * reenable key phrases * reenable remaining * API feedback * bug fix * pr feedback * pr feedback --- .../src/AnalyzeSentimentResult.cs | 34 ++ .../src/AnalyzeSentimentResultCollection.cs | 32 ++ .../src/DetectLanguageResult.cs | 34 ++ .../src/DetectLanguageResultCollection.cs | 32 ++ .../src/DocumentError.cs | 26 - .../src/DocumentResultCollection{T}.cs | 34 -- .../src/ExtractKeyPhrasesResult.cs | 28 + .../src/ExtractKeyPhrasesResultCollection.cs | 32 ++ .../src/ExtractLinkedEntitiesResult.cs | 28 + .../ExtractLinkedEntitiesResultCollection.cs | 32 ++ .../src/RecognizeEntitiesResult.cs | 28 + .../src/RecognizeEntitiesResultCollection.cs | 32 ++ .../src/SentimentResult.cs | 24 - .../src/SentimentResultCollection.cs | 32 -- .../src/TextAnalysisOptions.cs | 24 + ...mentResult{T}.cs => TextAnalysisResult.cs} | 19 +- .../src/TextAnalyticsClient.cs | 504 ++++++------------ .../src/TextAnalyticsClientOptions.cs | 8 + .../src/TextAnalyticsClient_private.cs | 94 +--- .../src/TextAnalyticsRequestOptions.cs | 28 - .../src/TextAnalyticsServiceSerializer.cs | 344 ++++-------- ...chStatistics.cs => TextBatchStatistics.cs} | 4 +- ...{DocumentInput.cs => TextDocumentInput.cs} | 8 +- ...tatistics.cs => TextDocumentStatistics.cs} | 4 +- .../src/{Sentiment.cs => TextSentiment.cs} | 6 +- ...entimentClass.cs => TextSentimentClass.cs} | 2 +- .../tests/samples/Sample2_DetectLanguage.cs | 3 +- .../samples/Sample2_DetectLanguageBatch.cs | 67 ++- .../Sample2_DetectLanguageBatchAdvanced.cs | 75 --- .../Sample2_DetectLanguageBatchConvenience.cs | 46 ++ .../samples/Sample3_RecognizeEntities.cs | 4 +- .../samples/Sample3_RecognizeEntitiesBatch.cs | 57 +- .../Sample3_RecognizeEntitiesBatchAdvanced.cs | 76 --- ...mple3_RecognizeEntitiesBatchConvenience.cs | 48 ++ .../tests/samples/Sample4_AnalyzeSentiment.cs | 3 +- .../samples/Sample4_AnalyzeSentimentBatch.cs | 80 ++- .../Sample4_AnalyzeSentimentBatchAdvanced.cs | 91 ---- ...ample4_AnalyzeSentimentBatchConvenience.cs | 52 ++ .../samples/Sample5_ExtractKeyPhrases.cs | 4 +- .../samples/Sample5_ExtractKeyPhrasesBatch.cs | 58 +- .../Sample5_ExtractKeyPhrasesBatchAdvanced.cs | 77 --- ...mple5_ExtractKeyPhrasesBatchConvenience.cs | 48 ++ .../samples/Sample6_RecognizePiiEntities.cs | 4 +- .../Sample6_RecognizePiiEntitiesBatch.cs | 57 +- ...mple6_RecognizePiiEntitiesBatchAdvanced.cs | 76 --- ...e6_RecognizePiiEntitiesBatchConvenience.cs | 48 ++ .../samples/Sample7_ExtractEntityLinking.cs | 6 +- .../Sample7_ExtractEntityLinkingBatch.cs | 63 ++- ...mple7_ExtractEntityLinkingBatchAdvanced.cs | 80 --- ...e7_ExtractEntityLinkingBatchConvenience.cs | 54 ++ 50 files changed, 1254 insertions(+), 1396 deletions(-) create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeSentimentResult.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeSentimentResultCollection.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DetectLanguageResult.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DetectLanguageResultCollection.cs delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentError.cs delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentResultCollection{T}.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractKeyPhrasesResult.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractKeyPhrasesResultCollection.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractLinkedEntitiesResult.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractLinkedEntitiesResultCollection.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/RecognizeEntitiesResult.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/RecognizeEntitiesResultCollection.cs delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentResult.cs delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentResultCollection.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalysisOptions.cs rename sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/{DocumentResult{T}.cs => TextAnalysisResult.cs} (57%) delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsRequestOptions.cs rename sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/{DocumentBatchStatistics.cs => TextBatchStatistics.cs} (86%) rename sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/{DocumentInput.cs => TextDocumentInput.cs} (80%) rename sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/{DocumentStatistics.cs => TextDocumentStatistics.cs} (82%) rename sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/{Sentiment.cs => TextSentiment.cs} (83%) rename sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/{SentimentClass.cs => TextSentimentClass.cs} (94%) delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatchAdvanced.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatchConvenience.cs delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatchAdvanced.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatchConvenience.cs delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatchAdvanced.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatchConvenience.cs delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatchAdvanced.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatchConvenience.cs delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatchAdvanced.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatchConvenience.cs delete mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatchAdvanced.cs create mode 100644 sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatchConvenience.cs diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeSentimentResult.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeSentimentResult.cs new file mode 100644 index 000000000000..cdafde200b7f --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeSentimentResult.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class AnalyzeSentimentResult : TextAnalysisResult + { + internal AnalyzeSentimentResult(string id, TextDocumentStatistics statistics, TextSentiment documentSentiment, IList sentenceSentiments) + : base(id, statistics) + { + DocumentSentiment = documentSentiment; + SentenceSentiments = new ReadOnlyCollection(sentenceSentiments); + } + + internal AnalyzeSentimentResult(string id, string errorMessage) + : base(id, errorMessage) + { + } + + // TODO: set DocumentSentiment.Length + /// + /// + public TextSentiment DocumentSentiment { get; } + + /// + /// + public IReadOnlyCollection SentenceSentiments { get; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeSentimentResultCollection.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeSentimentResultCollection.cs new file mode 100644 index 000000000000..79fb801e1080 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/AnalyzeSentimentResultCollection.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class AnalyzeSentimentResultCollection : ReadOnlyCollection + { + /// + /// + /// + /// + /// + internal AnalyzeSentimentResultCollection(IList list, TextBatchStatistics statistics, string modelVersion) : base(list) + { + Statistics = statistics; + ModelVersion = modelVersion; + } + + /// + /// + public TextBatchStatistics Statistics { get; } + + /// + /// + public string ModelVersion { get; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DetectLanguageResult.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DetectLanguageResult.cs new file mode 100644 index 000000000000..cfc2b6dd8b51 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DetectLanguageResult.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class DetectLanguageResult : TextAnalysisResult + { + internal DetectLanguageResult(string id, TextDocumentStatistics statistics, IList detectedLanguages) + : base(id, statistics) + { + DetectedLanguages = new ReadOnlyCollection(detectedLanguages); + } + + internal DetectLanguageResult(string id, string errorMessage) + : base(id, errorMessage) + { + DetectedLanguages = new ReadOnlyCollection(new List()); + } + + /// + /// + public IReadOnlyCollection DetectedLanguages { get; } + + /// + /// + public DetectedLanguage PrimaryLanguage => DetectedLanguages.OrderBy(l => l.Score).FirstOrDefault(); + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DetectLanguageResultCollection.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DetectLanguageResultCollection.cs new file mode 100644 index 000000000000..b4dfce6f3ca9 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DetectLanguageResultCollection.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class DetectLanguageResultCollection : ReadOnlyCollection + { + /// + /// + /// + /// + /// + internal DetectLanguageResultCollection(IList list, TextBatchStatistics statistics, string modelVersion) : base(list) + { + Statistics = statistics; + ModelVersion = modelVersion; + } + + /// + /// + public TextBatchStatistics Statistics { get; } + + /// + /// + public string ModelVersion { get; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentError.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentError.cs deleted file mode 100644 index 581a15dda642..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentError.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Azure.AI.TextAnalytics -{ - /// - /// - public readonly struct DocumentError - { - internal DocumentError(string id, string message) - { - Id = id; - Message = message; - } - - /// - /// Gets input document unique identifier the error refers to. - /// - public string Id { get; } - - /// - /// Gets error message. - /// - public string Message { get; } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentResultCollection{T}.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentResultCollection{T}.cs deleted file mode 100644 index afc83b78117e..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentResultCollection{T}.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace Azure.AI.TextAnalytics -{ - /// - /// - public class DocumentResultCollection : Collection> - { - /// - /// - internal DocumentResultCollection() - { - } - - /// - /// Errors and Warnings by document. - /// - public List Errors { get; } = new List(); - - /// - /// Gets (Optional) if showStatistics=true was specified in the request this - /// field will contain information about the request payload. - /// - public DocumentBatchStatistics Statistics { get; internal set; } - - /// - /// - public string ModelVersion { get; internal set; } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractKeyPhrasesResult.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractKeyPhrasesResult.cs new file mode 100644 index 000000000000..28206ebef160 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractKeyPhrasesResult.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class ExtractKeyPhrasesResult : TextAnalysisResult + { + internal ExtractKeyPhrasesResult(string id, TextDocumentStatistics statistics, IList keyPhrases) + : base(id, statistics) + { + KeyPhrases = new ReadOnlyCollection(keyPhrases); + } + + internal ExtractKeyPhrasesResult(string id, string errorMessage) + : base(id, errorMessage) + { + } + + /// + /// + public IReadOnlyCollection KeyPhrases { get; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractKeyPhrasesResultCollection.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractKeyPhrasesResultCollection.cs new file mode 100644 index 000000000000..5f99f3da0b9f --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractKeyPhrasesResultCollection.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class ExtractKeyPhrasesResultCollection : ReadOnlyCollection + { + /// + /// + /// + /// + /// + internal ExtractKeyPhrasesResultCollection(IList list, TextBatchStatistics statistics, string modelVersion) : base(list) + { + Statistics = statistics; + ModelVersion = modelVersion; + } + + /// + /// + public TextBatchStatistics Statistics { get; } + + /// + /// + public string ModelVersion { get; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractLinkedEntitiesResult.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractLinkedEntitiesResult.cs new file mode 100644 index 000000000000..6bdc1f31f691 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractLinkedEntitiesResult.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class ExtractLinkedEntitiesResult : TextAnalysisResult + { + internal ExtractLinkedEntitiesResult(string id, TextDocumentStatistics statistics, IList linkedEntities) + : base(id, statistics) + { + LinkedEntities = new ReadOnlyCollection(linkedEntities); + } + + internal ExtractLinkedEntitiesResult(string id, string errorMessage) + : base(id, errorMessage) + { + } + + /// + /// + public IReadOnlyCollection LinkedEntities { get; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractLinkedEntitiesResultCollection.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractLinkedEntitiesResultCollection.cs new file mode 100644 index 000000000000..0c0c28b4cc62 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/ExtractLinkedEntitiesResultCollection.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class ExtractLinkedEntitiesResultCollection : ReadOnlyCollection + { + /// + /// + /// + /// + /// + internal ExtractLinkedEntitiesResultCollection(IList list, TextBatchStatistics statistics, string modelVersion) : base(list) + { + Statistics = statistics; + ModelVersion = modelVersion; + } + + /// + /// + public TextBatchStatistics Statistics { get; } + + /// + /// + public string ModelVersion { get; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/RecognizeEntitiesResult.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/RecognizeEntitiesResult.cs new file mode 100644 index 000000000000..daa818671d8a --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/RecognizeEntitiesResult.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class RecognizeEntitiesResult : TextAnalysisResult + { + internal RecognizeEntitiesResult(string id, TextDocumentStatistics statistics, IList entities) + : base(id, statistics) + { + NamedEntities = new ReadOnlyCollection(entities); + } + + internal RecognizeEntitiesResult(string id, string errorMessage) + : base(id, errorMessage) + { + } + + /// + /// + public IReadOnlyCollection NamedEntities { get; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/RecognizeEntitiesResultCollection.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/RecognizeEntitiesResultCollection.cs new file mode 100644 index 000000000000..0bc9e2a6db73 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/RecognizeEntitiesResultCollection.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class RecognizeEntitiesResultCollection : ReadOnlyCollection + { + /// + /// + /// + /// + /// + internal RecognizeEntitiesResultCollection(IList list, TextBatchStatistics statistics, string modelVersion) : base(list) + { + Statistics = statistics; + ModelVersion = modelVersion; + } + + /// + /// + public TextBatchStatistics Statistics { get; } + + /// + /// + public string ModelVersion { get; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentResult.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentResult.cs deleted file mode 100644 index 4ebfd636e2a0..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentResult.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Azure.AI.TextAnalytics -{ - /// - /// - public class SentimentResult : DocumentResult - { - internal SentimentResult(string id, DocumentStatistics statistics) - : base(id, statistics) - { - } - - // TODO: set DocumentSentiment.Length - /// - /// - public Sentiment DocumentSentiment { get; set; } - - /// - /// - public DocumentResult SentenceSentiments => this; - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentResultCollection.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentResultCollection.cs deleted file mode 100644 index 234916fcfa83..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentResultCollection.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System.Collections.Generic; -using System.Collections.ObjectModel; - -namespace Azure.AI.TextAnalytics -{ - /// - /// - public class SentimentResultCollection : Collection - { - internal SentimentResultCollection() - { - } - - /// - /// Errors and Warnings by document. - /// - public List Errors { get; } = new List(); - - /// - /// Gets (Optional) if showStatistics=true was specified in the request this - /// field will contain information about the request payload. - /// - public DocumentBatchStatistics Statistics { get; internal set; } - - /// - /// - public string ModelVersion { get; internal set; } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalysisOptions.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalysisOptions.cs new file mode 100644 index 000000000000..293f525913e9 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalysisOptions.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace Azure.AI.TextAnalytics +{ + /// + /// + public class TextAnalysisOptions + { + /// + /// + public TextAnalysisOptions() + { + } + + /// + /// + public bool IncludeStatistics { get; set; } + + /// + /// + public string ModelVersion { get; set; } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentResult{T}.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalysisResult.cs similarity index 57% rename from sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentResult{T}.cs rename to sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalysisResult.cs index 53f6dfe10f0d..a9015b0ae2e1 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentResult{T}.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalysisResult.cs @@ -1,20 +1,24 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using System.Collections.ObjectModel; - namespace Azure.AI.TextAnalytics { /// /// - public class DocumentResult : Collection + public class TextAnalysisResult { - internal DocumentResult(string id, DocumentStatistics statistics) + internal TextAnalysisResult(string id, TextDocumentStatistics statistics) { Id = id; Statistics = statistics; } + internal TextAnalysisResult(string id, string errorMessage) + { + Id = id; + ErrorMessage = errorMessage; + } + /// /// Gets unique, non-empty document identifier. /// @@ -25,6 +29,11 @@ internal DocumentResult(string id, DocumentStatistics statistics) /// request this field will contain information about the document /// payload. /// - public DocumentStatistics Statistics { get; } + public TextDocumentStatistics Statistics { get; } + + /// + /// Errors and Warnings by document. + /// + public string ErrorMessage { get; } } } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient.cs index 24de0105532b..d8f80fb37943 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient.cs @@ -20,6 +20,7 @@ public partial class TextAnalyticsClient private readonly ClientDiagnostics _clientDiagnostics; private readonly string _subscriptionKey; private readonly string _apiVersion; + private readonly TextAnalyticsClientOptions _options; /// /// Protected constructor to allow mocking. @@ -76,20 +77,21 @@ public TextAnalyticsClient(Uri endpoint, string subscriptionKey, TextAnalyticsCl _apiVersion = options.GetVersionString(); _pipeline = HttpPipelineBuilder.Build(options); _clientDiagnostics = new ClientDiagnostics(options); + _options = options; } #region Detect Language - // Note that this is a simple overload that takes a single input and returns a single detected language. - // More advanced overloads are available that return the full list of detected languages. /// /// /// /// /// /// - public virtual async Task> DetectLanguageAsync(string inputText, string countryHint = "us", CancellationToken cancellationToken = default) + public virtual async Task> DetectLanguageAsync(string inputText, string countryHint = default, CancellationToken cancellationToken = default) { + // TODO: set countryHint from options. + Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.DetectLanguage"); @@ -104,13 +106,13 @@ public virtual async Task> DetectLanguageAsync(string switch (response.Status) { case 200: - DocumentResultCollection result = await CreateDetectLanguageResponseAsync(response, cancellationToken).ConfigureAwait(false); - if (result.Errors.Count > 0) + DetectLanguageResultCollection result = await CreateDetectLanguageResponseAsync(response, cancellationToken).ConfigureAwait(false); + if (result[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw await response.CreateRequestFailedExceptionAsync(result.Errors[0].Message).ConfigureAwait(false); + throw await response.CreateRequestFailedExceptionAsync(result[0].ErrorMessage).ConfigureAwait(false); } - return CreateDetectedLanguageResponseSimple(response, result[0][0]); + return Response.FromValue(result[0], response); default: throw await response.CreateRequestFailedExceptionAsync().ConfigureAwait(false); } @@ -128,7 +130,7 @@ public virtual async Task> DetectLanguageAsync(string /// /// /// - public virtual Response DetectLanguage(string inputText, string countryHint = "us", CancellationToken cancellationToken = default) + public virtual Response DetectLanguage(string inputText, string countryHint = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -144,13 +146,13 @@ public virtual Response DetectLanguage(string inputText, strin switch (response.Status) { case 200: - DocumentResultCollection result = CreateDetectLanguageResponse(response); - if (result.Errors.Count > 0) + DetectLanguageResultCollection result = CreateDetectLanguageResponse(response); + if (result[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw response.CreateRequestFailedException(result.Errors[0].Message); + throw response.CreateRequestFailedException(result[0].ErrorMessage); } - return CreateDetectedLanguageResponseSimple(response, result[0][0]); + return Response.FromValue(result[0], response); default: throw response.CreateRequestFailedException(); } @@ -168,66 +170,24 @@ public virtual Response DetectLanguage(string inputText, strin /// /// /// - public virtual async Task>> DetectLanguagesAsync(IEnumerable inputs, string countryHint = "us", CancellationToken cancellationToken = default) + public virtual async Task> DetectLanguagesAsync(IEnumerable inputs, string countryHint = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.DetectLanguages"); - scope.Start(); - - try - { - using Request request = CreateDetectLanguageRequest(inputs, countryHint); - Response response = await _pipeline.SendRequestAsync(request, cancellationToken); - - switch (response.Status) - { - case 200: - return await CreateDetectLanguageResponseSimpleAsync(response, cancellationToken).ConfigureAwait(false); - default: - throw await response.CreateRequestFailedExceptionAsync(); - } - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List detectLanguageInputs = ConvertToDetectLanguageInputs(inputs, countryHint); + return await DetectLanguagesAsync(detectLanguageInputs, new TextAnalysisOptions(), cancellationToken).ConfigureAwait(false); } - // Note: for simple case, proposal is to take a list of strings as inputs. - // We should provide an overload that lets you take a list of LanguageInputs, to handling country hint and id, if needed. - // TODO: revisit whether the return type is too complex for a simple overload. Should it be included in a kitchen sink method instead? /// /// /// /// /// /// - public virtual Response> DetectLanguages(IEnumerable inputs, string countryHint = "us", CancellationToken cancellationToken = default) + public virtual Response DetectLanguages(IEnumerable inputs, string countryHint = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.DetectLanguages"); - scope.Start(); - - try - { - using Request request = CreateDetectLanguageRequest(inputs, countryHint); - Response response = _pipeline.SendRequest(request, cancellationToken); - - return response.Status switch - { - // TODO: for this, we'll need to stitch back together the errors, as ids have been stripped. - 200 => CreateDetectLanguageResponseSimple(response), - _ => throw response.CreateRequestFailedException(), - }; - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List detectLanguageInputs = ConvertToDetectLanguageInputs(inputs, countryHint); + return DetectLanguages(detectLanguageInputs, new TextAnalysisOptions(), cancellationToken); } /// @@ -236,7 +196,7 @@ public virtual Response> DetectLanguages(IEnumerab /// /// /// - public virtual async Task>> DetectLanguagesAsync(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual async Task> DetectLanguagesAsync(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -267,7 +227,7 @@ public virtual async Task>> /// /// /// - public virtual Response> DetectLanguages(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual Response DetectLanguages(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -299,7 +259,7 @@ private Request CreateDetectLanguageRequest(IEnumerable inputs, string c ReadOnlyMemory content = TextAnalyticsServiceSerializer.SerializeDetectLanguageInputs(inputs, countryHint); request.Method = RequestMethod.Post; - BuildUriForRoute(LanguagesRoute, request.Uri, new TextAnalyticsRequestOptions()); + BuildUriForRoute(LanguagesRoute, request.Uri, new TextAnalysisOptions()); request.Headers.Add(HttpHeader.Common.JsonContentType); request.Content = RequestContent.Create(content); @@ -309,7 +269,7 @@ private Request CreateDetectLanguageRequest(IEnumerable inputs, string c return request; } - private Request CreateDetectLanguageRequest(IEnumerable inputs, TextAnalyticsRequestOptions options) + private Request CreateDetectLanguageRequest(IEnumerable inputs, TextAnalysisOptions options) { Request request = _pipeline.CreateRequest(); @@ -336,8 +296,10 @@ private Request CreateDetectLanguageRequest(IEnumerable inp /// /// /// - public virtual async Task>> RecognizeEntitiesAsync(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> RecognizeEntitiesAsync(string inputText, string language = default, CancellationToken cancellationToken = default) { + // TODO: set language from options + Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.RecognizeEntities"); @@ -352,13 +314,13 @@ public virtual async Task>> RecognizeEntitiesA switch (response.Status) { case 200: - DocumentResultCollection result = await CreateRecognizeEntitiesResponseAsync(response, cancellationToken).ConfigureAwait(false); - if (result.Errors.Count > 0) + RecognizeEntitiesResultCollection results = await CreateRecognizeEntitiesResponseAsync(response, cancellationToken).ConfigureAwait(false); + if (results[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw await response.CreateRequestFailedExceptionAsync(result.Errors[0].Message).ConfigureAwait(false); + throw await response.CreateRequestFailedExceptionAsync(results[0].ErrorMessage).ConfigureAwait(false); } - return CreateRecognizeEntitiesResponseSimple(response, result[0]); + return Response.FromValue(results[0], response); default: throw await response.CreateRequestFailedExceptionAsync().ConfigureAwait(false); } @@ -376,7 +338,7 @@ public virtual async Task>> RecognizeEntitiesA /// /// /// - public virtual Response> RecognizeEntities(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual Response RecognizeEntities(string inputText, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -392,13 +354,13 @@ public virtual Response> RecognizeEntities(string input switch (response.Status) { case 200: - DocumentResultCollection result = CreateRecognizeEntitiesResponse(response); - if (result.Errors.Count > 0) + RecognizeEntitiesResultCollection results = CreateRecognizeEntitiesResponse(response); + if (results[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw response.CreateRequestFailedException(result.Errors[0].Message); + throw response.CreateRequestFailedException(results[0].ErrorMessage); } - return CreateRecognizeEntitiesResponseSimple(response, result[0]); + return Response.FromValue(results[0], response); default: throw response.CreateRequestFailedException(); } @@ -416,31 +378,11 @@ public virtual Response> RecognizeEntities(string input /// /// /// - public virtual async Task>>> RecognizeEntitiesAsync(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> RecognizeEntitiesAsync(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.RecognizeEntities"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, EntitiesRoute); - Response response = await _pipeline.SendRequestAsync(request, cancellationToken); - - switch (response.Status) - { - case 200: - return await CreateRecognizeEntitiesResponseSimpleAsync(response, cancellationToken).ConfigureAwait(false); - default: - throw await response.CreateRequestFailedExceptionAsync(); - } - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return await RecognizeEntitiesAsync(documentInputs, new TextAnalysisOptions(), cancellationToken).ConfigureAwait(false); } /// @@ -449,30 +391,11 @@ public virtual async Task>>> Recog /// /// /// - public virtual Response>> RecognizeEntities(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual Response RecognizeEntities(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.RecognizeEntities"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, EntitiesRoute); - Response response = _pipeline.SendRequest(request, cancellationToken); - - return response.Status switch - { - // TODO: for this, we'll need to stitch back together the errors, as ids have been stripped. - 200 => CreateRecognizeEntitiesResponseSimple(response), - _ => throw response.CreateRequestFailedException(), - }; - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return RecognizeEntities(documentInputs, new TextAnalysisOptions(), cancellationToken); } /// @@ -481,7 +404,7 @@ public virtual Response>> RecognizeEntities /// /// /// - public virtual async Task>> RecognizeEntitiesAsync(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual async Task> RecognizeEntitiesAsync(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -512,7 +435,7 @@ public virtual async Task>> Recog /// /// /// - public virtual Response> RecognizeEntities(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual Response RecognizeEntities(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -547,7 +470,7 @@ public virtual Response> RecognizeEntities /// /// /// - public virtual async Task> AnalyzeSentimentAsync(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> AnalyzeSentimentAsync(string inputText, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -563,13 +486,13 @@ public virtual async Task> AnalyzeSentimentAsync(string inpu switch (response.Status) { case 200: - SentimentResultCollection results = await CreateAnalyzeSentimentResponseAsync(response, cancellationToken).ConfigureAwait(false); - if (results.Errors.Count > 0) + AnalyzeSentimentResultCollection results = await CreateAnalyzeSentimentResponseAsync(response, cancellationToken).ConfigureAwait(false); + if (results[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw await response.CreateRequestFailedExceptionAsync(results.Errors[0].Message).ConfigureAwait(false); + throw await response.CreateRequestFailedExceptionAsync(results[0].ErrorMessage).ConfigureAwait(false); } - return CreateAnalyzeSentimentResponseSimple(response, (results[0] as SentimentResult).DocumentSentiment); + return Response.FromValue(results[0], response); default: throw await response.CreateRequestFailedExceptionAsync().ConfigureAwait(false); } @@ -587,7 +510,7 @@ public virtual async Task> AnalyzeSentimentAsync(string inpu /// /// /// - public virtual Response AnalyzeSentiment(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual Response AnalyzeSentiment(string inputText, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -603,13 +526,13 @@ public virtual Response AnalyzeSentiment(string inputText, string lan switch (response.Status) { case 200: - SentimentResultCollection results = CreateAnalyzeSentimentResponse(response); - if (results.Errors.Count > 0) + AnalyzeSentimentResultCollection results = CreateAnalyzeSentimentResponse(response); + if (results[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw response.CreateRequestFailedException(results.Errors[0].Message); + throw response.CreateRequestFailedException(results[0].ErrorMessage); } - return CreateAnalyzeSentimentResponseSimple(response, (results[0] as SentimentResult).DocumentSentiment); + return Response.FromValue(results[0], response); default: throw response.CreateRequestFailedException(); } @@ -627,29 +550,11 @@ public virtual Response AnalyzeSentiment(string inputText, string lan /// /// /// - public virtual async Task>> AnalyzeSentimentAsync(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> AnalyzeSentimentAsync(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.AnalyzeSentiment"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, SentimentRoute); - Response response = await _pipeline.SendRequestAsync(request, cancellationToken); - - return response.Status switch - { - 200 => await CreateAnalyzeSentimentResponseSimpleAsync(response, cancellationToken).ConfigureAwait(false), - _ => throw await response.CreateRequestFailedExceptionAsync(), - }; - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return await AnalyzeSentimentAsync(documentInputs, new TextAnalysisOptions(), cancellationToken).ConfigureAwait(false); } /// @@ -658,30 +563,11 @@ public virtual async Task>> AnalyzeSentimentAsyn /// /// /// - public virtual Response> AnalyzeSentiment(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual Response AnalyzeSentiment(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.AnalyzeSentiment"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, SentimentRoute); - Response response = _pipeline.SendRequest(request, cancellationToken); - - return response.Status switch - { - // TODO: for this, we'll need to stitch back together the errors, as ids have been stripped. - 200 => CreateAnalyzeSentimentResponseSimple(response), - _ => throw response.CreateRequestFailedException(), - }; - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return AnalyzeSentiment(documentInputs, new TextAnalysisOptions(), cancellationToken); } /// @@ -690,7 +576,7 @@ public virtual Response> AnalyzeSentiment(IEnumerable /// /// - public virtual async Task> AnalyzeSentimentAsync(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual async Task> AnalyzeSentimentAsync(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -721,7 +607,7 @@ public virtual async Task> AnalyzeSentimentA /// /// /// - public virtual Response AnalyzeSentiment(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual Response AnalyzeSentiment(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -756,7 +642,7 @@ public virtual Response AnalyzeSentiment(IEnumerable< /// /// /// - public virtual async Task>> ExtractKeyPhrasesAsync(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> ExtractKeyPhrasesAsync(string inputText, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -772,13 +658,13 @@ public virtual async Task>> ExtractKeyPhrasesAsync( switch (response.Status) { case 200: - DocumentResultCollection result = await CreateKeyPhraseResponseAsync(response, cancellationToken).ConfigureAwait(false); - if (result.Errors.Count > 0) + ExtractKeyPhrasesResultCollection result = await CreateKeyPhraseResponseAsync(response, cancellationToken).ConfigureAwait(false); + if (result[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw await response.CreateRequestFailedExceptionAsync(result.Errors[0].Message).ConfigureAwait(false); + throw await response.CreateRequestFailedExceptionAsync(result[0].ErrorMessage).ConfigureAwait(false); } - return CreateKeyPhraseResponseSimple(response, result[0]); + return Response.FromValue(result[0], response); default: throw await response.CreateRequestFailedExceptionAsync().ConfigureAwait(false); } @@ -796,7 +682,7 @@ public virtual async Task>> ExtractKeyPhrasesAsync( /// /// /// - public virtual Response> ExtractKeyPhrases(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual Response ExtractKeyPhrases(string inputText, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -812,13 +698,13 @@ public virtual Response> ExtractKeyPhrases(string inputText, switch (response.Status) { case 200: - DocumentResultCollection result = CreateKeyPhraseResponse(response); - if (result.Errors.Count > 0) + ExtractKeyPhrasesResultCollection result = CreateKeyPhraseResponse(response); + if (result[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw response.CreateRequestFailedException(result.Errors[0].Message); + throw response.CreateRequestFailedException(result[0].ErrorMessage); } - return CreateKeyPhraseResponseSimple(response, result[0]); + return Response.FromValue(result[0], response); default: throw response.CreateRequestFailedException(); } @@ -836,31 +722,11 @@ public virtual Response> ExtractKeyPhrases(string inputText, /// /// /// - public virtual async Task>>> ExtractKeyPhrasesAsync(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> ExtractKeyPhrasesAsync(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.ExtractKeyPhrases"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, KeyPhrasesRoute); - Response response = await _pipeline.SendRequestAsync(request, cancellationToken); - - switch (response.Status) - { - case 200: - return await CreateKeyPhraseResponseSimpleAsync(response, cancellationToken).ConfigureAwait(false); - default: - throw await response.CreateRequestFailedExceptionAsync(); - } - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return await ExtractKeyPhrasesAsync(documentInputs, new TextAnalysisOptions(), cancellationToken).ConfigureAwait(false); } /// @@ -869,30 +735,11 @@ public virtual async Task>>> ExtractKey /// /// /// - public virtual Response>> ExtractKeyPhrases(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual Response ExtractKeyPhrases(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.ExtractKeyPhrases"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, KeyPhrasesRoute); - Response response = _pipeline.SendRequest(request, cancellationToken); - - return response.Status switch - { - // TODO: for this, we'll need to stitch back together the errors, as ids have been stripped. - 200 => CreateKeyPhraseResponseSimple(response), - _ => throw response.CreateRequestFailedException(), - }; - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return ExtractKeyPhrases(documentInputs, new TextAnalysisOptions(), cancellationToken); } /// @@ -901,7 +748,7 @@ public virtual Response>> ExtractKeyPhrases(IEnu /// /// /// - public virtual async Task>> ExtractKeyPhrasesAsync(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual async Task> ExtractKeyPhrasesAsync(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -932,7 +779,7 @@ public virtual async Task>> ExtractKey /// /// /// - public virtual Response> ExtractKeyPhrases(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual Response ExtractKeyPhrases(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -967,7 +814,7 @@ public virtual Response> ExtractKeyPhrases(IEnu /// /// /// - public virtual async Task>> RecognizePiiEntitiesAsync(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> RecognizePiiEntitiesAsync(string inputText, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -983,13 +830,13 @@ public virtual async Task>> RecognizePiiEntiti switch (response.Status) { case 200: - DocumentResultCollection result = await CreateRecognizeEntitiesResponseAsync(response, cancellationToken).ConfigureAwait(false); - if (result.Errors.Count > 0) + RecognizeEntitiesResultCollection results = await CreateRecognizeEntitiesResponseAsync(response, cancellationToken).ConfigureAwait(false); + if (results[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw await response.CreateRequestFailedExceptionAsync(result.Errors[0].Message).ConfigureAwait(false); + throw await response.CreateRequestFailedExceptionAsync(results[0].ErrorMessage).ConfigureAwait(false); } - return CreateRecognizeEntitiesResponseSimple(response, result[0]); + return Response.FromValue(results[0], response); default: throw await response.CreateRequestFailedExceptionAsync().ConfigureAwait(false); } @@ -1007,7 +854,7 @@ public virtual async Task>> RecognizePiiEntiti /// /// /// - public virtual Response> RecognizePiiEntities(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual Response RecognizePiiEntities(string inputText, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -1023,13 +870,13 @@ public virtual Response> RecognizePiiEntities(string in switch (response.Status) { case 200: - DocumentResultCollection result = CreateRecognizeEntitiesResponse(response); - if (result.Errors.Count > 0) + RecognizeEntitiesResultCollection results = CreateRecognizeEntitiesResponse(response); + if (results[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw response.CreateRequestFailedException(result.Errors[0].Message); + throw response.CreateRequestFailedException(results[0].ErrorMessage); } - return CreateRecognizeEntitiesResponseSimple(response, result[0]); + return Response.FromValue(results[0], response); default: throw response.CreateRequestFailedException(); } @@ -1047,31 +894,11 @@ public virtual Response> RecognizePiiEntities(string in /// /// /// - public virtual async Task>>> RecognizePiiEntitiesAsync(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> RecognizePiiEntitiesAsync(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.RecognizePiiEntities"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, PiiEntitiesRoute); - Response response = await _pipeline.SendRequestAsync(request, cancellationToken); - - switch (response.Status) - { - case 200: - return await CreateRecognizeEntitiesResponseSimpleAsync(response, cancellationToken).ConfigureAwait(false); - default: - throw await response.CreateRequestFailedExceptionAsync(); - } - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return await RecognizeEntitiesAsync(documentInputs, new TextAnalysisOptions(), cancellationToken).ConfigureAwait(false); } /// @@ -1080,30 +907,11 @@ public virtual async Task>>> Recog /// /// /// - public virtual Response>> RecognizePiiEntities(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual Response RecognizePiiEntities(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.RecognizePiiEntities"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, PiiEntitiesRoute); - Response response = _pipeline.SendRequest(request, cancellationToken); - - return response.Status switch - { - // TODO: for this, we'll need to stitch back together the errors, as ids have been stripped. - 200 => CreateRecognizeEntitiesResponseSimple(response), - _ => throw response.CreateRequestFailedException(), - }; - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return RecognizeEntities(documentInputs, new TextAnalysisOptions(), cancellationToken); } /// @@ -1112,7 +920,7 @@ public virtual Response>> RecognizePiiEntit /// /// /// - public virtual async Task>> RecognizePiiEntitiesAsync(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual async Task> RecognizePiiEntitiesAsync(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -1143,7 +951,7 @@ public virtual async Task>> Recog /// /// /// - public virtual Response> RecognizePiiEntities(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual Response RecognizePiiEntities(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -1178,7 +986,7 @@ public virtual Response> RecognizePiiEntit /// /// /// - public virtual async Task>> ExtractEntityLinkingAsync(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> ExtractEntityLinkingAsync(string inputText, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -1194,13 +1002,13 @@ public virtual async Task>> ExtractEntityLink switch (response.Status) { case 200: - DocumentResultCollection result = await CreateLinkedEntityResponseAsync(response, cancellationToken).ConfigureAwait(false); - if (result.Errors.Count > 0) + ExtractLinkedEntitiesResultCollection result = await CreateLinkedEntityResponseAsync(response, cancellationToken).ConfigureAwait(false); + if (result[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw await response.CreateRequestFailedExceptionAsync(result.Errors[0].Message).ConfigureAwait(false); + throw await response.CreateRequestFailedExceptionAsync(result[0].ErrorMessage).ConfigureAwait(false); } - return CreateLinkedEntityResponseSimple(response, result[0]); + return Response.FromValue(result[0], response); default: throw await response.CreateRequestFailedExceptionAsync().ConfigureAwait(false); } @@ -1218,7 +1026,7 @@ public virtual async Task>> ExtractEntityLink /// /// /// - public virtual Response> ExtractEntityLinking(string inputText, string language = "en", CancellationToken cancellationToken = default) + public virtual Response ExtractEntityLinking(string inputText, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNullOrEmpty(inputText, nameof(inputText)); @@ -1234,13 +1042,13 @@ public virtual Response> ExtractEntityLinking(string i switch (response.Status) { case 200: - DocumentResultCollection result = CreateLinkedEntityResponse(response); - if (result.Errors.Count > 0) + ExtractLinkedEntitiesResultCollection results = CreateLinkedEntityResponse(response); + if (results[0].ErrorMessage != default) { // only one input, so we can ignore the id and grab the first error message. - throw response.CreateRequestFailedException(result.Errors[0].Message); + throw response.CreateRequestFailedException(results[0].ErrorMessage); } - return CreateLinkedEntityResponseSimple(response, result[0]); + return Response.FromValue(results[0], response); default: throw response.CreateRequestFailedException(); } @@ -1258,31 +1066,11 @@ public virtual Response> ExtractEntityLinking(string i /// /// /// - public virtual async Task>>> ExtractEntityLinkingAsync(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual async Task> ExtractEntityLinkingAsync(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.ExtractEntityLinking"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, EntityLinkingRoute); - Response response = await _pipeline.SendRequestAsync(request, cancellationToken); - - switch (response.Status) - { - case 200: - return await CreateLinkedEntityResponseSimpleAsync(response, cancellationToken).ConfigureAwait(false); - default: - throw await response.CreateRequestFailedExceptionAsync(); - } - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return await ExtractEntityLinkingAsync(documentInputs, new TextAnalysisOptions(), cancellationToken).ConfigureAwait(false); } /// @@ -1291,30 +1079,11 @@ public virtual async Task>>> Extr /// /// /// - public virtual Response>> ExtractEntityLinking(IEnumerable inputs, string language = "en", CancellationToken cancellationToken = default) + public virtual Response ExtractEntityLinking(IEnumerable inputs, string language = default, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); - - using DiagnosticScope scope = _clientDiagnostics.CreateScope("Azure.AI.TextAnalytics.TextAnalyticsClient.ExtractEntityLinking"); - scope.Start(); - - try - { - using Request request = CreateStringCollectionRequest(inputs, language, EntityLinkingRoute); - Response response = _pipeline.SendRequest(request, cancellationToken); - - return response.Status switch - { - // TODO: for this, we'll need to stitch back together the errors, as ids have been stripped. - 200 => CreateLinkedEntityResponseSimple(response), - _ => throw response.CreateRequestFailedException(), - }; - } - catch (Exception e) - { - scope.Failed(e); - throw; - } + List documentInputs = ConvertToDocumentInputs(inputs, language); + return ExtractEntityLinking(documentInputs, new TextAnalysisOptions(), cancellationToken); } /// @@ -1323,7 +1092,7 @@ public virtual Response>> ExtractEntityLin /// /// /// - public virtual async Task>> ExtractEntityLinkingAsync(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual async Task> ExtractEntityLinkingAsync(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -1354,7 +1123,7 @@ public virtual async Task>> Extr /// /// /// - public virtual Response> ExtractEntityLinking(IEnumerable inputs, TextAnalyticsRequestOptions options, CancellationToken cancellationToken = default) + public virtual Response ExtractEntityLinking(IEnumerable inputs, TextAnalysisOptions options, CancellationToken cancellationToken = default) { Argument.AssertNotNull(inputs, nameof(inputs)); @@ -1381,6 +1150,42 @@ public virtual Response> ExtractEntityLin #endregion + #region Common + private List ConvertToDocumentInputs(IEnumerable inputs, string language) + { + language ??= _options.DefaultLanguage; + + int id = 0; + List documentInputs = new List(); + foreach (string input in inputs) + { + documentInputs.Add(new TextDocumentInput($"{id++}", input) + { + Language = language, + }); + } + + return documentInputs; + } + + private List ConvertToDetectLanguageInputs(IEnumerable inputs, string countryHint) + { + countryHint ??= _options.DefaultCountryHint; + + int id = 0; + List detectLanguageInputs = new List(); + foreach (string input in inputs) + { + detectLanguageInputs.Add(new DetectLanguageInput($"{id++}") + { + Text = input, + CountryHint = countryHint, + }); + } + + return detectLanguageInputs; + } + private Request CreateStringCollectionRequest(IEnumerable inputs, string language, string route) { Request request = _pipeline.CreateRequest(); @@ -1388,7 +1193,7 @@ private Request CreateStringCollectionRequest(IEnumerable inputs, string ReadOnlyMemory content = TextAnalyticsServiceSerializer.SerializeDocumentInputs(inputs, language); request.Method = RequestMethod.Post; - BuildUriForRoute(route, request.Uri, new TextAnalyticsRequestOptions()); + BuildUriForRoute(route, request.Uri, new TextAnalysisOptions()); request.Headers.Add(HttpHeader.Common.JsonContentType); request.Content = RequestContent.Create(content); @@ -1398,7 +1203,7 @@ private Request CreateStringCollectionRequest(IEnumerable inputs, string return request; } - private Request CreateDocumentInputRequest(IEnumerable inputs, TextAnalyticsRequestOptions options, string route) + private Request CreateDocumentInputRequest(IEnumerable inputs, TextAnalysisOptions options, string route) { Request request = _pipeline.CreateRequest(); @@ -1414,5 +1219,6 @@ private Request CreateDocumentInputRequest(IEnumerable inputs, Te return request; } + #endregion } } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClientOptions.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClientOptions.cs index e7a6e8956bcc..a6fc0bd30741 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClientOptions.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClientOptions.cs @@ -35,6 +35,14 @@ public enum ServiceVersion /// internal ServiceVersion Version { get; } + /// + /// + public string DefaultCountryHint { get; set; } = "us"; + + /// + /// + public string DefaultLanguage { get; set; } = "en"; + /// /// Initializes a new instance of the /// class. diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient_private.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient_private.cs index 1217401fb6b1..cc9864711713 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient_private.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsClient_private.cs @@ -24,133 +24,73 @@ public partial class TextAnalyticsClient private const string ModelVersion = "model-version"; #region Detect Language - private static async Task>> CreateDetectLanguageResponseAsync(Response response, CancellationToken cancellation) + private static async Task> CreateDetectLanguageResponseAsync(Response response, CancellationToken cancellation) { - DocumentResultCollection result = await TextAnalyticsServiceSerializer.DeserializeDetectLanguageResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); + DetectLanguageResultCollection result = await TextAnalyticsServiceSerializer.DeserializeDetectLanguageResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); return Response.FromValue(result, response); } - private static Response> CreateDetectLanguageResponse(Response response) => + private static Response CreateDetectLanguageResponse(Response response) => Response.FromValue(TextAnalyticsServiceSerializer.DeserializeDetectLanguageResponse(response.ContentStream), response); - private static async Task>> CreateDetectLanguageResponseSimpleAsync(Response response, CancellationToken cancellation) - { - IEnumerable result = await TextAnalyticsServiceSerializer.DeserializeDetectedLanguageCollectionAsync(response.ContentStream, cancellation).ConfigureAwait(false); - return Response.FromValue(result, response); - } - - private static Response> CreateDetectLanguageResponseSimple(Response response) => - Response.FromValue(TextAnalyticsServiceSerializer.DeserializeDetectedLanguageCollection(response.ContentStream), response); - - private static Response CreateDetectedLanguageResponseSimple(Response response, DetectedLanguage detectedLanguage) => - Response.FromValue(detectedLanguage, response); - #endregion #region Recognize Entities - private static async Task>> CreateRecognizeEntitiesResponseAsync(Response response, CancellationToken cancellation) + private static async Task> CreateRecognizeEntitiesResponseAsync(Response response, CancellationToken cancellation) { - DocumentResultCollection result = await TextAnalyticsServiceSerializer.DeserializeRecognizeEntitiesResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); + RecognizeEntitiesResultCollection result = await TextAnalyticsServiceSerializer.DeserializeRecognizeEntitiesResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); return Response.FromValue(result, response); } - private static Response> CreateRecognizeEntitiesResponse(Response response) => + private static Response CreateRecognizeEntitiesResponse(Response response) => Response.FromValue(TextAnalyticsServiceSerializer.DeserializeRecognizeEntitiesResponse(response.ContentStream), response); - private static async Task>>> CreateRecognizeEntitiesResponseSimpleAsync(Response response, CancellationToken cancellation) - { - var result = await TextAnalyticsServiceSerializer.DeserializeEntityCollectionAsync(response.ContentStream, cancellation).ConfigureAwait(false); - return Response.FromValue(result, response); - } - - private static Response>> CreateRecognizeEntitiesResponseSimple(Response response) => - Response.FromValue(TextAnalyticsServiceSerializer.DeserializeEntityCollection(response.ContentStream), response); - - private static Response> CreateRecognizeEntitiesResponseSimple(Response response, IEnumerable entities) => - Response.FromValue(entities, response); - #endregion #region Analyze Sentiment - private static async Task> CreateAnalyzeSentimentResponseAsync(Response response, CancellationToken cancellation) + private static async Task> CreateAnalyzeSentimentResponseAsync(Response response, CancellationToken cancellation) { - SentimentResultCollection result = await TextAnalyticsServiceSerializer.DeserializeAnalyzeSentimentResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); + AnalyzeSentimentResultCollection result = await TextAnalyticsServiceSerializer.DeserializeAnalyzeSentimentResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); return Response.FromValue(result, response); } - private static Response CreateAnalyzeSentimentResponse(Response response) => + private static Response CreateAnalyzeSentimentResponse(Response response) => Response.FromValue(TextAnalyticsServiceSerializer.DeserializeAnalyzeSentimentResponse(response.ContentStream), response); - private static async Task>> CreateAnalyzeSentimentResponseSimpleAsync(Response response, CancellationToken cancellation) - { - var result = await TextAnalyticsServiceSerializer.DeserializeSentimentCollectionAsync(response.ContentStream, cancellation).ConfigureAwait(false); - return Response.FromValue(result, response); - } - - private static Response> CreateAnalyzeSentimentResponseSimple(Response response) => - Response.FromValue(TextAnalyticsServiceSerializer.DeserializeSentimentCollection(response.ContentStream), response); - - private static Response CreateAnalyzeSentimentResponseSimple(Response response, Sentiment sentiment) => - Response.FromValue(sentiment, response); - #endregion Analyze Sentiment #region Extract KeyPhrases - private static async Task>> CreateKeyPhraseResponseAsync(Response response, CancellationToken cancellation) + private static async Task> CreateKeyPhraseResponseAsync(Response response, CancellationToken cancellation) { - DocumentResultCollection result = await TextAnalyticsServiceSerializer.DeserializeKeyPhraseResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); + ExtractKeyPhrasesResultCollection result = await TextAnalyticsServiceSerializer.DeserializeKeyPhraseResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); return Response.FromValue(result, response); } - private static Response> CreateKeyPhraseResponse(Response response) => + private static Response CreateKeyPhraseResponse(Response response) => Response.FromValue(TextAnalyticsServiceSerializer.DeserializeKeyPhraseResponse(response.ContentStream), response); - private static async Task>>> CreateKeyPhraseResponseSimpleAsync(Response response, CancellationToken cancellation) - { - var result = await TextAnalyticsServiceSerializer.DeserializeKeyPhraseCollectionAsync(response.ContentStream, cancellation).ConfigureAwait(false); - return Response.FromValue(result, response); - } - - private static Response>> CreateKeyPhraseResponseSimple(Response response) => - Response.FromValue(TextAnalyticsServiceSerializer.DeserializeKeyPhraseCollection(response.ContentStream), response); - - private static Response> CreateKeyPhraseResponseSimple(Response response, IEnumerable keyPhrases) => - Response.FromValue(keyPhrases, response); - #endregion Extract KeyPhrases #region Entity Linking - private static async Task>> CreateLinkedEntityResponseAsync(Response response, CancellationToken cancellation) + private static async Task> CreateLinkedEntityResponseAsync(Response response, CancellationToken cancellation) { - DocumentResultCollection result = await TextAnalyticsServiceSerializer.DeserializeLinkedEntityResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); + ExtractLinkedEntitiesResultCollection result = await TextAnalyticsServiceSerializer.DeserializeLinkedEntityResponseAsync(response.ContentStream, cancellation).ConfigureAwait(false); return Response.FromValue(result, response); } - private static Response> CreateLinkedEntityResponse(Response response) => + private static Response CreateLinkedEntityResponse(Response response) => Response.FromValue(TextAnalyticsServiceSerializer.DeserializeLinkedEntityResponse(response.ContentStream), response); - private static async Task>>> CreateLinkedEntityResponseSimpleAsync(Response response, CancellationToken cancellation) - { - var result = await TextAnalyticsServiceSerializer.DeserializeLinkedEntityCollectionAsync(response.ContentStream, cancellation).ConfigureAwait(false); - return Response.FromValue(result, response); - } - - private static Response>> CreateLinkedEntityResponseSimple(Response response) => - Response.FromValue(TextAnalyticsServiceSerializer.DeserializeLinkedEntityCollection(response.ContentStream), response); - - private static Response> CreateLinkedEntityResponseSimple(Response response, IEnumerable entities) => - Response.FromValue(entities, response); - #endregion - private void BuildUriForRoute(string route, RequestUriBuilder builder, TextAnalyticsRequestOptions options) + private void BuildUriForRoute(string route, RequestUriBuilder builder, TextAnalysisOptions options) { builder.Reset(_baseUri); builder.AppendPath(TextAnalyticsRoute, escape: false); builder.AppendPath(_apiVersion, escape: false); builder.AppendPath(route, escape: false); - if (options.ShowStatistics) + if (options.IncludeStatistics) { builder.AppendQuery(ShowStatistics, "true"); } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsRequestOptions.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsRequestOptions.cs deleted file mode 100644 index 360ae284b8ba..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsRequestOptions.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -namespace Azure.AI.TextAnalytics -{ - /// - /// - public class TextAnalyticsRequestOptions - { - /// - /// - /// - /// - public TextAnalyticsRequestOptions(bool showStatistics = false, string modelVersion = default) - { - ShowStatistics = showStatistics; - ModelVersion = modelVersion; - } - - /// - /// - public bool ShowStatistics { get; } - - /// - /// - public string ModelVersion { get; } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsServiceSerializer.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsServiceSerializer.cs index 31df7e435b97..3f1f03f890c8 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsServiceSerializer.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextAnalyticsServiceSerializer.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text.Json; using System.Threading; using System.Threading.Tasks; @@ -80,7 +79,7 @@ public static ReadOnlyMemory SerializeDocumentInputs(IEnumerable i return writer.WrittenMemory; } - public static ReadOnlyMemory SerializeDocumentInputs(IEnumerable inputs) + public static ReadOnlyMemory SerializeDocumentInputs(IEnumerable inputs) { var writer = new ArrayBufferWriter(); var json = new Utf8JsonWriter(writer); @@ -112,7 +111,7 @@ private static string ReadDocumentId(JsonElement documentElement) return default; } - private static DocumentStatistics ReadDocumentStatistics(JsonElement documentElement) + private static TextDocumentStatistics ReadDocumentStatistics(JsonElement documentElement) { if (documentElement.TryGetProperty("statistics", out JsonElement statisticsValue)) { @@ -124,14 +123,16 @@ private static DocumentStatistics ReadDocumentStatistics(JsonElement documentEle if (statisticsValue.TryGetProperty("transactionsCount", out JsonElement transactionCountValue)) transactionCount = transactionCountValue.GetInt32(); - return new DocumentStatistics(characterCount, transactionCount); + return new TextDocumentStatistics(characterCount, transactionCount); } return default; } - private static void ReadDocumentErrors(JsonElement documentElement, List errors) + private static IEnumerable ReadDocumentErrors(JsonElement documentElement) { + List errors = new List(); + if (documentElement.TryGetProperty("errors", out JsonElement errorsValue)) { foreach (JsonElement errorElement in errorsValue.EnumerateArray()) @@ -143,15 +144,17 @@ private static void ReadDocumentErrors(JsonElement documentElement, List> DeserializeDetectLanguageResponseAsync(Stream content, CancellationToken cancellation) + public static async Task DeserializeDetectLanguageResponseAsync(Stream content, CancellationToken cancellation) { using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); JsonElement root = json.RootElement; return ReadDetectLanguageResultCollection(root); } - public static DocumentResultCollection DeserializeDetectLanguageResponse(Stream content) + public static DetectLanguageResultCollection DeserializeDetectLanguageResponse(Stream content) { using JsonDocument json = JsonDocument.Parse(content, default); JsonElement root = json.RootElement; return ReadDetectLanguageResultCollection(root); } - public static async Task> DeserializeDetectedLanguageCollectionAsync(Stream content, CancellationToken cancellation) - { - using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); - JsonElement root = json.RootElement; - return ReadDetectedLanguageCollection(root); - } - - public static IEnumerable DeserializeDetectedLanguageCollection(Stream content) + private static DetectLanguageResultCollection ReadDetectLanguageResultCollection(JsonElement root) { - using JsonDocument json = JsonDocument.Parse(content); - JsonElement root = json.RootElement; - return ReadDetectedLanguageCollection(root); - } - - private static DocumentResultCollection ReadDetectLanguageResultCollection(JsonElement root) - { - var result = new DocumentResultCollection(); + var collection = new List(); if (root.TryGetProperty("documents", out JsonElement documentsValue)) { foreach (JsonElement documentElement in documentsValue.EnumerateArray()) { - result.Add(ReadDetectedLanguageResult(documentElement)); + collection.Add(ReadDetectedLanguageResult(documentElement)); } } - ReadDocumentErrors(root, result.Errors); - result.ModelVersion = ReadModelVersion(root); - result.Statistics = ReadDocumentBatchStatistics(root); + TextBatchStatistics statistics = ReadDocumentBatchStatistics(root); + string modelVersion = ReadModelVersion(root); - return result; + return new DetectLanguageResultCollection(collection, statistics, modelVersion); } - private static IEnumerable ReadDetectedLanguageCollection(JsonElement root) + private static DetectLanguageResult ReadDetectedLanguageResult(JsonElement documentElement) { - var result = new List(); - if (root.TryGetProperty("documents", out JsonElement documentsValue)) - { - foreach (JsonElement documentElement in documentsValue.EnumerateArray()) - { - DocumentResult results = ReadDetectedLanguageResult(documentElement); - - // TODO: If needed, sort by score to get the value with the highest confidence. - DetectedLanguage language = results.FirstOrDefault(); - result.Add(language); - } - } - - return result; - } - - private static DocumentResult ReadDetectedLanguageResult(JsonElement documentElement) - { - var documentResult = new DocumentResult( - ReadDocumentId(documentElement), - ReadDocumentStatistics(documentElement)); - + List languages = new List(); if (documentElement.TryGetProperty("detectedLanguages", out JsonElement detectedLanguagesValue)) { foreach (JsonElement languageElement in detectedLanguagesValue.EnumerateArray()) { - documentResult.Add(ReadDetectedLanguage(languageElement)); + languages.Add(ReadDetectedLanguage(languageElement)); } } - - return documentResult; + return new DetectLanguageResult( + ReadDocumentId(documentElement), + ReadDocumentStatistics(documentElement), + languages); } private static DetectedLanguage ReadDetectedLanguage(JsonElement languageElement) @@ -294,85 +263,60 @@ private static DetectedLanguage ReadDetectedLanguage(JsonElement languageElement #region Recognize Entities - public static async Task> DeserializeRecognizeEntitiesResponseAsync(Stream content, CancellationToken cancellation) + public static async Task DeserializeRecognizeEntitiesResponseAsync(Stream content, CancellationToken cancellation) { using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); JsonElement root = json.RootElement; - return ReadEntityResultCollection(root); + return ReadRecognizeEntitiesResultCollection(root); } - public static DocumentResultCollection DeserializeRecognizeEntitiesResponse(Stream content) + public static RecognizeEntitiesResultCollection DeserializeRecognizeEntitiesResponse(Stream content) { using JsonDocument json = JsonDocument.Parse(content, default); JsonElement root = json.RootElement; - return ReadEntityResultCollection(root); + return ReadRecognizeEntitiesResultCollection(root); } - public static async Task>> DeserializeEntityCollectionAsync(Stream content, CancellationToken cancellation) + private static RecognizeEntitiesResultCollection ReadRecognizeEntitiesResultCollection(JsonElement root) { - using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); - JsonElement root = json.RootElement; - return ReadEntityCollection(root); - } - - public static IEnumerable> DeserializeEntityCollection(Stream content) - { - using JsonDocument json = JsonDocument.Parse(content); - JsonElement root = json.RootElement; - return ReadEntityCollection(root); - } - - private static DocumentResultCollection ReadEntityResultCollection(JsonElement root) - { - var result = new DocumentResultCollection(); + var collection = new List(); if (root.TryGetProperty("documents", out JsonElement documentsValue)) { foreach (JsonElement documentElement in documentsValue.EnumerateArray()) { - result.Add(ReadEntityResult(documentElement)); + collection.Add(ReadRecognizeEntityResult(documentElement)); } } - ReadDocumentErrors(root, result.Errors); - result.ModelVersion = ReadModelVersion(root); - result.Statistics = ReadDocumentBatchStatistics(root); - - return result; - } - - private static IEnumerable> ReadEntityCollection(JsonElement root) - { - var result = new List>(); - if (root.TryGetProperty("documents", out JsonElement documentsValue)) + foreach (var error in ReadDocumentErrors(root)) { - foreach (JsonElement documentElement in documentsValue.EnumerateArray()) - { - result.Add(ReadEntityResult(documentElement).ToList()); - } + collection.Add(new RecognizeEntitiesResult(error.Id, error.ErrorMessage)); } - return result; + TextBatchStatistics statistics = ReadDocumentBatchStatistics(root); + string modelVersion = ReadModelVersion(root); + + return new RecognizeEntitiesResultCollection(collection, statistics, modelVersion); } - private static DocumentResult ReadEntityResult(JsonElement documentElement) + private static RecognizeEntitiesResult ReadRecognizeEntityResult(JsonElement documentElement) { - var documentResult = new DocumentResult( - ReadDocumentId(documentElement), - ReadDocumentStatistics(documentElement) - ); - + List entities = new List(); if (documentElement.TryGetProperty("entities", out JsonElement entitiesValue)) { foreach (JsonElement entityElement in entitiesValue.EnumerateArray()) { - documentResult.Add(ReadEntity(entityElement)); + entities.Add(ReadNamedEntity(entityElement)); } } - return documentResult; + return new RecognizeEntitiesResult( + ReadDocumentId(documentElement), + ReadDocumentStatistics(documentElement), + entities); } - private static NamedEntity ReadEntity(JsonElement entityElement) + private static NamedEntity ReadNamedEntity(JsonElement entityElement) { string text = default; string type = default; @@ -401,89 +345,59 @@ private static NamedEntity ReadEntity(JsonElement entityElement) #region Analyze Sentiment - public static async Task DeserializeAnalyzeSentimentResponseAsync(Stream content, CancellationToken cancellation) + public static async Task DeserializeAnalyzeSentimentResponseAsync(Stream content, CancellationToken cancellation) { using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); JsonElement root = json.RootElement; return ReadSentimentResult(root); } - public static SentimentResultCollection DeserializeAnalyzeSentimentResponse(Stream content) + public static AnalyzeSentimentResultCollection DeserializeAnalyzeSentimentResponse(Stream content) { using JsonDocument json = JsonDocument.Parse(content, default); JsonElement root = json.RootElement; return ReadSentimentResult(root); } - public static async Task> DeserializeSentimentCollectionAsync(Stream content, CancellationToken cancellation) - { - using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); - JsonElement root = json.RootElement; - return ReadSentimentCollection(root); - } - - public static IEnumerable DeserializeSentimentCollection(Stream content) + private static AnalyzeSentimentResultCollection ReadSentimentResult(JsonElement root) { - using JsonDocument json = JsonDocument.Parse(content); - JsonElement root = json.RootElement; - return ReadSentimentCollection(root); - } - - private static SentimentResultCollection ReadSentimentResult(JsonElement root) - { - var result = new SentimentResultCollection(); + var collection = new List(); if (root.TryGetProperty("documents", out JsonElement documentsValue)) { foreach (JsonElement documentElement in documentsValue.EnumerateArray()) { - result.Add(ReadDocumentSentimentResult(documentElement)); + collection.Add(ReadDocumentSentimentResult(documentElement)); } } - ReadDocumentErrors(root, result.Errors); - result.ModelVersion = ReadModelVersion(root); - result.Statistics = ReadDocumentBatchStatistics(root); - - return result; - } + TextBatchStatistics statistics = ReadDocumentBatchStatistics(root); + string modelVersion = ReadModelVersion(root); - private static IEnumerable ReadSentimentCollection(JsonElement root) - { - var result = new List(); - if (root.TryGetProperty("documents", out JsonElement documentsValue)) - { - foreach (JsonElement documentElement in documentsValue.EnumerateArray()) - { - result.Add(ReadDocumentSentimentResult(documentElement).DocumentSentiment); - } - } - - return result; + return new AnalyzeSentimentResultCollection(collection, statistics, modelVersion); } - private static SentimentResult ReadDocumentSentimentResult(JsonElement documentElement) + private static AnalyzeSentimentResult ReadDocumentSentimentResult(JsonElement documentElement) { - var documentResult = new SentimentResult( - ReadDocumentId(documentElement), - ReadDocumentStatistics(documentElement)) - { - DocumentSentiment = ReadSentiment(documentElement, "documentScores") - }; - + var documentSentiment = ReadSentiment(documentElement, "documentScores"); + var sentenceSentiments = new List(); if (documentElement.TryGetProperty("sentences", out JsonElement sentencesElement)) { foreach (JsonElement sentenceElement in sentencesElement.EnumerateArray()) { - documentResult.Add(ReadSentiment(sentenceElement, "sentenceScores")); + sentenceSentiments.Add(ReadSentiment(sentenceElement, "sentenceScores")); } } - return documentResult; + return new AnalyzeSentimentResult( + ReadDocumentId(documentElement), + ReadDocumentStatistics(documentElement), + documentSentiment, + sentenceSentiments); } - private static Sentiment ReadSentiment(JsonElement documentElement, string scoresElementName) + private static TextSentiment ReadSentiment(JsonElement documentElement, string scoresElementName) { - SentimentClass sentimentClass = default; + TextSentimentClass sentimentClass = default; double positiveScore = default; double neutralScore = default; double negativeScore = default; @@ -492,7 +406,7 @@ private static Sentiment ReadSentiment(JsonElement documentElement, string score if (documentElement.TryGetProperty("sentiment", out JsonElement sentimentValue)) { - sentimentClass = (SentimentClass)Enum.Parse(typeof(SentimentClass), sentimentValue.ToString(), ignoreCase: true); + sentimentClass = (TextSentimentClass)Enum.Parse(typeof(TextSentimentClass), sentimentValue.ToString(), ignoreCase: true); } if (documentElement.TryGetProperty(scoresElementName, out JsonElement scoreValues)) @@ -513,168 +427,116 @@ private static Sentiment ReadSentiment(JsonElement documentElement, string score if (documentElement.TryGetProperty("length", out JsonElement lengthValue)) lengthValue.TryGetInt32(out length); - return new Sentiment(sentimentClass, positiveScore, neutralScore, negativeScore, offset, length); + return new TextSentiment(sentimentClass, positiveScore, neutralScore, negativeScore, offset, length); } + #endregion #region Extract Key Phrases - public static async Task> DeserializeKeyPhraseResponseAsync(Stream content, CancellationToken cancellation) + public static async Task DeserializeKeyPhraseResponseAsync(Stream content, CancellationToken cancellation) { using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); JsonElement root = json.RootElement; return ReadKeyPhraseResultCollection(root); } - public static DocumentResultCollection DeserializeKeyPhraseResponse(Stream content) + public static ExtractKeyPhrasesResultCollection DeserializeKeyPhraseResponse(Stream content) { using JsonDocument json = JsonDocument.Parse(content, default); JsonElement root = json.RootElement; return ReadKeyPhraseResultCollection(root); } - public static async Task>> DeserializeKeyPhraseCollectionAsync(Stream content, CancellationToken cancellation) + private static ExtractKeyPhrasesResultCollection ReadKeyPhraseResultCollection(JsonElement root) { - using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); - JsonElement root = json.RootElement; - return ReadKeyPhraseCollection(root); - } - - public static IEnumerable> DeserializeKeyPhraseCollection(Stream content) - { - using JsonDocument json = JsonDocument.Parse(content); - JsonElement root = json.RootElement; - return ReadKeyPhraseCollection(root); - } - - private static DocumentResultCollection ReadKeyPhraseResultCollection(JsonElement root) - { - var result = new DocumentResultCollection(); + var collection = new List(); if (root.TryGetProperty("documents", out JsonElement documentsValue)) { foreach (JsonElement documentElement in documentsValue.EnumerateArray()) { - result.Add(ReadKeyPhraseResult(documentElement)); + collection.Add(ReadKeyPhraseResult(documentElement)); } } - ReadDocumentErrors(root, result.Errors); - result.ModelVersion = ReadModelVersion(root); - result.Statistics = ReadDocumentBatchStatistics(root); - - return result; - } - - private static IEnumerable> ReadKeyPhraseCollection(JsonElement root) - { - var result = new List>(); - if (root.TryGetProperty("documents", out JsonElement documentsValue)) + foreach (var error in ReadDocumentErrors(root)) { - foreach (JsonElement documentElement in documentsValue.EnumerateArray()) - { - result.Add(ReadKeyPhraseResult(documentElement).ToList()); - } + collection.Add(new ExtractKeyPhrasesResult(error.Id, error.ErrorMessage)); } - return result; + TextBatchStatistics statistics = ReadDocumentBatchStatistics(root); + string modelVersion = ReadModelVersion(root); + + return new ExtractKeyPhrasesResultCollection(collection, statistics, modelVersion); } - private static DocumentResult ReadKeyPhraseResult(JsonElement documentElement) + private static ExtractKeyPhrasesResult ReadKeyPhraseResult(JsonElement documentElement) { - var documentResult = new DocumentResult( - ReadDocumentId(documentElement), - ReadDocumentStatistics(documentElement)); - + List keyPhrases = new List(); if (documentElement.TryGetProperty("keyPhrases", out JsonElement keyPhrasesValue)) { foreach (JsonElement keyPhraseElement in keyPhrasesValue.EnumerateArray()) { - documentResult.Add(keyPhraseElement.ToString()); + keyPhrases.Add(keyPhraseElement.ToString()); } } - return documentResult; + return new ExtractKeyPhrasesResult( + ReadDocumentId(documentElement), + ReadDocumentStatistics(documentElement), + keyPhrases); } #endregion Extract Key Phrases #region Entity Linking - public static async Task> DeserializeLinkedEntityResponseAsync(Stream content, CancellationToken cancellation) + public static async Task DeserializeLinkedEntityResponseAsync(Stream content, CancellationToken cancellation) { using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); JsonElement root = json.RootElement; return ReadLinkedEntityResultCollection(root); } - public static DocumentResultCollection DeserializeLinkedEntityResponse(Stream content) + public static ExtractLinkedEntitiesResultCollection DeserializeLinkedEntityResponse(Stream content) { using JsonDocument json = JsonDocument.Parse(content, default); JsonElement root = json.RootElement; return ReadLinkedEntityResultCollection(root); } - public static async Task>> DeserializeLinkedEntityCollectionAsync(Stream content, CancellationToken cancellation) - { - using JsonDocument json = await JsonDocument.ParseAsync(content, cancellationToken: cancellation).ConfigureAwait(false); - JsonElement root = json.RootElement; - return ReadLinkedEntityCollection(root); - } - - public static IEnumerable> DeserializeLinkedEntityCollection(Stream content) - { - using JsonDocument json = JsonDocument.Parse(content); - JsonElement root = json.RootElement; - return ReadLinkedEntityCollection(root); - } - - private static DocumentResultCollection ReadLinkedEntityResultCollection(JsonElement root) + private static ExtractLinkedEntitiesResultCollection ReadLinkedEntityResultCollection(JsonElement root) { - var result = new DocumentResultCollection(); + var collection = new List(); if (root.TryGetProperty("documents", out JsonElement documentsValue)) { foreach (JsonElement documentElement in documentsValue.EnumerateArray()) { - result.Add(ReadLinkedEntityResult(documentElement)); + collection.Add(ReadLinkedEntityResult(documentElement)); } } - ReadDocumentErrors(root, result.Errors); - result.ModelVersion = ReadModelVersion(root); - result.Statistics = ReadDocumentBatchStatistics(root); - - return result; - } - - private static IEnumerable> ReadLinkedEntityCollection(JsonElement root) - { - var result = new List>(); - if (root.TryGetProperty("documents", out JsonElement documentsValue)) - { - foreach (JsonElement documentElement in documentsValue.EnumerateArray()) - { - result.Add(ReadLinkedEntityResult(documentElement).ToList()); - } - } + TextBatchStatistics statistics = ReadDocumentBatchStatistics(root); + string modelVersion = ReadModelVersion(root); - return result; + return new ExtractLinkedEntitiesResultCollection(collection, statistics, modelVersion); } - private static DocumentResult ReadLinkedEntityResult(JsonElement documentElement) + private static ExtractLinkedEntitiesResult ReadLinkedEntityResult(JsonElement documentElement) { - var documentResult = new DocumentResult( - ReadDocumentId(documentElement), - ReadDocumentStatistics(documentElement)); - + List entities = new List(); if (documentElement.TryGetProperty("entities", out JsonElement entitiesValue)) { foreach (JsonElement entityElement in entitiesValue.EnumerateArray()) { - documentResult.Add(ReadLinkedEntity(entityElement)); + entities.Add(ReadLinkedEntity(entityElement)); } } - return documentResult; + return new ExtractLinkedEntitiesResult( + ReadDocumentId(documentElement), + ReadDocumentStatistics(documentElement), + entities); } private static LinkedEntity ReadLinkedEntity(JsonElement entityElement) diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentBatchStatistics.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextBatchStatistics.cs similarity index 86% rename from sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentBatchStatistics.cs rename to sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextBatchStatistics.cs index aebdb559f948..968d78e6e103 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentBatchStatistics.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextBatchStatistics.cs @@ -5,9 +5,9 @@ namespace Azure.AI.TextAnalytics { /// /// - public readonly struct DocumentBatchStatistics + public class TextBatchStatistics { - internal DocumentBatchStatistics(int documentCount, int validDocumentCount, int invalidDocumentCount, long transactionCount) + internal TextBatchStatistics(int documentCount, int validDocumentCount, int invalidDocumentCount, long transactionCount) { DocumentCount = documentCount; ValidDocumentCount = validDocumentCount; diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentInput.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextDocumentInput.cs similarity index 80% rename from sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentInput.cs rename to sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextDocumentInput.cs index b637960326c2..cee84eec4cf6 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentInput.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextDocumentInput.cs @@ -5,14 +5,16 @@ namespace Azure.AI.TextAnalytics { /// /// - public class DocumentInput + public class TextDocumentInput { /// /// /// - public DocumentInput(string id) + /// + public TextDocumentInput(string id, string text) { Id = id; + Text = text; } /// @@ -29,6 +31,6 @@ public DocumentInput(string id) /// /// - public string Text { get; set; } + public string Text { get; } } } \ No newline at end of file diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentStatistics.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextDocumentStatistics.cs similarity index 82% rename from sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentStatistics.cs rename to sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextDocumentStatistics.cs index 277795f470c4..335dd9e59848 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/DocumentStatistics.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextDocumentStatistics.cs @@ -5,9 +5,9 @@ namespace Azure.AI.TextAnalytics { /// /// - public readonly struct DocumentStatistics + public readonly struct TextDocumentStatistics { - internal DocumentStatistics(int characterCount, int transactionCount) + internal TextDocumentStatistics(int characterCount, int transactionCount) { CharacterCount = characterCount; TransactionCount = transactionCount; diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/Sentiment.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextSentiment.cs similarity index 83% rename from sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/Sentiment.cs rename to sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextSentiment.cs index 9fd349e0ee44..99c2880d1631 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/Sentiment.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextSentiment.cs @@ -5,9 +5,9 @@ namespace Azure.AI.TextAnalytics { /// /// - public readonly struct Sentiment + public readonly struct TextSentiment { - internal Sentiment(SentimentClass sentimentClass, double positiveScore, double neutralScore, double negativeScore, int offset, int length) + internal TextSentiment(TextSentimentClass sentimentClass, double positiveScore, double neutralScore, double negativeScore, int offset, int length) { SentimentClass = sentimentClass; PositiveScore = positiveScore; @@ -20,7 +20,7 @@ internal Sentiment(SentimentClass sentimentClass, double positiveScore, double n /// /// Gets redicted sentiment for document. /// - public SentimentClass SentimentClass { get; } + public TextSentimentClass SentimentClass { get; } /// /// diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentClass.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextSentimentClass.cs similarity index 94% rename from sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentClass.cs rename to sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextSentimentClass.cs index c824737414a9..e63e97c0c791 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/SentimentClass.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/src/TextSentimentClass.cs @@ -6,7 +6,7 @@ namespace Azure.AI.TextAnalytics /// /// #pragma warning disable CA1717 // Only FlagsAttribute enums should have plural names - public enum SentimentClass + public enum TextSentimentClass #pragma warning restore { /// diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguage.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguage.cs index 453676a183a5..58f85f671305 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguage.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguage.cs @@ -24,7 +24,8 @@ public void DetectLanguage() Debug.WriteLine($"Detecting language for input: \"{input}\""); - DetectedLanguage language = client.DetectLanguage(input); + DetectLanguageResult result = client.DetectLanguage(input).Value; + DetectedLanguage language = result.PrimaryLanguage; Debug.WriteLine($"Detected language {language.Name} with confidence {language.Score:0.00}."); } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatch.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatch.cs index 4052dd3087d9..023ef2b3ab33 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatch.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatch.cs @@ -13,7 +13,7 @@ namespace Azure.AI.TextAnalytics.Samples public partial class TextAnalyticsSamples { [Test] - public void DetectLanguageBatch() + public void DetectLanguageBatchAdvanced() { string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); @@ -21,26 +21,63 @@ public void DetectLanguageBatch() // Instantiate a client that will be used to call the service. var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - var inputs = new List + var inputs = new List { - "Hello world", - "Bonjour tout le monde", - "Hola mundo", - ":) :( :D" + new DetectLanguageInput("1") + { + CountryHint = "us", + Text = "Hello world", + }, + new DetectLanguageInput("2") + { + CountryHint = "fr", + Text = "Bonjour tout le monde", + }, + new DetectLanguageInput("3") + { + CountryHint = "es", + Text = "Hola mundo", + }, + new DetectLanguageInput("4") + { + CountryHint = "us", + Text = ":) :( :D", + } }; - Debug.WriteLine($"Detecting language for inputs:"); - foreach (var input in inputs) - { - Debug.WriteLine($" {input}"); - } - var languages = client.DetectLanguages(inputs).Value; + DetectLanguageResultCollection results = client.DetectLanguages(inputs, new TextAnalysisOptions { IncludeStatistics = true }); - Debug.WriteLine($"Detected languages are:"); - foreach (var language in languages) + int i = 0; + Debug.WriteLine($"Results of Azure Text Analytics \"Detect Language\" Model, version: \"{results.ModelVersion}\""); + Debug.WriteLine(""); + + foreach (var result in results) { - Debug.WriteLine($" {language.Name}, with confidence {language.Score:0.00}."); + var document = inputs[i++]; + + Debug.WriteLine($"On document (Id={document.Id}, CountryHint=\"{document.CountryHint}\", Text=\"{document.Text}\"):"); + + if (result.ErrorMessage != default) + { + Debug.WriteLine($" Document error: {result.ErrorMessage}."); + } + else + { + Debug.WriteLine($" Detected language {result.PrimaryLanguage.Name} with confidence {result.PrimaryLanguage.Score:0.00}."); + + Debug.WriteLine($" Document statistics:"); + Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); + Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); + Debug.WriteLine(""); + } } + + Debug.WriteLine($"Batch operation statistics:"); + Debug.WriteLine($" Document count: {results.Statistics.DocumentCount}"); + Debug.WriteLine($" Valid document count: {results.Statistics.ValidDocumentCount}"); + Debug.WriteLine($" Invalid document count: {results.Statistics.InvalidDocumentCount}"); + Debug.WriteLine($" Transaction count: {results.Statistics.TransactionCount}"); + Debug.WriteLine(""); } } } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatchAdvanced.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatchAdvanced.cs deleted file mode 100644 index 238765a68563..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatchAdvanced.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Azure.Core.Testing; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Diagnostics; - -namespace Azure.AI.TextAnalytics.Samples -{ - [LiveOnly] - public partial class TextAnalyticsSamples - { - [Test] - public void DetectLanguageBatchAdvanced() - { - string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); - string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); - - // Instantiate a client that will be used to call the service. - var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - - var inputs = new List - { - new DetectLanguageInput("1") - { - CountryHint = "us", - Text = "Hello world" - }, - new DetectLanguageInput("2") - { - CountryHint = "fr", - Text = "Bonjour tout le monde", - }, - new DetectLanguageInput("3") - { - CountryHint = "es", - Text = "Hola mundo", - }, - new DetectLanguageInput("4") - { - CountryHint = "us", - Text = ":) :( :D" - } - }; - - DocumentResultCollection results = client.DetectLanguages(inputs, new TextAnalyticsRequestOptions(showStatistics: true)); - - int i = 0; - Debug.WriteLine($"Results of Azure Text Analytics \"Detect Language\" Model, version: \"{results.ModelVersion}\""); - Debug.WriteLine(""); - - foreach (var result in results) - { - var document = inputs[i++]; - - Debug.WriteLine($"On document (Id={document.Id}, CountryHint=\"{document.CountryHint}\", Text=\"{document.Text}\"):"); - Debug.WriteLine($" Detected language {result[0].Name} with confidence {result[0].Score:0.00}."); - - Debug.WriteLine($" Document statistics:"); - Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); - Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - - Debug.WriteLine($"Batch operation statistics:"); - Debug.WriteLine($" Document count: {results.Statistics.DocumentCount}"); - Debug.WriteLine($" Valid document count: {results.Statistics.ValidDocumentCount}"); - Debug.WriteLine($" Invalid document count:{results.Statistics.InvalidDocumentCount}"); - Debug.WriteLine($" Transaction count:{results.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatchConvenience.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatchConvenience.cs new file mode 100644 index 000000000000..0498d5af61bd --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample2_DetectLanguageBatchConvenience.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Azure.Core.Testing; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Azure.AI.TextAnalytics.Samples +{ + [LiveOnly] + public partial class TextAnalyticsSamples + { + [Test] + public void DetectLanguageBatch() + { + string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); + string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); + + // Instantiate a client that will be used to call the service. + var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); + + var inputs = new List + { + "Hello world", + "Bonjour tout le monde", + "Hola mundo", + ":) :( :D", + }; + + Debug.WriteLine($"Detecting language for inputs:"); + foreach (var input in inputs) + { + Debug.WriteLine($" {input}"); + } + DetectLanguageResultCollection results = client.DetectLanguages(inputs); + + Debug.WriteLine($"Detected languages are:"); + foreach (DetectLanguageResult result in results) + { + Debug.WriteLine($" {result.PrimaryLanguage.Name}, with confidence {result.PrimaryLanguage.Score:0.00}."); + } + } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntities.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntities.cs index ede7b59ce3a0..019c5c4db0fc 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntities.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntities.cs @@ -4,6 +4,7 @@ using Azure.Core.Testing; using NUnit.Framework; using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -24,7 +25,8 @@ public void RecognizeEntities() string input = "Microsoft was founded by Bill Gates and Paul Allen."; Debug.WriteLine($"Recognizing entities for input: \"{input}\""); - var entities = client.RecognizeEntities(input).Value; + RecognizeEntitiesResult result = client.RecognizeEntities(input); + IReadOnlyCollection entities = result.NamedEntities; Debug.WriteLine($"Recognized {entities.Count()} entities:"); foreach (NamedEntity entity in entities) diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatch.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatch.cs index ed37285e9247..9f26c4043bb3 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatch.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatch.cs @@ -14,7 +14,7 @@ namespace Azure.AI.TextAnalytics.Samples public partial class TextAnalyticsSamples { [Test] - public void RecognizeEntitiesBatch() + public void RecognizeEntitiesBatchAdvanced() { string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); @@ -22,27 +22,60 @@ public void RecognizeEntitiesBatch() // Instantiate a client that will be used to call the service. var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - var inputs = new List + var inputs = new List { - "Microsoft was founded by Bill Gates and Paul Allen.", - "Text Analytics is one of the Azure Cognitive Services.", - "A key technology in Text Analytics is Named Entity Recognition (NER).", + new TextDocumentInput("1", "Microsoft was founded by Bill Gates and Paul Allen.") + { + Language = "en", + }, + new TextDocumentInput("2", "Text Analytics is one of the Azure Cognitive Services.") + { + Language = "en", + }, + new TextDocumentInput("3", "A key technology in Text Analytics is Named Entity Recognition (NER).") + { + Language = "en", + } }; - var resultCollection = client.RecognizeEntities(inputs).Value; + RecognizeEntitiesResultCollection results = client.RecognizeEntities(inputs, new TextAnalysisOptions { IncludeStatistics = true }); - Debug.WriteLine($"Recognized entities for each input are:"); int i = 0; - foreach (var entities in resultCollection) + Debug.WriteLine($"Results of Azure Text Analytics \"Named Entity Recognition\" Model, version: \"{results.ModelVersion}\""); + Debug.WriteLine(""); + + foreach (var result in results) { - Debug.WriteLine($"For input: \"{inputs[i++]}\","); - Debug.WriteLine($"the following {entities.Count()} entities were found: "); + var document = inputs[i++]; + + Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); - foreach (var entity in entities) + if (result.ErrorMessage != default) { - Debug.WriteLine($" Text: {entity.Text}, Type: {entity.Type}, SubType: {entity.SubType ?? "N/A"}, Score: {entity.Score:0.00}, Offset: {entity.Offset}, Length: {entity.Length}"); + Debug.WriteLine($" Document error: {result.ErrorMessage}."); + } + else + { + Debug.WriteLine($" Recognized the following {result.NamedEntities.Count()} entities:"); + + foreach (var entity in result.NamedEntities) + { + Debug.WriteLine($" Text: {entity.Text}, Type: {entity.Type}, SubType: {entity.SubType ?? "N/A"}, Score: {entity.Score:0.00}, Offset: {entity.Offset}, Length: {entity.Length}"); + } + + Debug.WriteLine($" Document statistics:"); + Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); + Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); + Debug.WriteLine(""); } } + + Debug.WriteLine($"Batch operation statistics:"); + Debug.WriteLine($" Document count: {results.Statistics.DocumentCount}"); + Debug.WriteLine($" Valid document count: {results.Statistics.ValidDocumentCount}"); + Debug.WriteLine($" Invalid document count: {results.Statistics.InvalidDocumentCount}"); + Debug.WriteLine($" Transaction count: {results.Statistics.TransactionCount}"); + Debug.WriteLine(""); } } } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatchAdvanced.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatchAdvanced.cs deleted file mode 100644 index 21d1debb4550..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatchAdvanced.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Azure.Core.Testing; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; - -namespace Azure.AI.TextAnalytics.Samples -{ - [LiveOnly] - public partial class TextAnalyticsSamples - { - [Test] - public void RecognizeEntitiesBatchAdvanced() - { - string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); - string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); - - // Instantiate a client that will be used to call the service. - var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - - var inputs = new List - { - new DocumentInput("1") - { - Language = "en", - Text = "Microsoft was founded by Bill Gates and Paul Allen." - }, - new DocumentInput("2") - { - Language = "en", - Text = "Text Analytics is one of the Azure Cognitive Services.", - }, - new DocumentInput("3") - { - Language = "en", - Text = "A key technology in Text Analytics is Named Entity Recognition (NER).", - } - }; - - var resultCollection = client.RecognizeEntities(inputs, new TextAnalyticsRequestOptions(showStatistics: true)).Value; - - int i = 0; - Debug.WriteLine($"Results of Azure Text Analytics \"Named Entity Recognition\" Model, version: \"{resultCollection.ModelVersion}\""); - Debug.WriteLine(""); - - foreach (var result in resultCollection) - { - var document = inputs[i++]; - - Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); - Debug.WriteLine($" Recognized the following {result.Count()} entities:"); - - foreach (var entity in result) - { - Debug.WriteLine($" Text: {entity.Text}, Type: {entity.Type}, SubType: {entity.SubType ?? "N/A"}, Score: {entity.Score:0.00}, Offset: {entity.Offset}, Length: {entity.Length}"); - } - - Debug.WriteLine($" Document statistics:"); - Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); - Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - - Debug.WriteLine($"Batch operation statistics:"); - Debug.WriteLine($" Document count: {resultCollection.Statistics.DocumentCount}"); - Debug.WriteLine($" Valid document count: {resultCollection.Statistics.ValidDocumentCount}"); - Debug.WriteLine($" Invalid document count:{resultCollection.Statistics.InvalidDocumentCount}"); - Debug.WriteLine($" Transaction count:{resultCollection.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatchConvenience.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatchConvenience.cs new file mode 100644 index 000000000000..5469dc59867d --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample3_RecognizeEntitiesBatchConvenience.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Azure.Core.Testing; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace Azure.AI.TextAnalytics.Samples +{ + [LiveOnly] + public partial class TextAnalyticsSamples + { + [Test] + public void RecognizeEntitiesBatch() + { + string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); + string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); + + // Instantiate a client that will be used to call the service. + var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); + + var inputs = new List + { + "Microsoft was founded by Bill Gates and Paul Allen.", + "Text Analytics is one of the Azure Cognitive Services.", + "A key technology in Text Analytics is Named Entity Recognition (NER).", + }; + + RecognizeEntitiesResultCollection results = client.RecognizeEntities(inputs); + + Debug.WriteLine($"Recognized entities for each input are:"); + int i = 0; + foreach (var result in results) + { + Debug.WriteLine($"For input: \"{inputs[i++]}\","); + Debug.WriteLine($"the following {result.NamedEntities.Count()} entities were found: "); + + foreach (var entity in result.NamedEntities) + { + Debug.WriteLine($" Text: {entity.Text}, Type: {entity.Type}, SubType: {entity.SubType ?? "N/A"}, Score: {entity.Score:0.00}, Offset: {entity.Offset}, Length: {entity.Length}"); + } + } + } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentiment.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentiment.cs index 4f028072fa5f..d18ccfd8f797 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentiment.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentiment.cs @@ -23,7 +23,8 @@ public void AnalyzeSentiment() string input = "That was the best day of my life!"; Debug.WriteLine($"Analyzing sentiment for input: \"{input}\""); - var sentiment = client.AnalyzeSentiment(input).Value; + AnalyzeSentimentResult result = client.AnalyzeSentiment(input).Value; + TextSentiment sentiment = result.DocumentSentiment; Debug.WriteLine($"Sentiment was {sentiment.SentimentClass.ToString()}, with scores: "); Debug.WriteLine($" Positive score: {sentiment.PositiveScore:0.00}."); diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatch.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatch.cs index ffa44490ffc8..c591382c365d 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatch.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatch.cs @@ -13,7 +13,7 @@ namespace Azure.AI.TextAnalytics.Samples public partial class TextAnalyticsSamples { [Test] - public void AnalyzeSentimentBatch() + public void AnalyzeSentimentBatchAdvanced() { string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); @@ -21,30 +21,72 @@ public void AnalyzeSentimentBatch() // Instantiate a client that will be used to call the service. var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - - var inputs = new List + var inputs = new List { - "That was the best day of my life!", - "This food is very bad.", - "I'm not sure how I feel about this product.", - "Pike place market is my favorite Seattle attraction." + new TextDocumentInput("1", "That was the best day of my life!") + { + Language = "en", + }, + new TextDocumentInput("2", "This food is very bad. Everyone who ate with us got sick.") + { + Language = "en", + }, + new TextDocumentInput("3", "I'm not sure how I feel about this product.") + { + Language = "en", + }, + new TextDocumentInput("4", "Pike Place Market is my favorite Seattle attraction. We had so much fun there.") + { + Language = "en", + } }; - Debug.WriteLine($"Analyzing sentiment for inputs:"); - foreach (var input in inputs) - { - Debug.WriteLine($" {input}"); - } - var sentiments = client.AnalyzeSentiment(inputs).Value; + AnalyzeSentimentResultCollection results = client.AnalyzeSentiment(inputs, new TextAnalysisOptions { IncludeStatistics = true }); - Debug.WriteLine($"Predicted sentiments are:"); - foreach (var sentiment in sentiments) + int i = 0; + Debug.WriteLine($"Results of Azure Text Analytics \"Sentiment Analysis\" Model, version: \"{results.ModelVersion}\""); + Debug.WriteLine(""); + + foreach (var result in results) { - Debug.WriteLine($"Document sentiment is {sentiment.SentimentClass.ToString()}, with scores: "); - Debug.WriteLine($" Positive score: {sentiment.PositiveScore:0.00}."); - Debug.WriteLine($" Neutral score: {sentiment.NeutralScore:0.00}."); - Debug.WriteLine($" Negative score: {sentiment.NegativeScore:0.00}."); + var document = inputs[i++]; + + if (result.ErrorMessage != default) + { + Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); + } + else + { + Debug.WriteLine($"Document sentiment is {result.DocumentSentiment.SentimentClass.ToString()}, with scores: "); + Debug.WriteLine($" Positive score: {result.DocumentSentiment.PositiveScore:0.00}."); + Debug.WriteLine($" Neutral score: {result.DocumentSentiment.NeutralScore:0.00}."); + Debug.WriteLine($" Negative score: {result.DocumentSentiment.NegativeScore:0.00}."); + + Debug.WriteLine($" Sentence sentiment results:"); + + foreach (var sentenceSentiment in result.SentenceSentiments) + { + Debug.WriteLine($" On sentence \"{document.Text.Substring(sentenceSentiment.Offset, sentenceSentiment.Length)}\""); + + Debug.WriteLine($" Sentiment is {sentenceSentiment.SentimentClass.ToString()}, with scores: "); + Debug.WriteLine($" Positive score: {sentenceSentiment.PositiveScore:0.00}."); + Debug.WriteLine($" Neutral score: {sentenceSentiment.NeutralScore:0.00}."); + Debug.WriteLine($" Negative score: {sentenceSentiment.NegativeScore:0.00}."); + } + + Debug.WriteLine($" Document statistics:"); + Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); + Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); + Debug.WriteLine(""); + } } + + Debug.WriteLine($"Batch operation statistics:"); + Debug.WriteLine($" Document count: {results.Statistics.DocumentCount}"); + Debug.WriteLine($" Valid document count: {results.Statistics.ValidDocumentCount}"); + Debug.WriteLine($" Invalid document count: {results.Statistics.InvalidDocumentCount}"); + Debug.WriteLine($" Transaction count: {results.Statistics.TransactionCount}"); + Debug.WriteLine(""); } } } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatchAdvanced.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatchAdvanced.cs deleted file mode 100644 index 3e80b15712b5..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatchAdvanced.cs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Azure.Core.Testing; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Diagnostics; - -namespace Azure.AI.TextAnalytics.Samples -{ - [LiveOnly] - public partial class TextAnalyticsSamples - { - [Test] - public void AnalyzeSentimentBatchAdvanced() - { - string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); - string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); - - // Instantiate a client that will be used to call the service. - var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - - var inputs = new List - { - new DocumentInput("1") - { - Language = "en", - Text = "That was the best day of my life!" - }, - new DocumentInput("2") - { - Language = "en", - Text = "This food is very bad. Everyone who ate with us got sick." - }, - new DocumentInput("3") - { - Language = "en", - Text = "I'm not sure how I feel about this product.", - }, - new DocumentInput("4") - { - Language = "en", - Text = "Pike Place Market is my favorite Seattle attraction. We had so much fun there." - } - }; - - SentimentResultCollection results = client.AnalyzeSentiment(inputs, new TextAnalyticsRequestOptions(showStatistics: true)).Value; - - int i = 0; - Debug.WriteLine($"Results of Azure Text Analytics \"Sentiment Analysis\" Model, version: \"{results.ModelVersion}\""); - Debug.WriteLine(""); - - foreach (var result in results) - { - var document = inputs[i++]; - - Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); - - Debug.WriteLine($"Document sentiment is {result.DocumentSentiment.SentimentClass.ToString()}, with scores: "); - Debug.WriteLine($" Positive score: {result.DocumentSentiment.PositiveScore:0.00}."); - Debug.WriteLine($" Neutral score: {result.DocumentSentiment.NeutralScore:0.00}."); - Debug.WriteLine($" Negative score: {result.DocumentSentiment.NegativeScore:0.00}."); - - Debug.WriteLine($" Sentence sentiment results:"); - - foreach (var sentenceSentiment in result.SentenceSentiments) - { - Debug.WriteLine($" On sentence \"{document.Text.Substring(sentenceSentiment.Offset, sentenceSentiment.Length)}\""); - - Debug.WriteLine($" Sentiment is {sentenceSentiment.SentimentClass.ToString()}, with scores: "); - Debug.WriteLine($" Positive score: {sentenceSentiment.PositiveScore:0.00}."); - Debug.WriteLine($" Neutral score: {sentenceSentiment.NeutralScore:0.00}."); - Debug.WriteLine($" Negative score: {sentenceSentiment.NegativeScore:0.00}."); - } - - Debug.WriteLine($" Document statistics:"); - Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); - Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - - Debug.WriteLine($"Batch operation statistics:"); - Debug.WriteLine($" Document count: {results.Statistics.DocumentCount}"); - Debug.WriteLine($" Valid document count: {results.Statistics.ValidDocumentCount}"); - Debug.WriteLine($" Invalid document count:{results.Statistics.InvalidDocumentCount}"); - Debug.WriteLine($" Transaction count:{results.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatchConvenience.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatchConvenience.cs new file mode 100644 index 000000000000..845af0a4005b --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample4_AnalyzeSentimentBatchConvenience.cs @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Azure.Core.Testing; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Azure.AI.TextAnalytics.Samples +{ + [LiveOnly] + public partial class TextAnalyticsSamples + { + [Test] + public void AnalyzeSentimentBatch() + { + string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); + string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); + + // Instantiate a client that will be used to call the service. + var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); + + + var inputs = new List + { + "That was the best day of my life!", + "This food is very bad.", + "I'm not sure how I feel about this product.", + "Pike place market is my favorite Seattle attraction.", + }; + + Debug.WriteLine($"Analyzing sentiment for inputs:"); + foreach (var input in inputs) + { + Debug.WriteLine($" {input}"); + } + + AnalyzeSentimentResultCollection results = client.AnalyzeSentiment(inputs); + + Debug.WriteLine($"Predicted sentiments are:"); + foreach (AnalyzeSentimentResult result in results) + { + TextSentiment sentiment = result.DocumentSentiment; + Debug.WriteLine($"Document sentiment is {sentiment.SentimentClass.ToString()}, with scores: "); + Debug.WriteLine($" Positive score: {sentiment.PositiveScore:0.00}."); + Debug.WriteLine($" Neutral score: {sentiment.NeutralScore:0.00}."); + Debug.WriteLine($" Negative score: {sentiment.NegativeScore:0.00}."); + } + } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrases.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrases.cs index e480a0037d89..742f3fb716f5 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrases.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrases.cs @@ -4,6 +4,7 @@ using Azure.Core.Testing; using NUnit.Framework; using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -24,7 +25,8 @@ public void ExtractKeyPhrases() string input = "My cat might need to see a veterinarian."; Debug.WriteLine($"Extracting key phrases for input: \"{input}\""); - var keyPhrases = client.ExtractKeyPhrases(input).Value; + ExtractKeyPhrasesResult result = client.ExtractKeyPhrases(input); + IReadOnlyCollection keyPhrases = result.KeyPhrases; Debug.WriteLine($"Extracted {keyPhrases.Count()} key phrases:"); foreach (string keyPhrase in keyPhrases) diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatch.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatch.cs index c062f8421873..29bf5a69d986 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatch.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatch.cs @@ -14,7 +14,7 @@ namespace Azure.AI.TextAnalytics.Samples public partial class TextAnalyticsSamples { [Test] - public void ExtractKeyPhrasesBatch() + public void ExtractKeyPhrasesBatchAdvanced() { string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); @@ -22,27 +22,61 @@ public void ExtractKeyPhrasesBatch() // Instantiate a client that will be used to call the service. var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - var inputs = new List + + var inputs = new List { - "Microsoft was founded by Bill Gates and Paul Allen.", - "Text Analytics is one of the Azure Cognitive Services.", - "My cat might need to see a veterinarian." + new TextDocumentInput("1", "Microsoft was founded by Bill Gates and Paul Allen.") + { + Language = "en", + }, + new TextDocumentInput("2", "Text Analytics is one of the Azure Cognitive Services.") + { + Language = "en", + }, + new TextDocumentInput("3", "My cat might need to see a veterinarian.") + { + Language = "en", + } }; - var resultCollection = client.ExtractKeyPhrases(inputs).Value; + ExtractKeyPhrasesResultCollection results = client.ExtractKeyPhrases(inputs, new TextAnalysisOptions { IncludeStatistics = true }); - Debug.WriteLine($"Extracted key phrases for each input are:"); int i = 0; - foreach (var keyPhrases in resultCollection) + Debug.WriteLine($"Results of Azure Text Analytics \"Extract Key Phrases\" Model, version: \"{results.ModelVersion}\""); + Debug.WriteLine(""); + + foreach (var result in results) { - Debug.WriteLine($"For input: \"{inputs[i++]}\","); - Debug.WriteLine($"the following {keyPhrases.Count()} key phrases were found: "); + var document = inputs[i++]; - foreach (var keyPhrase in keyPhrases) + Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); + + if (result.ErrorMessage != default) + { + Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); + } + else { - Debug.WriteLine($" {keyPhrase}"); + Debug.WriteLine($" Extracted the following {result.KeyPhrases.Count()} key phrases:"); + + foreach (var keyPhrase in result.KeyPhrases) + { + Debug.WriteLine($" {keyPhrase}"); + } + + Debug.WriteLine($" Document statistics:"); + Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); + Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); + Debug.WriteLine(""); } } + + Debug.WriteLine($"Batch operation statistics:"); + Debug.WriteLine($" Document count: {results.Statistics.DocumentCount}"); + Debug.WriteLine($" Valid document count: {results.Statistics.ValidDocumentCount}"); + Debug.WriteLine($" Invalid document count: {results.Statistics.InvalidDocumentCount}"); + Debug.WriteLine($" Transaction count: {results.Statistics.TransactionCount}"); + Debug.WriteLine(""); } } } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatchAdvanced.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatchAdvanced.cs deleted file mode 100644 index 4b91e279f25d..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatchAdvanced.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Azure.Core.Testing; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; - -namespace Azure.AI.TextAnalytics.Samples -{ - [LiveOnly] - public partial class TextAnalyticsSamples - { - [Test] - public void ExtractKeyPhrasesBatchAdvanced() - { - string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); - string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); - - // Instantiate a client that will be used to call the service. - var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - - - var inputs = new List - { - new DocumentInput("1") - { - Language = "en", - Text = "Microsoft was founded by Bill Gates and Paul Allen." - }, - new DocumentInput("2") - { - Language = "en", - Text = "Text Analytics is one of the Azure Cognitive Services.", - }, - new DocumentInput("3") - { - Language = "en", - Text = "My cat might need to see a veterinarian.", - } - }; - - var resultCollection = client.ExtractKeyPhrases(inputs, new TextAnalyticsRequestOptions(showStatistics: true)).Value; - - int i = 0; - Debug.WriteLine($"Results of Azure Text Analytics \"Extract Key Phrases\" Model, version: \"{resultCollection.ModelVersion}\""); - Debug.WriteLine(""); - - foreach (var result in resultCollection) - { - var document = inputs[i++]; - - Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); - Debug.WriteLine($" Extracted the following {result.Count()} key phrases:"); - - foreach (var keyPhrase in result) - { - Debug.WriteLine($" {keyPhrase}"); - } - - Debug.WriteLine($" Document statistics:"); - Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); - Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - - Debug.WriteLine($"Batch operation statistics:"); - Debug.WriteLine($" Document count: {resultCollection.Statistics.DocumentCount}"); - Debug.WriteLine($" Valid document count: {resultCollection.Statistics.ValidDocumentCount}"); - Debug.WriteLine($" Invalid document count:{resultCollection.Statistics.InvalidDocumentCount}"); - Debug.WriteLine($" Transaction count:{resultCollection.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatchConvenience.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatchConvenience.cs new file mode 100644 index 000000000000..d240e1ba4809 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample5_ExtractKeyPhrasesBatchConvenience.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Azure.Core.Testing; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace Azure.AI.TextAnalytics.Samples +{ + [LiveOnly] + public partial class TextAnalyticsSamples + { + [Test] + public void ExtractKeyPhrasesBatch() + { + string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); + string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); + + // Instantiate a client that will be used to call the service. + var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); + + var inputs = new List + { + "Microsoft was founded by Bill Gates and Paul Allen.", + "Text Analytics is one of the Azure Cognitive Services.", + "My cat might need to see a veterinarian.", + }; + + ExtractKeyPhrasesResultCollection results = client.ExtractKeyPhrases(inputs); + + Debug.WriteLine($"Extracted key phrases for each input are:"); + int i = 0; + foreach (var result in results) + { + Debug.WriteLine($"For input: \"{inputs[i++]}\","); + Debug.WriteLine($"the following {result.KeyPhrases.Count()} key phrases were found: "); + + foreach (var keyPhrase in result.KeyPhrases) + { + Debug.WriteLine($" {keyPhrase}"); + } + } + } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntities.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntities.cs index aa7719069f49..268556eab6c1 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntities.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntities.cs @@ -4,6 +4,7 @@ using Azure.Core.Testing; using NUnit.Framework; using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -24,7 +25,8 @@ public void RecognizePiiEntities() string input = "A developer with SSN 859-98-0987 whose phone number is 206-867-5309 is building tools with our APIs."; Debug.WriteLine($"Recognizing PII entities for input: \"{input}\""); - var entities = client.RecognizePiiEntities(input).Value; + RecognizeEntitiesResult result = client.RecognizePiiEntities(input); + IReadOnlyCollection entities = result.NamedEntities; Debug.WriteLine($"Recognized {entities.Count()} PII entit{(entities.Count() > 1 ? "ies" : "y")}:"); foreach (NamedEntity entity in entities) diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatch.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatch.cs index 06f39958a444..2506c52cbec5 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatch.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatch.cs @@ -14,7 +14,7 @@ namespace Azure.AI.TextAnalytics.Samples public partial class TextAnalyticsSamples { [Test] - public void RecognizePiiEntitiesBatch() + public void RecognizePiiEntitiesBatchAdvanced() { string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); @@ -22,27 +22,60 @@ public void RecognizePiiEntitiesBatch() // Instantiate a client that will be used to call the service. var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - var inputs = new List + var inputs = new List { - "A developer with SSN 859-98-0987 whose phone number is 206-867-5309 is building tools with our APIs.", - "Your ABA number - 111000025 - is the first 9 digits in the lower left hand corner of your personal check.", - "Is 998.214.865-68 your Brazilian CPF number?", + new TextDocumentInput("1", "A developer with SSN 859-98-0987 whose phone number is 206-867-5309 is building tools with our APIs.") + { + Language = "en", + }, + new TextDocumentInput("2","Your ABA number - 111000025 - is the first 9 digits in the lower left hand corner of your personal check.") + { + Language = "en", + }, + new TextDocumentInput("3", "Is 998.214.865-68 your Brazilian CPF number?") + { + Language = "en", + } }; - var resultCollection = client.RecognizePiiEntities(inputs).Value; + RecognizeEntitiesResultCollection results = client.RecognizePiiEntities(inputs, new TextAnalysisOptions { IncludeStatistics = true }); - Debug.WriteLine($"The following Personally Identifiable Information entities were recognized:"); int i = 0; - foreach (var entities in resultCollection) + Debug.WriteLine($"Results of Azure Text Analytics \"Pii Entity Recognition\" Model, version: \"{results.ModelVersion}\""); + Debug.WriteLine(""); + + foreach (var result in results) { - Debug.WriteLine($"For input: \"{inputs[i++]}\","); - Debug.WriteLine($"the following {entities.Count()} PII entit{(entities.Count() > 1 ? "ies were" : "y was")} found:"); + var document = inputs[i++]; + + Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); - foreach (var entity in entities) + if (result.ErrorMessage != default) { - Debug.WriteLine($" Text: {entity.Text}, Type: {entity.Type}, SubType: {entity.SubType ?? "N/A"}, Score: {entity.Score:0.00}, Offset: {entity.Offset}, Length: {entity.Length}"); + Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); + } + else + { + Debug.WriteLine($" Recognized the following {result.NamedEntities.Count()} PII entit{(result.NamedEntities.Count() > 1 ? "ies" : "y ")}:"); + + foreach (var entity in result.NamedEntities) + { + Debug.WriteLine($" Text: {entity.Text}, Type: {entity.Type}, SubType: {entity.SubType ?? "N/A"}, Score: {entity.Score:0.00}, Offset: {entity.Offset}, Length: {entity.Length}"); + } + + Debug.WriteLine($" Document statistics:"); + Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); + Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); + Debug.WriteLine(""); } } + + Debug.WriteLine($"Batch operation statistics:"); + Debug.WriteLine($" Document count: {results.Statistics.DocumentCount}"); + Debug.WriteLine($" Valid document count: {results.Statistics.ValidDocumentCount}"); + Debug.WriteLine($" Invalid document count: {results.Statistics.InvalidDocumentCount}"); + Debug.WriteLine($" Transaction count: {results.Statistics.TransactionCount}"); + Debug.WriteLine(""); } } } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatchAdvanced.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatchAdvanced.cs deleted file mode 100644 index 4ecf695fc06b..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatchAdvanced.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Azure.Core.Testing; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; - -namespace Azure.AI.TextAnalytics.Samples -{ - [LiveOnly] - public partial class TextAnalyticsSamples - { - [Test] - public void RecognizePiiEntitiesBatchAdvanced() - { - string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); - string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); - - // Instantiate a client that will be used to call the service. - var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - - var inputs = new List - { - new DocumentInput("1") - { - Language = "en", - Text = "A developer with SSN 859-98-0987 whose phone number is 206-867-5309 is building tools with our APIs." - }, - new DocumentInput("2") - { - Language = "en", - Text = "Your ABA number - 111000025 - is the first 9 digits in the lower left hand corner of your personal check.", - }, - new DocumentInput("3") - { - Language = "en", - Text = "Is 998.214.865-68 your Brazilian CPF number?", - } - }; - - var resultCollection = client.RecognizePiiEntities(inputs, new TextAnalyticsRequestOptions(showStatistics: true)).Value; - - int i = 0; - Debug.WriteLine($"Results of Azure Text Analytics \"Pii Entity Recognition\" Model, version: \"{resultCollection.ModelVersion}\""); - Debug.WriteLine(""); - - foreach (var result in resultCollection) - { - var document = inputs[i++]; - - Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); - Debug.WriteLine($" Recognized the following {result.Count()} PII entit{(result.Count() > 1 ? "ies" : "y ")}:"); - - foreach (var entity in result) - { - Debug.WriteLine($" Text: {entity.Text}, Type: {entity.Type}, SubType: {entity.SubType ?? "N/A"}, Score: {entity.Score:0.00}, Offset: {entity.Offset}, Length: {entity.Length}"); - } - - Debug.WriteLine($" Document statistics:"); - Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); - Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - - Debug.WriteLine($"Batch operation statistics:"); - Debug.WriteLine($" Document count: {resultCollection.Statistics.DocumentCount}"); - Debug.WriteLine($" Valid document count: {resultCollection.Statistics.ValidDocumentCount}"); - Debug.WriteLine($" Invalid document count:{resultCollection.Statistics.InvalidDocumentCount}"); - Debug.WriteLine($" Transaction count:{resultCollection.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatchConvenience.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatchConvenience.cs new file mode 100644 index 000000000000..eb2f4c836adf --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample6_RecognizePiiEntitiesBatchConvenience.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Azure.Core.Testing; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace Azure.AI.TextAnalytics.Samples +{ + [LiveOnly] + public partial class TextAnalyticsSamples + { + [Test] + public void RecognizePiiEntitiesBatch() + { + string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); + string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); + + // Instantiate a client that will be used to call the service. + var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); + + var inputs = new List + { + "A developer with SSN 859-98-0987 whose phone number is 206-867-5309 is building tools with our APIs.", + "Your ABA number - 111000025 - is the first 9 digits in the lower left hand corner of your personal check.", + "Is 998.214.865-68 your Brazilian CPF number?", + }; + + RecognizeEntitiesResultCollection results = client.RecognizePiiEntities(inputs); + + Debug.WriteLine($"The following Personally Identifiable Information entities were recognized:"); + int i = 0; + foreach (var result in results) + { + Debug.WriteLine($"For input: \"{inputs[i++]}\","); + Debug.WriteLine($"the following {result.NamedEntities.Count()} PII entit{(result.NamedEntities.Count() > 1 ? "ies were" : "y was")} found:"); + + foreach (var entity in result.NamedEntities) + { + Debug.WriteLine($" Text: {entity.Text}, Type: {entity.Type}, SubType: {entity.SubType ?? "N/A"}, Score: {entity.Score:0.00}, Offset: {entity.Offset}, Length: {entity.Length}"); + } + } + } + } +} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinking.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinking.cs index 1d5bebdd5241..4c0c29bc537f 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinking.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinking.cs @@ -24,10 +24,10 @@ public void ExtractEntityLinking() string input = "Microsoft was founded by Bill Gates and Paul Allen."; Debug.WriteLine($"Linking entities for input: \"{input}\""); - var linkedEntities = client.ExtractEntityLinking(input).Value; + ExtractLinkedEntitiesResult result = client.ExtractEntityLinking(input); - Debug.WriteLine($"Extracted {linkedEntities.Count()} linked entit{(linkedEntities.Count() > 1 ? "ies" : "y")}:"); - foreach (LinkedEntity linkedEntity in linkedEntities) + Debug.WriteLine($"Extracted {result.LinkedEntities.Count()} linked entit{(result.LinkedEntities.Count() > 1 ? "ies" : "y")}:"); + foreach (LinkedEntity linkedEntity in result.LinkedEntities) { Debug.WriteLine($"Name: {linkedEntity.Name}, Id: {linkedEntity.Id}, Language: {linkedEntity.Language}, Data Source: {linkedEntity.DataSource}, Uri: {linkedEntity.Uri.ToString()}"); foreach (LinkedEntityMatch match in linkedEntity.Matches) diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatch.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatch.cs index dfd5839b7f7f..3d582e2e087f 100644 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatch.cs +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatch.cs @@ -14,7 +14,7 @@ namespace Azure.AI.TextAnalytics.Samples public partial class TextAnalyticsSamples { [Test] - public void ExtractEntityLinkingBatch() + public void ExtractEntityLinkingBatchAdvanced() { string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); @@ -22,33 +22,64 @@ public void ExtractEntityLinkingBatch() // Instantiate a client that will be used to call the service. var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - var inputs = new List + var inputs = new List { - "Microsoft was founded by Bill Gates and Paul Allen.", - "Text Analytics is one of the Azure Cognitive Services.", - "Pike place market is my favorite Seattle attraction." + new TextDocumentInput("1", "Microsoft was founded by Bill Gates and Paul Allen.") + { + Language = "en", + }, + new TextDocumentInput("2", "Text Analytics is one of the Azure Cognitive Services.") + { + Language = "en", + }, + new TextDocumentInput("3", "Pike place market is my favorite Seattle attraction.") + { + Language = "en", + } }; - var resultCollection = client.ExtractEntityLinking(inputs).Value; + ExtractLinkedEntitiesResultCollection results = client.ExtractEntityLinking(inputs, new TextAnalysisOptions { IncludeStatistics = true }); - Debug.WriteLine($"Linked entities for each input are:\n"); int i = 0; - foreach (var linkedEntities in resultCollection) + Debug.WriteLine($"Results of Azure Text Analytics \"Entity Linking\", version: \"{results.ModelVersion}\""); + Debug.WriteLine(""); + + foreach (var result in results) { - Debug.Write($"For input: \"{inputs[i++]}\", "); - Debug.WriteLine($"extracted {linkedEntities.Count()} linked entit{(linkedEntities.Count() > 1 ? "ies" : "y")}:"); + var document = inputs[i++]; + + Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); - foreach (LinkedEntity linkedEntity in linkedEntities) + if (result.ErrorMessage != default) { - Debug.WriteLine($" Name: \"{linkedEntity.Name}\", Id: \"{linkedEntity.Id}\", Language: {linkedEntity.Language}, Data Source: {linkedEntity.DataSource}, Uri: {linkedEntity.Uri.ToString()}"); - foreach (LinkedEntityMatch match in linkedEntity.Matches) + Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); + } + else + { + Debug.WriteLine($" Extracted the following {result.LinkedEntities.Count()} linked entities:"); + + foreach (var linkedEntity in result.LinkedEntities) { - Debug.WriteLine($" Match Text: \"{match.Text}\", Score: {match.Score:0.00}, Offset: {match.Offset}, Length: {match.Length}."); + Debug.WriteLine($" Name: \"{linkedEntity.Name}\", Id: \"{linkedEntity.Id}\", Language: {linkedEntity.Language}, Data Source: {linkedEntity.DataSource}, Uri: {linkedEntity.Uri.ToString()}"); + foreach (LinkedEntityMatch match in linkedEntity.Matches) + { + Debug.WriteLine($" Match Text: \"{match.Text}\", Score: {match.Score:0.00}, Offset: {match.Offset}, Length: {match.Length}."); + } } - } - Debug.WriteLine(""); + Debug.WriteLine($" Document statistics:"); + Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); + Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); + Debug.WriteLine(""); + } } + + Debug.WriteLine($"Batch operation statistics:"); + Debug.WriteLine($" Document count: {results.Statistics.DocumentCount}"); + Debug.WriteLine($" Valid document count: {results.Statistics.ValidDocumentCount}"); + Debug.WriteLine($" Invalid document count: {results.Statistics.InvalidDocumentCount}"); + Debug.WriteLine($" Transaction count: {results.Statistics.TransactionCount}"); + Debug.WriteLine(""); } } } diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatchAdvanced.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatchAdvanced.cs deleted file mode 100644 index 2b13d2069b80..000000000000 --- a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatchAdvanced.cs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using Azure.Core.Testing; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; - -namespace Azure.AI.TextAnalytics.Samples -{ - [LiveOnly] - public partial class TextAnalyticsSamples - { - [Test] - public void ExtractEntityLinkingBatchAdvanced() - { - string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); - string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); - - // Instantiate a client that will be used to call the service. - var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); - - var inputs = new List - { - new DocumentInput("1") - { - Language = "en", - Text = "Microsoft was founded by Bill Gates and Paul Allen." - }, - new DocumentInput("2") - { - Language = "en", - Text = "Text Analytics is one of the Azure Cognitive Services." - }, - new DocumentInput("3") - { - Language = "en", - Text = "Pike place market is my favorite Seattle attraction." - } - }; - - var resultCollection = client.ExtractEntityLinking(inputs, new TextAnalyticsRequestOptions(showStatistics: true)).Value; - - int i = 0; - Debug.WriteLine($"Results of Azure Text Analytics \"Entity Linking\", version: \"{resultCollection.ModelVersion}\""); - Debug.WriteLine(""); - - foreach (var result in resultCollection) - { - var document = inputs[i++]; - - Debug.WriteLine($"On document (Id={document.Id}, Language=\"{document.Language}\", Text=\"{document.Text}\"):"); - Debug.WriteLine($" Extracted the following {result.Count()} linked entities:"); - - foreach (var linkedEntity in result) - { - Debug.WriteLine($" Name: \"{linkedEntity.Name}\", Id: \"{linkedEntity.Id}\", Language: {linkedEntity.Language}, Data Source: {linkedEntity.DataSource}, Uri: {linkedEntity.Uri.ToString()}"); - foreach (LinkedEntityMatch match in linkedEntity.Matches) - { - Debug.WriteLine($" Match Text: \"{match.Text}\", Score: {match.Score:0.00}, Offset: {match.Offset}, Length: {match.Length}."); - } - } - - Debug.WriteLine($" Document statistics:"); - Debug.WriteLine($" Character count: {result.Statistics.CharacterCount}"); - Debug.WriteLine($" Transaction count: {result.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - - Debug.WriteLine($"Batch operation statistics:"); - Debug.WriteLine($" Document count: {resultCollection.Statistics.DocumentCount}"); - Debug.WriteLine($" Valid document count: {resultCollection.Statistics.ValidDocumentCount}"); - Debug.WriteLine($" Invalid document count:{resultCollection.Statistics.InvalidDocumentCount}"); - Debug.WriteLine($" Transaction count:{resultCollection.Statistics.TransactionCount}"); - Debug.WriteLine(""); - } - } -} diff --git a/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatchConvenience.cs b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatchConvenience.cs new file mode 100644 index 000000000000..941c80b251c9 --- /dev/null +++ b/sdk/cognitiveservices/textanalytics/Azure.AI.TextAnalytics/tests/samples/Sample7_ExtractEntityLinkingBatchConvenience.cs @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Azure.Core.Testing; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace Azure.AI.TextAnalytics.Samples +{ + [LiveOnly] + public partial class TextAnalyticsSamples + { + [Test] + public void ExtractEntityLinkingBatch() + { + string endpoint = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_ENDPOINT"); + string subscriptionKey = Environment.GetEnvironmentVariable("TEXT_ANALYTICS_SUBSCRIPTION_KEY"); + + // Instantiate a client that will be used to call the service. + var client = new TextAnalyticsClient(new Uri(endpoint), subscriptionKey); + + var inputs = new List + { + "Microsoft was founded by Bill Gates and Paul Allen.", + "Text Analytics is one of the Azure Cognitive Services.", + "Pike place market is my favorite Seattle attraction.", + }; + + ExtractLinkedEntitiesResultCollection results = client.ExtractEntityLinking(inputs); + + Debug.WriteLine($"Linked entities for each input are:\n"); + int i = 0; + foreach (var result in results) + { + Debug.Write($"For input: \"{inputs[i++]}\", "); + Debug.WriteLine($"extracted {result.LinkedEntities.Count()} linked entit{(result.LinkedEntities.Count() > 1 ? "ies" : "y")}:"); + + foreach (LinkedEntity linkedEntity in result.LinkedEntities) + { + Debug.WriteLine($" Name: \"{linkedEntity.Name}\", Id: \"{linkedEntity.Id}\", Language: {linkedEntity.Language}, Data Source: {linkedEntity.DataSource}, Uri: {linkedEntity.Uri.ToString()}"); + foreach (LinkedEntityMatch match in linkedEntity.Matches) + { + Debug.WriteLine($" Match Text: \"{match.Text}\", Score: {match.Score:0.00}, Offset: {match.Offset}, Length: {match.Length}."); + } + } + + Debug.WriteLine(""); + } + } + } +}