File size: 3,065 Bytes
4f6c2c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
90
91
92
93
94
95
96
97
98
99
import gradio as gr
from transformers import (
    pipeline,
    AutoModelForSequenceClassification,
    AutoTokenizer
)
import torch
import numpy as np

# Configurar el dispositivo
device = "cuda" if torch.cuda.is_available() else "cpu"

# === CONFIGURACIÓN DEL CHATBOT ===
chat_generator = pipeline(
    'text-generation',
    model='microsoft/DialoGPT-small',
    device=device
)

# === CONFIGURACIÓN DEL ANALIZADOR DE SENTIMIENTOS ===
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
sentiment_tokenizer = AutoTokenizer.from_pretrained(model_name)
sentiment_model = AutoModelForSequenceClassification.from_pretrained(model_name)
sentiment_model.to(device)

def chatbot(mensaje):
    if not mensaje.strip():
        return "Por favor, escribe un mensaje.", None, None

    try:
        # Generar respuesta del chatbot
        respuesta = chat_generator(
            mensaje,
            max_length=100,
            temperature=0.7,
            do_sample=True,
            top_p=0.95,
            num_return_sequences=1
        )[0]['generated_text']

        respuesta = respuesta.replace(mensaje, "").strip()

        # Analizar sentimiento del mensaje del usuario
        inputs = sentiment_tokenizer(mensaje, return_tensors="pt", truncation=True,
                                   max_length=512, padding=True)
        inputs = {k: v.to(device) for k, v in inputs.items()}

        outputs = sentiment_model(**inputs)
        predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
        rating = torch.argmax(predictions).item() + 1
        confidence = predictions[0][rating-1].item()

        if rating <= 2:
            sentimiento = "Muy Negativo"
        elif rating == 3:
            sentimiento = "Neutral"
        elif rating == 4:
            sentimiento = "Positivo"
        else:
            sentimiento = "Muy Positivo"

        sentimiento_completo = f"{sentimiento} ({rating} estrellas)"
        confianza = round(confidence * 100, 2)

        return respuesta, sentimiento_completo, confianza

    except Exception as e:
        return f"Error: {str(e)}", "Error en el análisis", 0.0

# Crear la interfaz
demo = gr.Interface(
    fn=chatbot,
    inputs=[
        gr.Textbox(
            placeholder="Escribe tu mensaje...",
            label="Mensaje",
            lines=3
        )
    ],
    outputs=[
        gr.Textbox(label="Respuesta del Chatbot"),
        gr.Label(label="Sentimiento de tu mensaje"),
        gr.Number(label="Confianza del análisis (%)")
    ],
    title="Chatbot con Análisis de Sentimientos",
    description="Un chatbot que responde a tus mensajes y analiza el sentimiento de lo que escribes",
    examples=[
        ["¡Estoy muy feliz hoy!"],
        ["No me gusta nada este servicio, es terrible."],
        ["El día está normal, nada especial que contar."],
        ["¡Me encanta hablar contigo!"],
        ["Estoy un poco decepcionado con los resultados."]
    ],
    allow_flagging="never",
    cache_examples=True
)

# Lanzar la interfaz
demo.launch(share=True, debug=True)