Skip to content

Commit 4ff2606

Browse files
authored
[TA] Implement new Analyze sentiment in Analyze endpoint (Azure#21109)
1 parent 8045c0f commit 4ff2606

File tree

82 files changed

+11234
-2415
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+11234
-2415
lines changed

sdk/textanalytics/Azure.AI.TextAnalytics/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
## 5.1.0-beta.7 (Unreleased)
44
### New features
55
- Added property `DisableServiceLogs` to `TextAnalyticsRequestOptions`.
6+
- Added support for Sentiment Analysis as an action type for `StartAnalyzeBatchActions`.
7+
- Changed type of `IncludeOpinionMining` to `bool?`.
68

79
### Breaking changes
810
- The client defaults to the latest supported service version, which currently is `3.1-preview.5`.

sdk/textanalytics/Azure.AI.TextAnalytics/README.md

Lines changed: 90 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -538,31 +538,22 @@ Text Analytics for health is a containerized service that extracts and labels re
538538
```
539539

540540
### Run multiple actions Asynchronously
541-
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].
541+
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].
542542

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

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

555-
string documentC = @"That was the best day of my life! We went on a 4 day trip where we stayed at Hotel Foo.
556-
They had great amenities that included an indoor pool, a spa, and a bar.
557-
The spa offered couples massages which were really good.
558-
The spa was clean and felt very peaceful. Overall the whole experience was great.
559-
We will definitely come back.";
560-
561553
var batchDocuments = new List<string>
562554
{
563555
documentA,
564-
documentB,
565-
documentC
556+
documentB
566557
};
567558

568559
TextAnalyticsActions actions = new TextAnalyticsActions()
@@ -571,6 +562,7 @@ This functionality allows running multiple actions in one or more documents. Act
571562
RecognizeEntitiesOptions = new List<RecognizeEntitiesOptions>() { new RecognizeEntitiesOptions() },
572563
RecognizePiiEntitiesOptions = new List<RecognizePiiEntitiesOptions>() { new RecognizePiiEntitiesOptions() },
573564
RecognizeLinkedEntitiesOptions = new List<RecognizeLinkedEntitiesOptions>() { new RecognizeLinkedEntitiesOptions() },
565+
AnalyzeSentimentOptions = new List<AnalyzeSentimentOptions>() { new AnalyzeSentimentOptions() },
574566
DisplayName = "AnalyzeOperationSample"
575567
};
576568

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

592584
await foreach (AnalyzeBatchActionsResult documentsInPage in operation.Value)
593585
{
594-
RecognizeEntitiesResultCollection entitiesResult = documentsInPage.RecognizeEntitiesActionsResults.FirstOrDefault().Result;
595-
596-
ExtractKeyPhrasesResultCollection keyPhrasesResult = documentsInPage.ExtractKeyPhrasesActionsResults.FirstOrDefault().Result;
597-
598-
RecognizePiiEntitiesResultCollection piiResult = documentsInPage.RecognizePiiEntitiesActionsResults.FirstOrDefault().Result;
599-
600-
RecognizeLinkedEntitiesResultCollection linkedEntitiesResult = documentsInPage.RecognizeLinkedEntitiesActionsResults.FirstOrDefault().Result;
586+
IReadOnlyCollection<ExtractKeyPhrasesActionResult> keyPhrasesActionsResults = documentsInPage.ExtractKeyPhrasesActionsResults;
587+
IReadOnlyCollection<RecognizeEntitiesActionResult> entitiesActionsResults = documentsInPage.RecognizeEntitiesActionsResults;
588+
IReadOnlyCollection<RecognizePiiEntitiesActionResult> piiActionsResults = documentsInPage.RecognizePiiEntitiesActionsResults;
589+
IReadOnlyCollection<RecognizeLinkedEntitiesActionResult> entityLinkingActionsResults = documentsInPage.RecognizeLinkedEntitiesActionsResults;
590+
IReadOnlyCollection<AnalyzeSentimentActionResult> analyzeSentimentActionsResults = documentsInPage.AnalyzeSentimentActionsResults;
601591

602592
Console.WriteLine("Recognized Entities");
603-
604-
foreach (RecognizeEntitiesResult result in entitiesResult)
593+
int docNumber = 1;
594+
foreach (RecognizeEntitiesActionResult entitiesActionResults in entitiesActionsResults)
605595
{
606-
Console.WriteLine($" Recognized the following {result.Entities.Count} entities:");
607-
608-
foreach (CategorizedEntity entity in result.Entities)
596+
foreach (RecognizeEntitiesResult result in entitiesActionResults.Result)
609597
{
610-
Console.WriteLine($" Entity: {entity.Text}");
611-
Console.WriteLine($" Category: {entity.Category}");
612-
Console.WriteLine($" Offset: {entity.Offset}");
613-
Console.WriteLine($" Length: {entity.Length}");
614-
Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}");
615-
Console.WriteLine($" SubCategory: {entity.SubCategory}");
598+
Console.WriteLine($" Document #{docNumber++}");
599+
Console.WriteLine($" Recognized the following {result.Entities.Count} entities:");
600+
601+
foreach (CategorizedEntity entity in result.Entities)
602+
{
603+
Console.WriteLine($" Entity: {entity.Text}");
604+
Console.WriteLine($" Category: {entity.Category}");
605+
Console.WriteLine($" Offset: {entity.Offset}");
606+
Console.WriteLine($" Length: {entity.Length}");
607+
Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}");
608+
Console.WriteLine($" SubCategory: {entity.SubCategory}");
609+
}
610+
Console.WriteLine("");
616611
}
617-
Console.WriteLine("");
618612
}
619613

620614
Console.WriteLine("Recognized PII Entities");
621-
622-
foreach (RecognizePiiEntitiesResult result in piiResult)
615+
docNumber = 1;
616+
foreach (RecognizePiiEntitiesActionResult piiActionResults in piiActionsResults)
623617
{
624-
Console.WriteLine($" Recognized the following {result.Entities.Count} PII entities:");
625-
626-
foreach (PiiEntity entity in result.Entities)
618+
foreach (RecognizePiiEntitiesResult result in piiActionResults.Result)
627619
{
628-
Console.WriteLine($" Entity: {entity.Text}");
629-
Console.WriteLine($" Category: {entity.Category}");
630-
Console.WriteLine($" Offset: {entity.Offset}");
631-
Console.WriteLine($" Length: {entity.Length}");
632-
Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}");
633-
Console.WriteLine($" SubCategory: {entity.SubCategory}");
620+
Console.WriteLine($" Document #{docNumber++}");
621+
Console.WriteLine($" Recognized the following {result.Entities.Count} PII entities:");
622+
623+
foreach (PiiEntity entity in result.Entities)
624+
{
625+
Console.WriteLine($" Entity: {entity.Text}");
626+
Console.WriteLine($" Category: {entity.Category}");
627+
Console.WriteLine($" Offset: {entity.Offset}");
628+
Console.WriteLine($" Length: {entity.Length}");
629+
Console.WriteLine($" ConfidenceScore: {entity.ConfidenceScore}");
630+
Console.WriteLine($" SubCategory: {entity.SubCategory}");
631+
}
632+
Console.WriteLine("");
634633
}
635-
Console.WriteLine("");
636634
}
637635

638636
Console.WriteLine("Key Phrases");
639-
640-
foreach (ExtractKeyPhrasesResult result in keyPhrasesResult)
637+
docNumber = 1;
638+
foreach (ExtractKeyPhrasesActionResult keyPhrasesActionResult in keyPhrasesActionsResults)
641639
{
642-
Console.WriteLine($" Recognized the following {result.KeyPhrases.Count} Keyphrases:");
643-
644-
foreach (string keyphrase in result.KeyPhrases)
640+
foreach (ExtractKeyPhrasesResult result in keyPhrasesActionResult.Result)
645641
{
646-
Console.WriteLine($" {keyphrase}");
642+
Console.WriteLine($" Document #{docNumber++}");
643+
Console.WriteLine($" Recognized the following {result.KeyPhrases.Count} Keyphrases:");
644+
645+
foreach (string keyphrase in result.KeyPhrases)
646+
{
647+
Console.WriteLine($" {keyphrase}");
648+
}
649+
Console.WriteLine("");
647650
}
648-
Console.WriteLine("");
649651
}
650652

651653
Console.WriteLine("Recognized Linked Entities");
652-
653-
foreach (RecognizeLinkedEntitiesResult result in linkedEntitiesResult)
654+
docNumber = 1;
655+
foreach (RecognizeLinkedEntitiesActionResult linkedEntitiesActionResults in entityLinkingActionsResults)
654656
{
655-
Console.WriteLine($" Recognized the following {result.Entities.Count} linked entities:");
656-
657-
foreach (LinkedEntity entity in result.Entities)
657+
foreach (RecognizeLinkedEntitiesResult result in linkedEntitiesActionResults.Result)
658658
{
659-
Console.WriteLine($" Entity: {entity.Name}");
660-
Console.WriteLine($" DataSource: {entity.DataSource}");
661-
Console.WriteLine($" DataSource EntityId: {entity.DataSourceEntityId}");
662-
Console.WriteLine($" Language: {entity.Language}");
663-
Console.WriteLine($" DataSource Url: {entity.Url}");
664-
665-
Console.WriteLine($" Total Matches: {entity.Matches.Count()}");
666-
foreach (LinkedEntityMatch match in entity.Matches)
659+
Console.WriteLine($" Document #{docNumber++}");
660+
Console.WriteLine($" Recognized the following {result.Entities.Count} linked entities:");
661+
662+
foreach (LinkedEntity entity in result.Entities)
667663
{
668-
Console.WriteLine($" Match Text: {match.Text}");
669-
Console.WriteLine($" ConfidenceScore: {match.ConfidenceScore}");
670-
Console.WriteLine($" Offset: {match.Offset}");
671-
Console.WriteLine($" Length: {match.Length}");
664+
Console.WriteLine($" Entity: {entity.Name}");
665+
Console.WriteLine($" DataSource: {entity.DataSource}");
666+
Console.WriteLine($" DataSource EntityId: {entity.DataSourceEntityId}");
667+
Console.WriteLine($" Language: {entity.Language}");
668+
Console.WriteLine($" DataSource Url: {entity.Url}");
669+
670+
Console.WriteLine($" Total Matches: {entity.Matches.Count()}");
671+
foreach (LinkedEntityMatch match in entity.Matches)
672+
{
673+
Console.WriteLine($" Match Text: {match.Text}");
674+
Console.WriteLine($" ConfidenceScore: {match.ConfidenceScore}");
675+
Console.WriteLine($" Offset: {match.Offset}");
676+
Console.WriteLine($" Length: {match.Length}");
677+
}
678+
Console.WriteLine("");
672679
}
673680
Console.WriteLine("");
674681
}
675-
Console.WriteLine("");
682+
}
683+
684+
Console.WriteLine("Analyze Sentiment");
685+
docNumber = 1;
686+
foreach (AnalyzeSentimentActionResult analyzeSentimentActionsResult in analyzeSentimentActionsResults)
687+
{
688+
foreach (AnalyzeSentimentResult result in analyzeSentimentActionsResult.Result)
689+
{
690+
Console.WriteLine($" Document #{docNumber++}");
691+
Console.WriteLine($" Sentiment is {result.DocumentSentiment.Sentiment}, with confidence scores: ");
692+
Console.WriteLine($" Positive confidence score: {result.DocumentSentiment.ConfidenceScores.Positive}.");
693+
Console.WriteLine($" Neutral confidence score: {result.DocumentSentiment.ConfidenceScores.Neutral}.");
694+
Console.WriteLine($" Negative confidence score: {result.DocumentSentiment.ConfidenceScores.Negative}.");
695+
Console.WriteLine("");
696+
}
676697
}
677698
}
678699
}
@@ -746,7 +767,7 @@ Samples are provided for each main functional area, and for each area, samples a
746767
- [Recognize PII Entities][recognize_pii_entities_sample]
747768
- [Recognize Linked Entities][recognize_linked_entities_sample]
748769
- [Recognize Healthcare Entities][recognize_healthcare_sample]
749-
- [Run Analyze Operation][analyze_operation_sample]
770+
- [Run multiple actions][analyze_operation_sample]
750771

751772
### Advanced samples
752773
- [Analyze Sentiment with Opinion Mining][analyze_sentiment_opinion_mining_sample]

sdk/textanalytics/Azure.AI.TextAnalytics/api/Azure.AI.TextAnalytics.netstandard2.0.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public AnalyzeBatchActionsOptions() { }
3333
public partial class AnalyzeBatchActionsResult
3434
{
3535
internal AnalyzeBatchActionsResult() { }
36+
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.AnalyzeSentimentActionResult> AnalyzeSentimentActionsResults { get { throw null; } }
3637
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.ExtractKeyPhrasesActionResult> ExtractKeyPhrasesActionsResults { get { throw null; } }
3738
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.RecognizeEntitiesActionResult> RecognizeEntitiesActionsResults { get { throw null; } }
3839
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.RecognizeLinkedEntitiesActionResult> RecognizeLinkedEntitiesActionsResults { get { throw null; } }
@@ -78,10 +79,15 @@ internal AnalyzeHealthcareEntitiesResultCollection() : base (default(System.Coll
7879
public string ModelVersion { get { throw null; } }
7980
public Azure.AI.TextAnalytics.TextDocumentBatchStatistics Statistics { get { throw null; } }
8081
}
82+
public partial class AnalyzeSentimentActionResult : Azure.AI.TextAnalytics.TextAnalyticsActionDetails
83+
{
84+
internal AnalyzeSentimentActionResult() { }
85+
public Azure.AI.TextAnalytics.AnalyzeSentimentResultCollection Result { get { throw null; } }
86+
}
8187
public partial class AnalyzeSentimentOptions : Azure.AI.TextAnalytics.TextAnalyticsRequestOptions
8288
{
8389
public AnalyzeSentimentOptions() { }
84-
public bool IncludeOpinionMining { get { throw null; } set { } }
90+
public bool? IncludeOpinionMining { get { throw null; } set { } }
8591
}
8692
public partial class AnalyzeSentimentResult : Azure.AI.TextAnalytics.TextAnalyticsResult
8793
{
@@ -681,6 +687,7 @@ internal TextAnalyticsActionDetails() { }
681687
public partial class TextAnalyticsActions
682688
{
683689
public TextAnalyticsActions() { }
690+
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.AnalyzeSentimentOptions> AnalyzeSentimentOptions { get { throw null; } set { } }
684691
public string DisplayName { get { throw null; } set { } }
685692
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.ExtractKeyPhrasesOptions> ExtractKeyPhrasesOptions { get { throw null; } set { } }
686693
public System.Collections.Generic.IReadOnlyCollection<Azure.AI.TextAnalytics.RecognizeEntitiesOptions> RecognizeEntitiesOptions { get { throw null; } set { } }

sdk/textanalytics/Azure.AI.TextAnalytics/samples/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Azure Cognitive Services Text Analytics is a cloud service that provides advance
1919
* Personally Identifiable Information (PII) Recognition
2020
* Linked Entity Recognition
2121
* Healthcare Recognition
22+
* Running multiple actions in one or more documents
2223

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

0 commit comments

Comments
 (0)