Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM, BertForSequenceClassification, BertTokenizer | |
| # --- MODELO DE SENTIMIENTOS --- | |
| sentiment_tokenizer = BertTokenizer.from_pretrained("VerificadoProfesional/SaBERT-Spanish-Sentiment-Analysis") | |
| sentiment_model = BertForSequenceClassification.from_pretrained("VerificadoProfesional/SaBERT-Spanish-Sentiment-Analysis") | |
| sentiment_pipeline = pipeline("sentiment-analysis", model=sentiment_model, tokenizer=sentiment_tokenizer) | |
| # --- MODELO DE REESCRITURA GPT-2 --- | |
| rewrite_tokenizer = AutoTokenizer.from_pretrained("flax-community/gpt-2-spanish") | |
| rewrite_model = AutoModelForCausalLM.from_pretrained("flax-community/gpt-2-spanish") | |
| rewrite_pipeline = pipeline("text-generation", model=rewrite_model, tokenizer=rewrite_tokenizer) | |
| # --- FUNCIÓN PRINCIPAL --- | |
| def analizar_y_reescribir(tweet, max_retries=10): | |
| sentimiento = sentiment_pipeline(tweet)[0] | |
| etiqueta = sentimiento["label"] | |
| score = sentimiento["score"] | |
| reescritura = "" | |
| if etiqueta == "Negative": | |
| for intento in range(max_retries): | |
| prompt = f"Este es el tweet: {tweet}\nEscribe una respuesta positiva y motivadora:\n" | |
| resultado = rewrite_pipeline( | |
| prompt, | |
| max_new_tokens=60, | |
| do_sample=True, | |
| temperature=0.7, | |
| top_k=50, | |
| top_p=0.9, | |
| pad_token_id=rewrite_tokenizer.eos_token_id, | |
| return_full_text=False | |
| )[0]["generated_text"] | |
| reescritura = resultado.strip().split("\n")[0] | |
| # Revisar sentimiento de la propuesta | |
| senti2 = sentiment_pipeline(reescritura)[0] | |
| if senti2["label"] == "Positive": | |
| break | |
| else: | |
| reescritura = "No es necesario reescribir, el tweet ya es positivo o neutro." | |
| return f"{etiqueta} ({score:.2f})", reescritura | |
| # --- DOCUMENTACIÓN --- | |
| documentacion = """ | |
| # Documentación | |
| **Problema:** | |
| El problema que se quiere solucionar es buscar una medida para minimizar la toxicidad que se encuentra habitualmente en internet, sobretodo en redes sociales como twitter, Facebook, Instagram, etc. | |
| **Solución:** | |
| La solución que propongo es la de analizar los sentimientos de los distintos comentarios que se realizan, y al detectar comentarios negativos, se realice una recomendación de una frase más positiva. | |
| **Input esperado:** | |
| Texto corto en español, sin caracteres especiales ni emoticonos. | |
| **Output esperado:** | |
| -El sentimiento después del análisis que puede ser: Positive (Positivo), Neutro y Negative (Negativo). | |
| -Si de la frase del input ha salido en el análisis Positive, saldrá una frase de texto genérica, si en cambio el análisis da Negative, se va a entregar una frase generada de forma dinámica más positiva y motivadora. | |
| **Modelos usados:** | |
| -VerificadoProfesional/SaBERT-Spanish-Sentiment-Analysis: Este modelo es de Text Classification, ha sido entrenado con un dataset de 11.500 tweets en español de distintas regiones, está basado en BERT y clasifica texto en tres categorías distintas: Positive (Positivo), Neutro y Negative (Negativo). | |
| -flax-community/gpt-2-spanish: Este modelo es de Text Generation, es un tipo GPT-2 entrenado en corpus de español, y es capaz de generar texto coherente en español a partir de un prompt inicial. | |
| **Limitaciones:** | |
| Las limitaciones que se puede encontrar son que va a funcionar mal para otros idiomas que no sean español, puede confundir el sarcasmo o el lenguaje informal llevando a un análisis erróneo de la frase introducida, la calidad del output es relativa ya que puede que las frases generadas no sean del todo coherentes o motivadoras y que puede que el output genere una respuesta que se salga del límite de longitud esperada por lo que aparezca cortada. | |
| **Rendimiento:** | |
| El rendimiento del programa es bastante rápido, entre ambos modelos llegan a tardar una media de 7-8 segundos en completar tanto el análisis como la escritura del mensaje motivador. | |
| """ | |
| # --- INTERFAZ GRADIO --- | |
| with gr.Blocks(title="Análisis de Tweets Negativos") as demo: | |
| gr.Markdown("## Analizador y Reescritor de Tweets Negativos") | |
| tweet_input = gr.Textbox(label="Introduce un tweet", placeholder="Por ejemplo: Este servicio es terrible y no lo recomiendo.") | |
| output_sentimiento = gr.Textbox(label="Sentimiento detectado en el tweet") | |
| output_reescritura = gr.Textbox(label="Frase positiva o motivadora") | |
| boton = gr.Button("Analizar y Reescribir") | |
| boton.click(fn=analizar_y_reescribir, inputs=tweet_input, outputs=[output_sentimiento, output_reescritura]) | |
| gr.Examples( | |
| examples=[ | |
| ["Este producto es una pérdida de dinero y tiempo."], | |
| ["No volveré a este restaurante."], | |
| ["La atención fue lenta y pésima."], | |
| ["El personal fue muy amable y servicial."] | |
| ], | |
| inputs=tweet_input | |
| ) | |
| gr.Markdown(documentacion) # Aquí aparece la documentación abajo | |
| demo.launch() | |