Solucionado (ver solução)

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!

Solucionado
(ver solução)
2
respostas

[Projeto] Desafio Final minha solução simplificada

import re
import json
import pandas as pd
from openai import OpenAI

OLLAMA_HOST = "http://localhost:11434/v1"
def limpar_json(texto_bruto):
    match = re.search(r"```json\s*(.*?)\s*```", texto_bruto, re.DOTALL)
   
    if match:
        return match.group(1)
    return ""  


def processar_resenhas_com_pandas(lista_resenhas, separador="\n---\n"):
    df = pd.DataFrame(lista_resenhas)
    
    contagem = df['avaliacao'].value_counts().reindex(['positiva', 'negativa', 'neutra'], fill_value=0)

    df['formatado'] = "usuario:" + df['usuario'] + "\n" + "resenha_original:" + df['resenha_original'] + "\n" + "resenha_pt:" + df['resenha_pt'] + "\n" + "avaliacao:" + df['avaliacao']
    resenhas_unidas = df['formatado'].str.cat(sep=separador)
    
    return contagem.to_dict(), resenhas_unidas


def main():
   
    #Etapa 1
    lista_resenhas = []
    with open("Resenhas_App_ChatGPT.txt", "r", encoding="utf-8") as arquivo:
        for linha in arquivo:
            lista_resenhas.append(linha.strip())
    
    print(f"\nTotal de resenhas: {len(lista_resenhas)}")
    print("-" * 30)
    print("\n")
    
    for i, resenha in enumerate(lista_resenhas):
        print(f"{i+1} - {resenha}")

    #Etapa 2
    client = OpenAI(
        api_key="ollama",  # O Ollama não exige uma chave real
        base_url=OLLAMA_HOST
    )

    lista_resenhas_str = "#####".join(lista_resenhas)  

    resposta_do_llm = client.chat.completions.create(
        model="gemma4:e4b", # Certifique-se de que este modelo já foi baixado (ollama pull gemma4:e4b)
        messages=[
            {"role":"system", "content":"Você é um analista de dados sênior e irá fazer analise de sentimentos e retornar dados estruturados em JSON."},
            {"role":"user", "content":f""" Vou te passar muitas resenhas Positivas, Neutras e Negativas em vários idiomas diferentes elas se referem ao um produto digital. 
             Cada resenha esta separada por ##### e cada resenha tem um id separad por $ seguido de nome de usuário sepárado $ e seguida da resenha em inglês, outras em espanhol, outras em português, outras em francês e assim por diante. 
            
            Quero que você avalie cada resenha em uma das seguintes categorias: positiva, neutra ou negativa.
            por APENAS uma palavra, cada categoria deve estar em letra minúscula e sem acentos gráficos no campor avaliacao. 
            
            - Depois quero que você RETORNE como resposta um texto no formato JSON, contendo três chaves, onde um dos campos
            é a avaliacao e você deve colocar a analise de sentimento feita neste campo:
              - O identificador do usuário que fez a resenha deve ser ignorado, ou seja, não deve aparecer no resultado final, mas o nome do usuário deve ser extraído e colocado no campo 'usuario' do json, se o nome do usuário não estiver presente na resenha, coloque 'desconecido' no campo 'usuario'.
              -'usuario': irá conter o nome do usuário que fez a resenha, se o nome do usuário não estiver presente na resenha, coloque 'desconecido'
              .'resenha_original': irá conter a resenha original que esta em qualquer idioma
              -'resenha_pt': irá conter a resenha original em portugu~es Brasileiro
              -'avaliacao': irá conter a avaliação da resenha, ou seja, se ela é positiva, neutra ou negativa, apenas uma palavra em letra minúscula e sem acentos gráficos, por exemplo: positiva, neutra ou negativa.
              - retorne um json com todas as resenhas avaliadas, a resenha original no campo resenha_original, a resenha traduzida para português do Brasil no campo resenha_pt, veja exemplo

              Exemplo:
              {
                {'usuario': 'João da silva'},
                {'resenha_original': 'I didn´t like de color of the product'},
                {'resenha_pt_br':'eu não gostei da cor deste produto'},
                {'avaliacao':'negativa'}

              }         
           
            Faça isso pra todas as resenhas que eu te enviar a seguir:{lista_resenhas_str}"""
             
             }
        ],
        temperature=0.8,
        )

    print(resposta_do_llm.choices[0].message.content)
    print("%" * 30)
    
    #etapa 3
    try:
        json_limpo = limpar_json(resposta_do_llm.choices[0].message.content)
        resposta_json = json.loads(json_limpo)
        
        print(resposta_json)

        #etapa 4
        contagem, texto_unido = processar_resenhas_com_pandas(resposta_json)

        print("Contagem:")
        print(contagem)
        print("\nResenhas Unidas:")
        print(texto_unido)

        print("\n" + "="*50 + "\n")
        print("Resenhas Processadas:")
        processar_resenhas_com_pandas(resposta_json)

    except json.JSONDecodeError:
        print("Erro ao decodificar a resposta do LLM.")

if __name__ == "__main__":
    main()
2 respostas

Olá, Marcelo! Como vai?

Parabéns pela realização da atividade!

Você conseguiu estruturar um fluxo completo de análise de sentimentos, integrou bem o uso do Pandas para organizar os dados e ainda aplicou uma lógica clara para limpar e processar o JSON retornado.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Validar entradas: garantir que as resenhas estejam sempre no formato esperado antes de enviar ao modelo.
  • Automatizar traduções: incluir uma etapa de fallback para traduções caso o modelo não retorne corretamente.
  • Explorar visualizações: usar gráficos com matplotlib ou seaborn para representar a distribuição das avaliações.

Ah uma pergunta: O que você gostaria de desenvolver mais agora, expandir esse pipeline para incluir visualizações interativas ou otimizar o processamento para lidar com grandes volumes de resenhas?

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, ótimas sugestões. Obrigado pelo feedback.

Eu depois que diz a limpeza com Expressões regulares, pensei que poderia fazer mais simples com um replace por vazio. Sim , eu vou fazer outros experimentos, melhorar e diminuir o prompt, fazer uma versão interativa, e processamento em lotes tem seu espaço, mas digamos que invés de processar todos, que seria um contexto e cenário, poderia processar com api acada entrada do usuário no sistema de resenha e guardar avaliação num banco de dados separado para posteriores analises ou minerar os dados.