4 min read
Analyzing Text with Azure Cognitive Services Text Analytics
Understanding customer sentiment and extracting insights from text data has become crucial, especially with the increase in digital communication during the pandemic. Azure Cognitive Services Text Analytics provides powerful NLP capabilities without requiring ML expertise.
Features Available
Text Analytics currently offers:
- Sentiment Analysis - Detect positive, negative, or neutral sentiment
- Key Phrase Extraction - Identify main talking points
- Language Detection - Identify the language of input text
- Named Entity Recognition - Extract entities like people, places, organizations
Setting Up the Service
# Create a Cognitive Services resource
az cognitiveservices account create \
--name text-analytics-demo \
--resource-group rg-cognitive \
--kind TextAnalytics \
--sku S \
--location australiaeast \
--yes
# Get the key
az cognitiveservices account keys list \
--name text-analytics-demo \
--resource-group rg-cognitive
Using the .NET SDK
dotnet add package Azure.AI.TextAnalytics
Sentiment Analysis
using Azure;
using Azure.AI.TextAnalytics;
public class TextAnalyticsService
{
private readonly TextAnalyticsClient _client;
public TextAnalyticsService(string endpoint, string key)
{
var credentials = new AzureKeyCredential(key);
_client = new TextAnalyticsClient(new Uri(endpoint), credentials);
}
public async Task<SentimentResult> AnalyzeSentimentAsync(string text)
{
var response = await _client.AnalyzeSentimentAsync(text);
var sentiment = response.Value;
return new SentimentResult
{
Sentiment = sentiment.Sentiment.ToString(),
PositiveScore = sentiment.ConfidenceScores.Positive,
NeutralScore = sentiment.ConfidenceScores.Neutral,
NegativeScore = sentiment.ConfidenceScores.Negative,
Sentences = sentiment.Sentences.Select(s => new SentenceSentiment
{
Text = s.Text,
Sentiment = s.Sentiment.ToString()
}).ToList()
};
}
}
public class SentimentResult
{
public string Sentiment { get; set; }
public double PositiveScore { get; set; }
public double NeutralScore { get; set; }
public double NegativeScore { get; set; }
public List<SentenceSentiment> Sentences { get; set; }
}
public class SentenceSentiment
{
public string Text { get; set; }
public string Sentiment { get; set; }
}
Batch Processing
For efficiency, process multiple documents in batches:
public async Task<List<SentimentResult>> AnalyzeBatchAsync(List<string> documents)
{
var response = await _client.AnalyzeSentimentBatchAsync(documents);
return response.Value
.Where(r => !r.HasError)
.Select(r => new SentimentResult
{
Sentiment = r.DocumentSentiment.Sentiment.ToString(),
PositiveScore = r.DocumentSentiment.ConfidenceScores.Positive,
NeutralScore = r.DocumentSentiment.ConfidenceScores.Neutral,
NegativeScore = r.DocumentSentiment.ConfidenceScores.Negative
})
.ToList();
}
Key Phrase Extraction
public async Task<List<string>> ExtractKeyPhrasesAsync(string text)
{
var response = await _client.ExtractKeyPhrasesAsync(text);
return response.Value.ToList();
}
// Example usage
var text = "Azure Cognitive Services provides AI capabilities for developers. " +
"The Text Analytics API offers sentiment analysis and key phrase extraction.";
var keyPhrases = await service.ExtractKeyPhrasesAsync(text);
// Returns: ["Azure Cognitive Services", "AI capabilities", "developers",
// "Text Analytics API", "sentiment analysis", "key phrase extraction"]
Named Entity Recognition
public async Task<List<EntityResult>> RecognizeEntitiesAsync(string text)
{
var response = await _client.RecognizeEntitiesAsync(text);
return response.Value.Select(e => new EntityResult
{
Text = e.Text,
Category = e.Category.ToString(),
SubCategory = e.SubCategory,
ConfidenceScore = e.ConfidenceScore
}).ToList();
}
public class EntityResult
{
public string Text { get; set; }
public string Category { get; set; }
public string SubCategory { get; set; }
public double ConfidenceScore { get; set; }
}
Language Detection
public async Task<DetectedLanguage> DetectLanguageAsync(string text)
{
var response = await _client.DetectLanguageAsync(text);
var language = response.Value;
return new DetectedLanguage
{
Name = language.Name,
IsoCode = language.Iso6391Name,
ConfidenceScore = language.ConfidenceScore
};
}
Practical Application: Customer Feedback Analysis
public class FeedbackAnalyzer
{
private readonly TextAnalyticsService _textAnalytics;
public async Task<FeedbackAnalysis> AnalyzeFeedbackAsync(string feedback)
{
var sentimentTask = _textAnalytics.AnalyzeSentimentAsync(feedback);
var keyPhrasesTask = _textAnalytics.ExtractKeyPhrasesAsync(feedback);
var entitiesTask = _textAnalytics.RecognizeEntitiesAsync(feedback);
await Task.WhenAll(sentimentTask, keyPhrasesTask, entitiesTask);
return new FeedbackAnalysis
{
OriginalText = feedback,
Sentiment = sentimentTask.Result,
KeyPhrases = keyPhrasesTask.Result,
Entities = entitiesTask.Result
};
}
}
Pricing Considerations
Text Analytics uses a tiered pricing model based on text records. The free tier allows 5,000 transactions per month, making it suitable for development and small-scale applications.
Text Analytics provides accessible AI capabilities that can add significant value to applications dealing with customer feedback, support tickets, or any text-heavy data.