Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TA] Implement new Analyze sentiment in Analyze endpoint #21109

Merged
merged 1 commit into from
May 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions sdk/textanalytics/Azure.AI.TextAnalytics/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
## 5.1.0-beta.7 (Unreleased)
### New features
- Added property `DisableServiceLogs` to `TextAnalyticsRequestOptions`.
- Added support for Sentiment Analysis as an action type for `StartAnalyzeBatchActions`.
- Changed type of `IncludeOpinionMining` to `bool?`.

### Breaking changes
- The client defaults to the latest supported service version, which currently is `3.1-preview.5`.
Expand Down
159 changes: 90 additions & 69 deletions sdk/textanalytics/Azure.AI.TextAnalytics/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -538,31 +538,22 @@ Text Analytics for health is a containerized service that extracts and labels re
```

### Run multiple actions Asynchronously
This functionality allows running multiple actions in one or more documents. Actions include entity recognition, linked entity recognition, key phrase extraction, and Personally Identifiable Information (PII) Recognition. For more information see [Using analyze][analyze_operation_howto].
This functionality allows running multiple actions in one or more documents. Actions include entity recognition, linked entity recognition, key phrase extraction, Personally Identifiable Information (PII) Recognition, and sentiment analysis. For more information see [Using analyze][analyze_operation_howto].
maririos marked this conversation as resolved.
Show resolved Hide resolved

```C# Snippet:AnalyzeOperationBatchConvenienceAsync
string documentA = @"We love this trail and make the trip every year. The views are breathtaking and well
worth the hike! Yesterday was foggy though, so we missed the spectacular views.
We tried again today and it was amazing. Everyone in my family liked the trail although
it was too challenging for the less athletic among us.
Not necessarily recommended for small children.
A hotel close to the trail offers services for childcare in case you want that.";
it was too challenging for the less athletic among us.";

string documentB = @"Last week we stayed at Hotel Foo to celebrate our anniversary. The staff knew about
our anniversary so they helped me organize a little surprise for my partner.
The room was clean and with the decoration I requested. It was perfect!";

string documentC = @"That was the best day of my life! We went on a 4 day trip where we stayed at Hotel Foo.
They had great amenities that included an indoor pool, a spa, and a bar.
The spa offered couples massages which were really good.
The spa was clean and felt very peaceful. Overall the whole experience was great.
We will definitely come back.";

var batchDocuments = new List<string>
{
documentA,
documentB,
documentC
documentB
};

TextAnalyticsActions actions = new TextAnalyticsActions()
Expand All @@ -571,6 +562,7 @@ This functionality allows running multiple actions in one or more documents. Act
RecognizeEntitiesOptions = new List<RecognizeEntitiesOptions>() { new RecognizeEntitiesOptions() },
RecognizePiiEntitiesOptions = new List<RecognizePiiEntitiesOptions>() { new RecognizePiiEntitiesOptions() },
RecognizeLinkedEntitiesOptions = new List<RecognizeLinkedEntitiesOptions>() { new RecognizeLinkedEntitiesOptions() },
AnalyzeSentimentOptions = new List<AnalyzeSentimentOptions>() { new AnalyzeSentimentOptions() },
DisplayName = "AnalyzeOperationSample"
};

Expand All @@ -591,88 +583,117 @@ This functionality allows running multiple actions in one or more documents. Act

await foreach (AnalyzeBatchActionsResult documentsInPage in operation.Value)
{
RecognizeEntitiesResultCollection entitiesResult = documentsInPage.RecognizeEntitiesActionsResults.FirstOrDefault().Result;

ExtractKeyPhrasesResultCollection keyPhrasesResult = documentsInPage.ExtractKeyPhrasesActionsResults.FirstOrDefault().Result;

RecognizePiiEntitiesResultCollection piiResult = documentsInPage.RecognizePiiEntitiesActionsResults.FirstOrDefault().Result;

RecognizeLinkedEntitiesResultCollection linkedEntitiesResult = documentsInPage.RecognizeLinkedEntitiesActionsResults.FirstOrDefault().Result;
IReadOnlyCollection<ExtractKeyPhrasesActionResult> keyPhrasesActionsResults = documentsInPage.ExtractKeyPhrasesActionsResults;
IReadOnlyCollection<RecognizeEntitiesActionResult> entitiesActionsResults = documentsInPage.RecognizeEntitiesActionsResults;
IReadOnlyCollection<RecognizePiiEntitiesActionResult> piiActionsResults = documentsInPage.RecognizePiiEntitiesActionsResults;
IReadOnlyCollection<RecognizeLinkedEntitiesActionResult> entityLinkingActionsResults = documentsInPage.RecognizeLinkedEntitiesActionsResults;
IReadOnlyCollection<AnalyzeSentimentActionResult> analyzeSentimentActionsResults = documentsInPage.AnalyzeSentimentActionsResults;

Console.WriteLine("Recognized Entities");

foreach (RecognizeEntitiesResult result in entitiesResult)
int docNumber = 1;
foreach (RecognizeEntitiesActionResult entitiesActionResults in entitiesActionsResults)
{
Console.WriteLine($" Recognized the following {result.Entities.Count} entities:");

foreach (CategorizedEntity entity in result.Entities)
foreach (RecognizeEntitiesResult result in entitiesActionResults.Result)
{
Console.WriteLine($" Entity: {entity.Text}");
Console.WriteLine($" Category: {entity.Category}");
Console.WriteLine($" Offset: {entity.Offset}");
Console.WriteLine($" Length: {entity.Length}");
Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}");
Console.WriteLine($" SubCategory: {entity.SubCategory}");
Console.WriteLine($" Document #{docNumber++}");
Console.WriteLine($" Recognized the following {result.Entities.Count} entities:");

foreach (CategorizedEntity entity in result.Entities)
{
Console.WriteLine($" Entity: {entity.Text}");
Console.WriteLine($" Category: {entity.Category}");
Console.WriteLine($" Offset: {entity.Offset}");
Console.WriteLine($" Length: {entity.Length}");
Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}");
Console.WriteLine($" SubCategory: {entity.SubCategory}");
}
Console.WriteLine("");
}
Console.WriteLine("");
}

Console.WriteLine("Recognized PII Entities");

foreach (RecognizePiiEntitiesResult result in piiResult)
docNumber = 1;
foreach (RecognizePiiEntitiesActionResult piiActionResults in piiActionsResults)
{
Console.WriteLine($" Recognized the following {result.Entities.Count} PII entities:");

foreach (PiiEntity entity in result.Entities)
foreach (RecognizePiiEntitiesResult result in piiActionResults.Result)
{
Console.WriteLine($" Entity: {entity.Text}");
Console.WriteLine($" Category: {entity.Category}");
Console.WriteLine($" Offset: {entity.Offset}");
Console.WriteLine($" Length: {entity.Length}");
Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}");
Console.WriteLine($" SubCategory: {entity.SubCategory}");
Console.WriteLine($" Document #{docNumber++}");
Console.WriteLine($" Recognized the following {result.Entities.Count} PII entities:");

foreach (PiiEntity entity in result.Entities)
{
Console.WriteLine($" Entity: {entity.Text}");
Console.WriteLine($" Category: {entity.Category}");
Console.WriteLine($" Offset: {entity.Offset}");
Console.WriteLine($" Length: {entity.Length}");
Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}");
Console.WriteLine($" SubCategory: {entity.SubCategory}");
}
Console.WriteLine("");
}
Console.WriteLine("");
}

Console.WriteLine("Key Phrases");

foreach (ExtractKeyPhrasesResult result in keyPhrasesResult)
docNumber = 1;
foreach (ExtractKeyPhrasesActionResult keyPhrasesActionResult in keyPhrasesActionsResults)
{
Console.WriteLine($" Recognized the following {result.KeyPhrases.Count} Keyphrases:");

foreach (string keyphrase in result.KeyPhrases)
foreach (ExtractKeyPhrasesResult result in keyPhrasesActionResult.Result)
{
Console.WriteLine($" {keyphrase}");
Console.WriteLine($" Document #{docNumber++}");
Console.WriteLine($" Recognized the following {result.KeyPhrases.Count} Keyphrases:");

foreach (string keyphrase in result.KeyPhrases)
{
Console.WriteLine($" {keyphrase}");
}
Console.WriteLine("");
}
Console.WriteLine("");
}

Console.WriteLine("Recognized Linked Entities");

foreach (RecognizeLinkedEntitiesResult result in linkedEntitiesResult)
docNumber = 1;
foreach (RecognizeLinkedEntitiesActionResult linkedEntitiesActionResults in entityLinkingActionsResults)
{
Console.WriteLine($" Recognized the following {result.Entities.Count} linked entities:");

foreach (LinkedEntity entity in result.Entities)
foreach (RecognizeLinkedEntitiesResult result in linkedEntitiesActionResults.Result)
{
Console.WriteLine($" Entity: {entity.Name}");
Console.WriteLine($" DataSource: {entity.DataSource}");
Console.WriteLine($" DataSource EntityId: {entity.DataSourceEntityId}");
Console.WriteLine($" Language: {entity.Language}");
Console.WriteLine($" DataSource Url: {entity.Url}");

Console.WriteLine($" Total Matches: {entity.Matches.Count()}");
foreach (LinkedEntityMatch match in entity.Matches)
Console.WriteLine($" Document #{docNumber++}");
Console.WriteLine($" Recognized the following {result.Entities.Count} linked entities:");

foreach (LinkedEntity entity in result.Entities)
{
Console.WriteLine($" Match Text: {match.Text}");
Console.WriteLine($" ConfidenceScore: {match.ConfidenceScore}");
Console.WriteLine($" Offset: {match.Offset}");
Console.WriteLine($" Length: {match.Length}");
Console.WriteLine($" Entity: {entity.Name}");
Console.WriteLine($" DataSource: {entity.DataSource}");
Console.WriteLine($" DataSource EntityId: {entity.DataSourceEntityId}");
Console.WriteLine($" Language: {entity.Language}");
Console.WriteLine($" DataSource Url: {entity.Url}");

Console.WriteLine($" Total Matches: {entity.Matches.Count()}");
foreach (LinkedEntityMatch match in entity.Matches)
{
Console.WriteLine($" Match Text: {match.Text}");
Console.WriteLine($" ConfidenceScore: {match.ConfidenceScore}");
Console.WriteLine($" Offset: {match.Offset}");
Console.WriteLine($" Length: {match.Length}");
}
Console.WriteLine("");
}
Console.WriteLine("");
}
Console.WriteLine("");
}

Console.WriteLine("Analyze Sentiment");
docNumber = 1;
foreach (AnalyzeSentimentActionResult analyzeSentimentActionsResult in analyzeSentimentActionsResults)
{
foreach (AnalyzeSentimentResult result in analyzeSentimentActionsResult.Result)
{
Console.WriteLine($" Document #{docNumber++}");
Console.WriteLine($" Sentiment is {result.DocumentSentiment.Sentiment}, with confidence scores: ");
Console.WriteLine($" Positive confidence score: {result.DocumentSentiment.ConfidenceScores.Positive}.");
Console.WriteLine($" Neutral confidence score: {result.DocumentSentiment.ConfidenceScores.Neutral}.");
Console.WriteLine($" Negative confidence score: {result.DocumentSentiment.ConfidenceScores.Negative}.");
Console.WriteLine("");
}
}
}
}
Expand Down Expand Up @@ -746,7 +767,7 @@ Samples are provided for each main functional area, and for each area, samples a
- [Recognize PII Entities][recognize_pii_entities_sample]
- [Recognize Linked Entities][recognize_linked_entities_sample]
- [Recognize Healthcare Entities][recognize_healthcare_sample]
- [Run Analyze Operation][analyze_operation_sample]
- [Run multiple actions][analyze_operation_sample]

### Advanced samples
- [Analyze Sentiment with Opinion Mining][analyze_sentiment_opinion_mining_sample]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public AnalyzeBatchActionsOptions() { }
public partial class AnalyzeBatchActionsResult
{
internal AnalyzeBatchActionsResult() { }
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.AnalyzeSentimentActionResult> AnalyzeSentimentActionsResults { get { throw null; } }
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.ExtractKeyPhrasesActionResult> ExtractKeyPhrasesActionsResults { get { throw null; } }
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.RecognizeEntitiesActionResult> RecognizeEntitiesActionsResults { get { throw null; } }
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.RecognizeLinkedEntitiesActionResult> RecognizeLinkedEntitiesActionsResults { get { throw null; } }
Expand Down Expand Up @@ -78,10 +79,15 @@ internal AnalyzeHealthcareEntitiesResultCollection() : base (default(System.Coll
public string ModelVersion { get { throw null; } }
public Azure.AI.TextAnalytics.TextDocumentBatchStatistics Statistics { get { throw null; } }
}
public partial class AnalyzeSentimentActionResult : Azure.AI.TextAnalytics.TextAnalyticsActionDetails
{
internal AnalyzeSentimentActionResult() { }
public Azure.AI.TextAnalytics.AnalyzeSentimentResultCollection Result { get { throw null; } }
}
public partial class AnalyzeSentimentOptions : Azure.AI.TextAnalytics.TextAnalyticsRequestOptions
{
public AnalyzeSentimentOptions() { }
public bool IncludeOpinionMining { get { throw null; } set { } }
public bool? IncludeOpinionMining { get { throw null; } set { } }
}
public partial class AnalyzeSentimentResult : Azure.AI.TextAnalytics.TextAnalyticsResult
{
Expand Down Expand Up @@ -681,6 +687,7 @@ internal TextAnalyticsActionDetails() { }
public partial class TextAnalyticsActions
{
public TextAnalyticsActions() { }
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.AnalyzeSentimentOptions> AnalyzeSentimentOptions { get { throw null; } set { } }
public string DisplayName { get { throw null; } set { } }
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.ExtractKeyPhrasesOptions> ExtractKeyPhrasesOptions { get { throw null; } set { } }
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.RecognizeEntitiesOptions> RecognizeEntitiesOptions { get { throw null; } set { } }
Expand Down
1 change: 1 addition & 0 deletions sdk/textanalytics/Azure.AI.TextAnalytics/samples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Azure Cognitive Services Text Analytics is a cloud service that provides advance
* Personally Identifiable Information (PII) Recognition
* Linked Entity Recognition
* Healthcare Recognition
* Running multiple actions in one or more documents

## Common scenarios samples
- [Detect Language](https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/textanalytics/Azure.AI.TextAnalytics/samples/Sample1_DetectLanguage.md)
Expand Down
Loading