Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Desafio: Classificação de Sentimentos

#Carregar um arquivo .csv com feedback de clientes (reviews.csv)
import pandas as pd

df = pd.read_csv("reviews.csv")

#usar um LLM para classificar um sentimento de cada feedback(Positivo, Negativo, Neutro) e adicionar essa classificação ao DataFrame
import os
from google.colab import userdata
from groq import Groq
os.environ['GROQ_API_KEY'] = userdata.get('GROQ_API_KEY')

client = Groq()

#função para responder às perguntas usando a LLM gpt-oss-2
def classificar_sentimentos(series):
  print("\nClassificando os sentimentos das avaliações:")
  sentimentos = []
  max_retries = 5
  initial_delay = 5 # seconds

  for i, feedback in enumerate(series):
    retries = 0
    resposta_llm = "Não classificado" # Default value
    while retries < max_retries:
      try:
        completion = client.chat.completions.create(
          model="openai/gpt-oss-20b",
          messages=[
              {
              "role": "user",
              "content": "Analise o seguinte feedback e o classifique apenas em 'Positivo', 'Negativo' ou 'Neutro': " + feedback + "responda apenas com uma palavra"
              }
          ],
          temperature=0.5,
          max_completion_tokens=200,
          top_p=1,
          reasoning_effort="medium",
          stream=False,
          stop=None
        )
        llm_content = completion.choices[0].message.content.strip()
        if llm_content:
          resposta_llm = llm_content
        print(f"Avaliação{i+1}: {resposta_llm}\n") # Corrected index from 'index' to 'i'
        sentimentos.append(resposta_llm)
        break # Sai do loop de retry se a chamada for bem-sucedida
      except TooManyRequests as e:
        retries += 1
        wait_time = initial_delay * (2 ** (retries - 1)) # Exponential backoff
        print(f"\nERRO: Limite de requisições excedido. Tentando novamente em {wait_time} segundos. (Feedback {i+1} de {len(series)})\nDetalhes do erro: {e}\n")
        time.sleep(wait_time)
      except Exception as e:
        print(f"\nERRO inesperado ao processar o feedback '{feedback}'. Pulando para o próximo. Detalhes: {e}\n")
        sentimentos.append("Não classificado - Erro") # Add error indicator
        break # Sai do loop de retry para outros erros
    else:
      print(f"Não foi possível processar o feedback '{feedback}' após {max_retries} tentativas.\n")
      sentimentos.append("Não classificado - Limite de retries") # Add error indicator
  return sentimentos

#adicionando os sentimentos ao DataFrame
df['Sentimentos'] = classificar_sentimentos(df['reviewText'])
1 resposta

Oi, Paulo! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Gostei da forma como você estruturou a função para classificação dos sentimentos, incluindo tratamento de erros e a estratégia de retry com exponential backoff. Isso demonstra uma preocupação importante com a estabilidade da aplicação ao trabalhar com APIs de IA, além de integrar corretamente os resultados ao DataFrame com Pandas.

Uma dica interessante para o futuro é validar se o texto do feedback está vazio antes de enviar para o modelo. Veja este exemplo:


feedback = str(feedback).strip()

if feedback:
    print("texto valido")
else:
    print("texto vazio")

Esse código verifica se existe conteúdo válido antes da classificação, ajudando a evitar chamadas desnecessárias para a API.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!