Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Desafio com Python e Pandas Classificação de Sentimento

Minha solução:

!wget https://cdn3.gnarususercontent.com.br/4790-python/reviews.csv
import os
import pandas as pd
from google.colab import userdata

# 1.Carregar o CSV
df_reviews = pd.read_csv("reviews.csv")
df_reviews.head()
df_reviews.columns.unique()
#2. LLM para clasificar o sentimento de cada feedback como Positivo, negativo ou neutro
!pip install -q groq

os.environ["GROQ_API_KEY"] = userdata.get('GROQ_API_KEY')

from groq import Groq

client = Groq()

def analisar_sentimento(frase: str) -> str:
    """
    Envia uma pergunta para a GenAI API e retorna 'resposta'.
    """
    try:
        completion = client.chat.completions.create(
            model="llama-3.3-70b-versatile",
            messages=[
                {
                    "role": "user",
                    "content": f"Analise o sentimento do review:: {frase} e retorne APENAS uma das palavras (Positivo, Neutro ou Negativo.)"
                }
            ],
            temperature=0.2,
            max_completion_tokens=10,
            stream=False, # stream desativado para receber a resposta pronta
        )

        # Captura o texto completo da resposta
        resposta = completion.choices[0].message.content.strip()
        
        # Retorna formatado
        return f"{resposta}"

    except Exception as e:
        return f"Erro ao processar: {e}"


#Escrever dataframe com nova coluna com a classificação da review
try:
    # 1. Aplica a função de sentimento e cria a nova coluna
    # Usamos o .apply() para percorrer a coluna de forma otimizada
    df_reviews['sentimento'] = df_reviews['reviewText'].apply(lambda x: analisar_sentimento(str(x).strip()))

    # 2. Exibe o resultado para conferência
    print("Processamento concluído com sucesso!")
    print(df_reviews[['reviewerID', 'reviewText', 'sentimento']].head())

    # 3. (Opcional) Salva o DataFrame completo com a nova coluna em um arquivo CSV
    df_reviews.to_csv('reviews_analisadas.csv', index=False, encoding='utf-8')

except Exception as e:
    print(f"Um erro ocorreu: {e}")
print(df_reviews[['reviewText', 'sentimento']].head())

Exemplo de saída:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

Olá, Marcelo! Como vai?

Parabéns pela resolução da atividade!

Vi que você explorou o pandas para manipular dados com Python, utilizou muito bem o apply para aplicar funções em colunas e ainda compreendeu a importância do try/except para tratar erros.

Continue postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Uma dica interessante para o futuro é otimizar o processo de classificação armazenando os resultados em cache:

sentimentos_cache = {}

def analisar_sentimento(frase: str) -> str:
    if frase in sentimentos_cache:
        return sentimentos_cache[frase]
    resposta = client.chat.completions.create(
        model="llama-3.3-70b-versatile",
        messages=[{"role": "user", "content": f"Analise o sentimento: {frase}"}],
        temperature=0.2,
        max_completion_tokens=10
    ).choices[0].message.content.strip()
    sentimentos_cache[frase] = resposta
    return resposta

Isso faz com que frases repetidas não precisem ser enviadas novamente para a API, economizando tempo e recursos.

Ah, uma pergunta: Você acha mais interessante otimizar o código com cache para reduzir chamadas à API ou investir em paralelização para acelerar o processamento de grandes volumes de dados?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

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

Olá Daniel, obrigado pelo feedback, a sugestão do cache é excelente, se fosse algo muito frequente, com muita repetição faz todo sentido economizar tokens, ainda mais nos dias de hoje, tokens cada vez mais caros, ou talvez até para otimizar um RAG, armazenar a pergunta e resposta e consultar antes no cache, seria um system design ótimo, eu faria isso com REDIS, por exemplo, em memória, pra ter performance. Sobre multiprocessamento talvez com um volume de dados muito grande, fosse interessante distribuir o processamento, caso a memória fosse escassa, por exemplo usando dask ou spark ou alguma ferramenta de processamento distribuído, depende do problema a ser resolvido, tamanho dos dados e o que deve ser processado. Então, em resumo:

  • Cache: para situações de chamada do LLM por exemplo um chatbot com muito assunto, pergunta ou resposta repetidos ou similares (RAG, busca por similaridade ou hibrido)
  • processamento distribuído, quando houverem muitos dados big data
  • dependendo do sistema e suas partes combinar as duas estratégias.

No contexto da nossa conversa aqui, essa é minha análise como engenheiro de software.