From b57599ce06536617077a7aeb28c290a1c8d83c23 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Mon, 3 Aug 2020 14:27:14 -0400 Subject: [PATCH 1/2] verify confidence scores add up to one --- .../tests/test_analyze_sentiment.py | 22 +++++++------------ .../tests/test_analyze_sentiment_async.py | 22 +++++++------------ .../azure-ai-textanalytics/tests/testcase.py | 9 ++++++++ 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/sdk/textanalytics/azure-ai-textanalytics/tests/test_analyze_sentiment.py b/sdk/textanalytics/azure-ai-textanalytics/tests/test_analyze_sentiment.py index 86c0681c2966..d4eeb38ad21c 100644 --- a/sdk/textanalytics/azure-ai-textanalytics/tests/test_analyze_sentiment.py +++ b/sdk/textanalytics/azure-ai-textanalytics/tests/test_analyze_sentiment.py @@ -45,7 +45,7 @@ def test_all_successful_passing_dict(self, client): for doc in response: self.assertIsNotNone(doc.id) self.assertIsNotNone(doc.statistics) - self.assertIsNotNone(doc.confidence_scores) + self.validateConfidenceScores(doc.confidence_scores) self.assertIsNotNone(doc.sentences) self.assertEqual(len(response[0].sentences), 1) @@ -72,7 +72,7 @@ def test_all_successful_passing_text_document_input(self, client): self.assertEqual(response[2].sentiment, "positive") for doc in response: - self.assertIsNotNone(doc.confidence_scores) + self.validateConfidenceScores(doc.confidence_scores) self.assertIsNotNone(doc.sentences) self.assertEqual(len(response[0].sentences), 1) @@ -589,18 +589,16 @@ def test_opinion_mining(self, client): aspect = mined_opinion.aspect self.assertEqual('design', aspect.text) self.assertEqual('positive', aspect.sentiment) - self.assertIsNotNone(aspect.confidence_scores.positive) self.assertEqual(0.0, aspect.confidence_scores.neutral) - self.assertIsNotNone(aspect.confidence_scores.negative) + self.validateConfidenceScores(aspect.confidence_scores) self.assertEqual(32, aspect.offset) self.assertEqual(6, aspect.length) sleek_opinion = mined_opinion.opinions[0] self.assertEqual('sleek', sleek_opinion.text) self.assertEqual('positive', sleek_opinion.sentiment) - self.assertIsNotNone(sleek_opinion.confidence_scores.positive) self.assertEqual(0.0, sleek_opinion.confidence_scores.neutral) - self.assertIsNotNone(sleek_opinion.confidence_scores.negative) + self.validateConfidenceScores(sleek_opinion.confidence_scores) self.assertEqual(9, sleek_opinion.offset) self.assertEqual(5, sleek_opinion.length) self.assertFalse(sleek_opinion.is_negated) @@ -608,9 +606,8 @@ def test_opinion_mining(self, client): premium_opinion = mined_opinion.opinions[1] self.assertEqual('premium', premium_opinion.text) self.assertEqual('positive', premium_opinion.sentiment) - self.assertIsNotNone(premium_opinion.confidence_scores.positive) self.assertEqual(0.0, premium_opinion.confidence_scores.neutral) - self.assertIsNotNone(premium_opinion.confidence_scores.negative) + self.validateConfidenceScores(premium_opinion.confidence_scores) self.assertEqual(15, premium_opinion.offset) self.assertEqual(7, premium_opinion.length) self.assertFalse(premium_opinion.is_negated) @@ -630,17 +627,15 @@ def test_opinion_mining_with_negated_opinion(self, client): self.assertEqual('food', food_aspect.text) self.assertEqual('negative', food_aspect.sentiment) - self.assertIsNotNone(food_aspect.confidence_scores.positive) self.assertEqual(0.0, food_aspect.confidence_scores.neutral) - self.assertIsNotNone(food_aspect.confidence_scores.negative) + self.validateConfidenceScores(food_aspect.confidence_scores) self.assertEqual(4, food_aspect.offset) self.assertEqual(4, food_aspect.length) self.assertEqual('service', service_aspect.text) self.assertEqual('negative', service_aspect.sentiment) - self.assertIsNotNone(service_aspect.confidence_scores.positive) self.assertEqual(0.0, service_aspect.confidence_scores.neutral) - self.assertIsNotNone(service_aspect.confidence_scores.negative) + self.validateConfidenceScores(service_aspect.confidence_scores) self.assertEqual(13, service_aspect.offset) self.assertEqual(7, service_aspect.length) @@ -650,9 +645,8 @@ def test_opinion_mining_with_negated_opinion(self, client): self.assertEqual('good', food_opinion.text) self.assertEqual('negative', food_opinion.sentiment) - self.assertIsNotNone(food_opinion.confidence_scores.positive) self.assertEqual(0.0, food_opinion.confidence_scores.neutral) - self.assertIsNotNone(food_opinion.confidence_scores.negative) + self.validateConfidenceScores(food_opinion.confidence_scores) self.assertEqual(28, food_opinion.offset) self.assertEqual(4, food_opinion.length) self.assertTrue(food_opinion.is_negated) diff --git a/sdk/textanalytics/azure-ai-textanalytics/tests/test_analyze_sentiment_async.py b/sdk/textanalytics/azure-ai-textanalytics/tests/test_analyze_sentiment_async.py index b6151ac14ff9..151623705308 100644 --- a/sdk/textanalytics/azure-ai-textanalytics/tests/test_analyze_sentiment_async.py +++ b/sdk/textanalytics/azure-ai-textanalytics/tests/test_analyze_sentiment_async.py @@ -61,7 +61,7 @@ async def test_all_successful_passing_dict(self, client): for doc in response: self.assertIsNotNone(doc.id) self.assertIsNotNone(doc.statistics) - self.assertIsNotNone(doc.confidence_scores) + self.validateConfidenceScores(doc.confidence_scores) self.assertIsNotNone(doc.sentences) self.assertEqual(len(response[0].sentences), 1) @@ -88,7 +88,7 @@ async def test_all_successful_passing_text_document_input(self, client): self.assertEqual(response[2].sentiment, "positive") for doc in response: - self.assertIsNotNone(doc.confidence_scores) + self.validateConfidenceScores(doc.confidence_scores) self.assertIsNotNone(doc.sentences) self.assertEqual(len(response[0].sentences), 1) @@ -605,18 +605,16 @@ async def test_opinion_mining(self, client): aspect = mined_opinion.aspect self.assertEqual('design', aspect.text) self.assertEqual('positive', aspect.sentiment) - self.assertIsNotNone(aspect.confidence_scores.positive) self.assertEqual(0.0, aspect.confidence_scores.neutral) - self.assertIsNotNone(aspect.confidence_scores.negative) + self.validateConfidenceScores(aspect.confidence_scores) self.assertEqual(32, aspect.offset) self.assertEqual(6, aspect.length) sleek_opinion = mined_opinion.opinions[0] self.assertEqual('sleek', sleek_opinion.text) self.assertEqual('positive', sleek_opinion.sentiment) - self.assertIsNotNone(sleek_opinion.confidence_scores.positive) self.assertEqual(0.0, sleek_opinion.confidence_scores.neutral) - self.assertIsNotNone(sleek_opinion.confidence_scores.negative) + self.validateConfidenceScores(sleek_opinion.confidence_scores) self.assertEqual(9, sleek_opinion.offset) self.assertEqual(5, sleek_opinion.length) self.assertFalse(sleek_opinion.is_negated) @@ -624,9 +622,8 @@ async def test_opinion_mining(self, client): premium_opinion = mined_opinion.opinions[1] self.assertEqual('premium', premium_opinion.text) self.assertEqual('positive', premium_opinion.sentiment) - self.assertIsNotNone(premium_opinion.confidence_scores.positive) self.assertEqual(0.0, premium_opinion.confidence_scores.neutral) - self.assertIsNotNone(premium_opinion.confidence_scores.negative) + self.validateConfidenceScores(premium_opinion.confidence_scores) self.assertEqual(15, premium_opinion.offset) self.assertEqual(7, premium_opinion.length) self.assertFalse(premium_opinion.is_negated) @@ -646,17 +643,15 @@ async def test_opinion_mining_with_negated_opinion(self, client): self.assertEqual('food', food_aspect.text) self.assertEqual('negative', food_aspect.sentiment) - self.assertIsNotNone(food_aspect.confidence_scores.positive) self.assertEqual(0.0, food_aspect.confidence_scores.neutral) - self.assertIsNotNone(food_aspect.confidence_scores.negative) + self.validateConfidenceScores(food_aspect.confidence_scores) self.assertEqual(4, food_aspect.offset) self.assertEqual(4, food_aspect.length) self.assertEqual('service', service_aspect.text) self.assertEqual('negative', service_aspect.sentiment) - self.assertIsNotNone(service_aspect.confidence_scores.positive) self.assertEqual(0.0, service_aspect.confidence_scores.neutral) - self.assertIsNotNone(service_aspect.confidence_scores.negative) + self.validateConfidenceScores(service_aspect.confidence_scores) self.assertEqual(13, service_aspect.offset) self.assertEqual(7, service_aspect.length) @@ -666,9 +661,8 @@ async def test_opinion_mining_with_negated_opinion(self, client): self.assertEqual('good', food_opinion.text) self.assertEqual('negative', food_opinion.sentiment) - self.assertIsNotNone(food_opinion.confidence_scores.positive) self.assertEqual(0.0, food_opinion.confidence_scores.neutral) - self.assertIsNotNone(food_opinion.confidence_scores.negative) + self.validateConfidenceScores(food_opinion.confidence_scores) self.assertEqual(28, food_opinion.offset) self.assertEqual(4, food_opinion.length) self.assertTrue(food_opinion.is_negated) diff --git a/sdk/textanalytics/azure-ai-textanalytics/tests/testcase.py b/sdk/textanalytics/azure-ai-textanalytics/tests/testcase.py index d8adc379b490..c91d1bf1e3cb 100644 --- a/sdk/textanalytics/azure-ai-textanalytics/tests/testcase.py +++ b/sdk/textanalytics/azure-ai-textanalytics/tests/testcase.py @@ -56,11 +56,20 @@ def assertOpinionsEqual(self, opinion_one, opinion_two): self.assertEqual(opinion_one.confidence_scores.positive, opinion_two.confidence_scores.positive) self.assertEqual(opinion_one.confidence_scores.neutral, opinion_two.confidence_scores.neutral) self.assertEqual(opinion_one.confidence_scores.negative, opinion_two.confidence_scores.negative) + self.validateConfidenceScores(opinion_one.confidence_scores) self.assertEqual(opinion_one.offset, opinion_two.offset) self.assertEqual(opinion_one.length, opinion_two.length) self.assertEqual(opinion_one.text, opinion_two.text) self.assertEqual(opinion_one.is_negated, opinion_two.is_negated) + def validateConfidenceScores(self, confidence_scores): + self.assertIsNotNone(confidence_scores.positive) + self.assertIsNotNone(confidence_scores.neutral) + self.assertIsNotNone(confidence_scores.negative) + self.assertEqual( + confidence_scores.positive + confidence_scores.neutral + confidence_scores.negative, 1 + ) + class GlobalResourceGroupPreparer(AzureMgmtPreparer): def __init__(self): From e036ca45ba1dfd95c9b779a3ce7cdaf80017c749 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Mon, 3 Aug 2020 14:27:26 -0400 Subject: [PATCH 2/2] fix bug where neutral was always 0.0 --- .../azure-ai-textanalytics/azure/ai/textanalytics/_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/textanalytics/azure-ai-textanalytics/azure/ai/textanalytics/_models.py b/sdk/textanalytics/azure-ai-textanalytics/azure/ai/textanalytics/_models.py index 514d47de45ac..5f6f4028ad01 100644 --- a/sdk/textanalytics/azure-ai-textanalytics/azure/ai/textanalytics/_models.py +++ b/sdk/textanalytics/azure-ai-textanalytics/azure/ai/textanalytics/_models.py @@ -910,7 +910,7 @@ def __init__(self, **kwargs): def _from_generated(cls, score): return cls( positive=score.positive, - neutral=score.neutral if hasattr(score, "netural") else 0.0, + neutral=score.neutral if hasattr(score, "neutral") else 0.0, negative=score.negative )