# ===== 1. TRATAMENTO DE EXCEÇÕES =====
def processar_dados_com_excecoes():
try:
# Diferentes tipos de erro
valor = int("abc") # ValueError
resultado = 10 / 0 # ZeroDivisionError
numero = "texto" + 5 # TypeError
except ValueError as e:
print(f"Erro de valor: insira um número válido. Detalhes: {e}")
except ZeroDivisionError:
print("Erro: divisão por zero não permitida")
except TypeError:
print("Erro de tipo: verifique os tipos de dados")
except Exception as e:
print(f"Erro inesperado: {e}")
finally:
print("Processamento finalizado\n")
processar_dados_com_excecoes()
# ===== 2. FILTRAGEM E MANIPULAÇÃO DE DADOS =====
# Criar DataFrame com resenhas
resenhas_data = {
'id': [1, 2, 3, 4, 5],
'texto': [
'Produto excelente, muito bom',
'Péssimo, não recomendo',
'Ótima qualidade',
'Decepcionante, falhas graves',
'Maravilhoso, superou expectativas'
],
'sentimento': [1, -1, 1, -1, 1]
}
df = pd.DataFrame(resenhas_data)
# Filtrar resenhas negativas
resenhas_negativas = df[df['sentimento'] == -1]['texto']
texto_unificado = ' | '.join(resenhas_negativas)
print(f"Resenhas negativas unificadas:\n{texto_unificado}\n")
# ===== 3. INTEGRAÇÃO COM LLM =====
client = Anthropic()
def analisar_resenhas_com_llm(texto_resenhas):
try:
prompt = f"""Analise as seguintes resenhas negativas e identifique APENAS UMA palavra para cada categoria solicitada.
Resenhas: {texto_resenhas}
Responda no formato: CATEGORIA1 CATEGORIA2 CATEGORIA3
Categorias: Principal_Problema Emoção_Predominante Recomendação_Ação
Limite: uma palavra por categoria."""
message = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=100,
messages=[
{"role": "user", "content": prompt}
]
)
return message.content[0].text
except Exception as e:
print(f"Erro ao conectar com LLM: {e}")
return None
# Análise de resenhas
resposta = analisar_resenhas_com_llm(texto_unificado)
if resposta:
categorias = resposta.strip().split()
print(f"Análise LLM: {resposta}")
print(f"Categorias extraídas: {categorias}\n")
# ===== 4. PROCESSAMENTO EM LOTE =====
def processar_resenhas_em_lote(dataframe, tamanho_lote=2):
try:
resultados = []
for i in range(0, len(dataframe), tamanho_lote):
lote = dataframe.iloc[i:i+tamanho_lote]
texto_lote = ' | '.join(lote['texto'].values)
try:
analise = analisar_resenhas_com_llm(texto_lote)
resultados.append({
'lote': i//tamanho_lote + 1,
'quantidade': len(lote),
'analise': analise
})
except Exception as e:
print(f"Erro no lote {i//tamanho_lote + 1}: {e}")
return pd.DataFrame(resultados)
finally:
print("Processamento em lote concluído")
# Executar processamento
df_resultados = processar_resenhas_em_lote(df)
print("Resultados do processamento em lote:")
print(df_resultados)
# ===== 5. EXTRAÇÃO E CONVERSÃO JSON =====
import json
def extrair_json_resenhas(dataframe):
try:
lista_json = []
for idx, row in dataframe.iterrows():
json_obj = {
"id": int(row['id']),
"texto": str(row['texto']),
"sentimento": int(row['sentimento'])
}
lista_json.append(json_obj)
# Converter para dicionários Python
dicts_python = json.loads(json.dumps(lista_json))
return dicts_python
except json.JSONDecodeError as e:
print(f"Erro ao processar JSON: {e}")
return []
finally:
print("Extração JSON finalizada")
resenhas_dict = extrair_json_resenhas(df)
print(f"\nResenhas como dicionários:\n{resenhas_dict[0]}")
::
Resumo da implementação:
- Exceções: Tratamento de ValueError, ZeroDivisionError, TypeError com blocos específicos
- Finally: Garante execução de limpeza
- Pandas: Filtro por sentimento negativo e extração de coluna
- Join: Unifica resenhas com delimitador ' | '
- LLM: API Anthropic com prompt estruturado
- Split: Converte resposta em lista
- Processamento em lote: Função que agrupa e analisa dados
- JSON: Conversão entre formatos