Pular para o conteúdo principal

Desafio 31: Text Analytics - Frases-chave, Entidades, Sentimento

Tempo Estimado

45 min | Custo: $1-3 (estimado) | Domínio: Implementar Soluções de NLP (15-20%)

Habilidades do exame abordadas

  • Extrair frases-chave de texto
  • Reconhecer entidades nomeadas e entidades vinculadas
  • Determinar sentimento com mineração de opinião
  • Detectar idioma

Visão Geral

O Azure AI Language (Text Analytics) fornece capacidades de NLP:

RecursoDescrição
Análise de SentimentoPositivo/neutro/negativo com confiança + mineração de opinião
Extração de Frases-chaveIdentificar os principais pontos de discussão
Reconhecimento de Entidades Nomeadas (NER)Detectar entidades (Pessoa, Local, Organização, DateTime, etc.)
Vinculação de EntidadesVincular entidades à base de conhecimento da Wikipedia
Detecção de IdiomaIdentificar o idioma do texto

O cliente suporta operações em lote — envie múltiplos documentos em uma única requisição para eficiência.

Pré-requisitos

  • Assinatura do Azure
  • Recurso Azure AI Language (ou multi-serviço)
  • Python 3.9+ ou .NET 8
  • Pacote: azure-ai-textanalytics (v5.3+)

Implementação

Tarefa 1: Criar Recurso de Language

az group create --name rg-ai102-nlp --location eastus2

az cognitiveservices account create \
--name language-ai102 \
--resource-group rg-ai102-nlp \
--kind TextAnalytics \
--sku S \
--location eastus2

ENDPOINT=$(az cognitiveservices account show --name language-ai102 --resource-group rg-ai102-nlp --query properties.endpoint -o tsv)
KEY=$(az cognitiveservices account keys list --name language-ai102 --resource-group rg-ai102-nlp --query key1 -o tsv)

Tarefa 2: Analisar Sentimento com Mineração de Opinião

import os
from azure.ai.textanalytics import TextAnalyticsClient
from azure.core.credentials import AzureKeyCredential

client = TextAnalyticsClient(
endpoint=os.environ["AZURE_AI_ENDPOINT"],
credential=AzureKeyCredential(os.environ["AZURE_AI_KEY"])
)

documents = [
"The hotel room was clean and spacious, but the service was slow and unfriendly.",
"I absolutely love this product! Fast delivery and excellent quality.",
"The meeting was scheduled for 3 PM."
]

# Sentiment analysis with opinion mining
results = client.analyze_sentiment(
documents,
show_opinion_mining=True,
language="en"
)

for idx, result in enumerate(results):
if result.is_error:
print(f"Doc {idx}: Error - {result.error.message}")
continue

print(f"Document {idx}: '{documents[idx][:50]}...'")
print(f" Overall: {result.sentiment} "
f"(pos={result.confidence_scores.positive:.3f}, "
f"neu={result.confidence_scores.neutral:.3f}, "
f"neg={result.confidence_scores.negative:.3f})")

for sentence in result.sentences:
print(f" Sentence: '{sentence.text[:40]}...' → {sentence.sentiment}")

# Opinion mining - aspect-based sentiment
for mined_opinion in sentence.mined_opinions:
target = mined_opinion.target
print(f" Target: '{target.text}' ({target.sentiment})")
for assessment in mined_opinion.assessments:
print(f" Assessment: '{assessment.text}' ({assessment.sentiment})")
print()

Tarefa 3: Extrair Frases-chave e Entidades Nomeadas

documents = [
"Microsoft CEO Satya Nadella announced Azure AI updates at the Build 2024 conference in Seattle on May 21.",
"The quarterly revenue increased by 15% to $62 billion, driven by cloud services growth."
]

# Key phrase extraction
key_phrases_results = client.extract_key_phrases(documents, language="en")
print("=== KEY PHRASES ===")
for idx, result in enumerate(key_phrases_results):
if not result.is_error:
print(f"Doc {idx}: {result.key_phrases}")

# Named Entity Recognition
ner_results = client.recognize_entities(documents, language="en")
print("\n=== NAMED ENTITIES ===")
for idx, result in enumerate(ner_results):
if not result.is_error:
print(f"Doc {idx}:")
for entity in result.entities:
print(f" '{entity.text}' → {entity.category}"
f"{f'/{entity.subcategory}' if entity.subcategory else ''}"
f" (confidence: {entity.confidence_score:.3f})")

# Entity Linking (to Wikipedia)
linked_results = client.recognize_linked_entities(documents, language="en")
print("\n=== LINKED ENTITIES ===")
for idx, result in enumerate(linked_results):
if not result.is_error:
for entity in result.entities:
print(f" '{entity.name}' → {entity.url}")
print(f" Data source: {entity.data_source}, ID: {entity.data_source_entity_id}")

Tarefa 4: Detecção de Idioma

# Language detection
multilingual_docs = [
"Hello, how are you today?",
"Bonjour, comment allez-vous?",
"こんにちは、元気ですか?",
"Hola, ¿cómo estás?"
]

lang_results = client.detect_language(multilingual_docs)
print("=== LANGUAGE DETECTION ===")
for idx, result in enumerate(lang_results):
if not result.is_error:
lang = result.primary_language
print(f" '{multilingual_docs[idx][:30]}...' → {lang.name} ({lang.iso6391_name}) "
f"confidence: {lang.confidence_score:.3f}")

Saída Esperada

Document 0: 'The hotel room was clean and spacious, but the s...'
Overall: mixed (pos=0.450, neu=0.100, neg=0.450)
Sentence: 'The hotel room was clean and sp...' → mixed
Target: 'room' (positive)
Assessment: 'clean' (positive)
Assessment: 'spacious' (positive)
Target: 'service' (negative)
Assessment: 'slow' (negative)
Assessment: 'unfriendly' (negative)

=== KEY PHRASES ===
Doc 0: ['Microsoft CEO Satya Nadella', 'Azure AI updates', 'Build 2024 conference', 'Seattle']

=== NAMED ENTITIES ===
Doc 0:
'Microsoft' → Organization (confidence: 0.990)
'Satya Nadella' → Person (confidence: 0.985)
'Azure AI' → Product (confidence: 0.920)
'Build 2024' → Event (confidence: 0.880)
'Seattle' → Location (confidence: 0.995)
'May 21' → DateTime/Date (confidence: 0.970)

=== LANGUAGE DETECTION ===
'Hello, how are you today?...' → English (en) confidence: 1.000
'Bonjour, comment allez-vous?...' → French (fr) confidence: 1.000
'こんにちは、元気ですか?...' → Japanese (ja) confidence: 1.000
'Hola, ¿cómo estás?...' → Spanish (es) confidence: 1.000

Quebra & conserta

CenárioSintomaCausa RaizCorreção
Resultados mistos em texto claroSentimento mixed inesperadoMineração de opinião detecta opiniões opostasUse sentimento no nível da sentença para granularidade
Frases-chave vaziasNenhuma frase retornadaTexto muito curto ou genéricoForneça texto substancial (10+ palavras recomendado)
Categoria de entidade UnknownEntidades não reconhecidasTermos específicos de domínio não estão no modeloUse modelo NER personalizado para entidades especializadas
Erro em lote em um docInvalidDocument nos resultadosDocumento excede 5.120 caracteresDivida documentos longos; verifique is_error por documento
Detecção de idioma erradaIdioma incorretoTexto em múltiplos idiomas confunde a detecçãoSepare texto por idioma; use amostras mais longas

Verificação de Conhecimento

1. O que a mineração de opinião adiciona à análise de sentimento padrão?

2. Qual é o tamanho máximo de documento para uma única requisição de text analytics?

3. Qual é a diferença entre Named Entity Recognition (NER) e Entity Linking?

4. Como você deve lidar com erros em resultados de text analytics em lote?

5. Qual formato de pontuação de confiança a detecção de idioma retorna?

Limpeza

az group delete --name rg-ai102-nlp --yes --no-wait

Saiba Mais