Back to Blog
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.

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.