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()