File size: 3,068 Bytes
dc774cb
 
 
add78c0
f31c9ca
dc774cb
f31c9ca
 
dc774cb
 
 
 
add78c0
dc774cb
 
f31c9ca
 
 
 
233f1b4
dc774cb
 
 
 
 
 
 
 
 
f31c9ca
 
 
 
 
dc774cb
18f6c17
 
 
f31c9ca
add78c0
 
 
 
 
 
 
 
dc774cb
f31c9ca
5605e98
dc774cb
5605e98
dc774cb
 
f31c9ca
dc774cb
 
add78c0
dc774cb
add78c0
dc774cb
 
 
5605e98
 
 
 
 
add78c0
 
5605e98
f31c9ca
 
dc774cb
 
5605e98
18f6c17
f31c9ca
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
import gradio as gr
import pandas as pd
from transformers import pipeline
import matplotlib.pyplot as plt
from concurrent.futures import ThreadPoolExecutor

# Configurar el clasificador de sentimientos multiling眉e con un modelo m谩s peque帽o
classifier = pipeline(task="zero-shot-classification", model="typeform/distilbert-base-uncased-mnli")

# Funci贸n para analizar los sentimientos de una lista de textos
def analyze_sentiments(texts):
    if not texts:
        return "0.0%", "0.0%", "0.0%", None  # Manejar el caso donde no hay textos para analizar

    positive, negative, neutral = 0, 0, 0

    # Funci贸n para procesar un texto individualmente
    def process_text(text):
        nonlocal positive, negative, neutral
        results = classifier(text, ["positive", "negative", "neutral"], multi_label=True)
        mx = max(results['scores'])
        ind = results['scores'].index(mx)
        result = results['labels'][ind]
        if result == "positive":
            positive += 1
        elif result == "negative":
            negative += 1
        else:
            neutral += 1

    # Usar ThreadPoolExecutor para procesar textos en paralelo
    with ThreadPoolExecutor() as executor:
        executor.map(process_text, texts)

    total = len(texts)
    positive_percent = round((positive / total) * 100, 1)
    negative_percent = round((negative / total) * 100, 1)
    neutral_percent = round((neutral / total) * 100, 1)

    # Crear el gr谩fico circular
    fig, ax = plt.subplots()
    ax.pie([positive_percent, negative_percent, neutral_percent], labels=["Positivo", "Negativo", "Neutro"], autopct='%1.1f%%', colors=['green', 'red', 'blue'])
    plt.title("Distribuci贸n de Sentimientos")
    plt.savefig("sentiment_pie_chart.png")
    plt.close(fig)

    return f"{positive_percent}%", f"{negative_percent}%", f"{neutral_percent}%", "sentiment_pie_chart.png"

# Funci贸n para cargar el archivo CSV y analizar los primeros 50 comentarios
def analyze_sentiment_from_csv(file):
    try:
        df = pd.read_csv(file.name)
        if 'content' not in df.columns:
            raise ValueError("El archivo CSV no contiene una columna 'content'")
        texts = df['content'].head(50).tolist()  # Tomar solo los primeros 50 comentarios
        return analyze_sentiments(texts)
    except pd.errors.ParserError as e:
        return f"Error al analizar el archivo CSV: {e}", "", "", None
    except Exception as e:
        return f"Error inesperado: {e}", "", "", None

# Configurar la interfaz de Gradio
demo = gr.Interface(
    fn=analyze_sentiment_from_csv,
    inputs=gr.File(file_count="single", label="Sube tu archivo CSV"),  # Permitir la carga del archivo CSV
    outputs=[
        gr.Textbox(label="Porcentaje Positivo"),
        gr.Textbox(label="Porcentaje Negativo"),
        gr.Textbox(label="Porcentaje Neutro"),
        gr.Image(type="filepath", label="Gr谩fico de Sentimientos")
    ],
    title="Analizador de Sentimientos V.2",
    description="Porcentaje de comentarios positivos, negativos y neutrales"
)

demo.launch(share=True)