File size: 2,820 Bytes
0ccad8d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import pandas as pd
import gradio as gr
from openai import OpenAI
import os

# Inicializar cliente de OpenAI
client = OpenAI(api_key="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")

# Ruta del archivo de datos
csv_path = "datos/opiniones.csv"

# Crear el archivo si no existe
if not os.path.exists(csv_path):
    df = pd.DataFrame(columns=["opinion", "sentimiento"])
    df.to_csv(csv_path, index=False)
else:
    df = pd.read_csv(csv_path)

# Clasificaci贸n con GPT
def clasificar_con_gpt(opinion):
    prompt = f"""
Clasifica la siguiente opini贸n como positiva, negativa o neutral.

Opini贸n: "{opinion}"

Clasificaci贸n:
"""
    respuesta = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    clasificacion = respuesta.choices[0].message.content.strip().lower()
    
    # Asegurarse de que el resultado sea una etiqueta v谩lida
    if "positiva" in clasificacion:
        return "positivo"
    elif "negativa" in clasificacion:
        return "negativo"
    else:
        return "neutral"

# Respuesta contextual con GPT
def generar_respuesta(opinion, pregunta):
    prompt = f"""
Analiza la siguiente opini贸n de un cliente y responde a la pregunta usando solamente la informaci贸n proporcionada.

Opini贸n: "{opinion}"
Pregunta: "{pregunta}"

Respuesta basada exclusivamente en la opini贸n:
"""
    respuesta = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "Eres un asistente que responde con base en opiniones de clientes."},
            {"role": "user", "content": prompt}
        ]
    )
    return respuesta.choices[0].message.content.strip()

# Funci贸n principal de la interfaz
def interfaz(opinion, pregunta):
    global df

    # Revisar si la opini贸n ya existe
    if opinion in df["opinion"].values:
        sentimiento = df[df["opinion"] == opinion]["sentimiento"].values[0]
    else:
        # Clasificar con GPT
        sentimiento = clasificar_con_gpt(opinion)
        
        # Guardar en CSV
        nuevo = pd.DataFrame([[opinion, sentimiento]], columns=["opinion", "sentimiento"])
        df = pd.concat([df, nuevo], ignore_index=True)
        df.to_csv(csv_path, index=False)

    # Generar respuesta contextual
    respuesta = generar_respuesta(opinion, pregunta)

    return f"馃搳 Opini贸n clasificada como: {sentimiento}", respuesta

# Interfaz Gradio
gr.Interface(
    fn=interfaz,
    inputs=["text", "text"],
    outputs=["text", "text"],
    title="Analizador de Opiniones Inteligente",
    description="Clasifica y responde opiniones de clientes. Aprende autom谩ticamente si no conoce la opini贸n."
).launch()