File size: 6,042 Bytes
995cf05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import gradio as gr
from transformers import pipeline
import logging

# Configurar logging para ver información de Transformers (opcional, pero útil para depuración)
logging.basicConfig(level=logging.INFO)

# --- Funciones para las Pipelines de Transformers ---

def sentiment_analysis(text):
    try:
        classifier = pipeline("sentiment-analysis")
        result = classifier(text)
        return result
    except Exception as e:
        return str(e)

def text_generation(prompt, max_length=50):
    try:
        generator = pipeline("text-generation")
        result = generator(prompt, max_length=int(max_length), num_return_sequences=1)
        return result[0]['generated_text'] if result else "No text generated."
    except Exception as e:
        return str(e)

def zero_shot_classification(text, candidate_labels_str):
    try:
        candidate_labels = [label.strip() for label in candidate_labels_str.split(',')]
        if not candidate_labels or all(not label for label in candidate_labels):
            return "Por favor, ingresa etiquetas candidatas válidas separadas por comas."
        classifier = pipeline("zero-shot-classification")
        result = classifier(text, candidate_labels=candidate_labels)
        return result
    except Exception as e:
        return str(e)

def fill_mask(text_with_mask, top_k=2):
    try:
        unmasker = pipeline("fill-mask")
        result = unmasker(text_with_mask, top_k=int(top_k))
        return result
    except Exception as e:
        return str(e)

def named_entity_recognition(text):
    try:
        ner_pipeline = pipeline("ner", grouped_entities=True)
        result = ner_pipeline(text)
        return result
    except Exception as e:
        return str(e)

def summarization(text, min_length=30, max_length=130):
    try:
        summarizer = pipeline("summarization")
        result = summarizer(text, min_length=int(min_length), max_length=int(max_length), do_sample=False)
        return result[0]['summary_text'] if result else "No summary generated."
    except Exception as e:
        return str(e)

def translation_fr_en(text):
    try:
        translator = pipeline("translation", model="Helsinki-NLP/opus-mt-fr-en")
        result = translator(text)
        return result[0]['translation_text'] if result else "No translation."
    except Exception as e:
        return str(e)

# --- Creación de la Interfaz Gradio ---

with gr.Blocks(title="Demo de Transformers con Gradio") as demo:
    gr.Markdown("# Prueba varios modelos de Hugging Face Transformers")
    gr.Markdown("Recuerda: La primera vez que ejecutes una tarea, el modelo se descargará y puede tardar.")

    with gr.Tabs():
        with gr.TabItem("Análisis de Sentimiento"):
            with gr.Row():
                sa_input = gr.Textbox(label="Ingresa texto para análisis de sentimiento")
            sa_button = gr.Button("Analizar Sentimiento")
            sa_output = gr.JSON(label="Resultado del Análisis")
            sa_button.click(sentiment_analysis, inputs=sa_input, outputs=sa_output)

        with gr.TabItem("Generación de Texto"):
            with gr.Row():
                tg_input_prompt = gr.Textbox(label="Ingresa un prompt para iniciar la generación")
                tg_max_length = gr.Number(label="Longitud Máxima", value=50)
            tg_button = gr.Button("Generar Texto")
            tg_output = gr.Textbox(label="Texto Generado", lines=5)
            tg_button.click(text_generation, inputs=[tg_input_prompt, tg_max_length], outputs=tg_output)

        with gr.TabItem("Clasificación Zero-Shot"):
            with gr.Row():
                zsc_input_text = gr.Textbox(label="Texto a clasificar")
                zsc_input_labels = gr.Textbox(label="Etiquetas candidatas (separadas por comas)", placeholder="ej: educación, política, negocios")
            zsc_button = gr.Button("Clasificar (Zero-Shot)")
            zsc_output = gr.JSON(label="Resultado de la Clasificación")
            zsc_button.click(zero_shot_classification, inputs=[zsc_input_text, zsc_input_labels], outputs=zsc_output)

        with gr.TabItem("Rellenar Máscara (Fill-Mask)"):
            with gr.Row():
                fm_input_text = gr.Textbox(label="Texto con <mask> para rellenar", placeholder="This course will teach you all about <mask> models.")
                fm_top_k = gr.Number(label="Top K resultados", value=2)
            fm_button = gr.Button("Rellenar Máscara")
            fm_output = gr.JSON(label="Posibles Rellenos")
            fm_button.click(fill_mask, inputs=[fm_input_text, fm_top_k], outputs=fm_output)

        with gr.TabItem("Reconocimiento de Entidades Nombradas (NER)"):
            ner_input = gr.Textbox(label="Texto para NER")
            ner_button = gr.Button("Reconocer Entidades")
            ner_output = gr.JSON(label="Entidades Reconocidas")
            ner_button.click(named_entity_recognition, inputs=ner_input, outputs=ner_output)

        with gr.TabItem("Resumen de Texto (Summarization)"):
            with gr.Row():
                summ_input_text = gr.TextArea(label="Texto largo para resumir", lines=7)
            with gr.Row():
                summ_min_len = gr.Number(label="Longitud Mínima del Resumen", value=30)
                summ_max_len = gr.Number(label="Longitud Máxima del Resumen", value=130)
            summ_button = gr.Button("Generar Resumen")
            summ_output = gr.Textbox(label="Resumen Generado", lines=5)
            summ_button.click(summarization, inputs=[summ_input_text, summ_min_len, summ_max_len], outputs=summ_output)

        with gr.TabItem("Traducción (Francés a Inglés)"):
            tr_input_text = gr.Textbox(label="Texto en Francés para traducir a Inglés", placeholder="Ce cours est produit par Hugging Face.")
            tr_button = gr.Button("Traducir")
            tr_output = gr.Textbox(label="Texto Traducido (Inglés)")
            tr_button.click(translation_fr_en, inputs=tr_input_text, outputs=tr_output)

if __name__ == "__main__":
    demo.launch()