Isaac Isa铆as
Update app.py
0d93e4f
raw
history blame
7.7 kB
import gradio as gr
from transformers import AutoTokenizer, AutoModelForSequenceClassification, TextClassificationPipeline
title = "Clasificador de Tesis"
description = "Clasifica el texto de una tesis con la carrera a la que le pertenece."
article = """
## Obtenci贸n de los datos
### Motivos y Objetivo de la Obtenci贸n de los Datos
La creaci贸n de este dataset ha sido motivado por la participaci贸n en el Hackathon 2022 de PLN en Espa帽ol organizado por Somos NLP, con el objetivo de democratizar el NLP en espa帽ol y promover su aplicaci贸n a buenas causas y, debido a que no existe un dataset de tesis en espa帽ol.
### Proceso de Obtenci贸n
Se opt贸 realizar un [scraper](https://github.com/IsaacIsaias/NLP-clasificador-tesis/blob/main/main.py) para conseguir la informaci贸n. Se decidi贸 usar la base de datos [TESIUNAM](https://tesiunam.dgb.unam.mx/F?func=find-b-0&local_base=TES01), la cual es un cat谩logo en donde se pueden visualizar las tesis de los sustentantes que obtuvieron un grado en la Universidad Nacional Aut贸noma de M茅xico (UNAM), as铆 como de las tesis de licenciatura de escuelas incorporadas a ella.
Para ello, en primer lugar se consult贸 la [Oferta Acad茅mica](http://oferta.unam.mx/indice-alfabetico.html) de la Universidad, sitio de donde se extrajo cada una de las 131 licenciaturas en forma de lista. Despu茅s, se analiz贸 cada uno de los casos presente en la base de datos, debido a que existen carreras con m谩s de 10 tesis, otras con menos de 10, o con solo una o ninguna tesis disponible. Se us贸 Selenium para la interacci贸n con un navegador Web (Edge) y est谩 actualmente configurado para obtener las primeras 20 tesis, o menos, por carrera.
Este scraper obtiene de esta base de datos:
- Nombres del Autor
- Apellidos del Autor
- T铆tulo de la Tesis
- A帽o de la Tesis
- Carrera de la Tesis
A la vez, este scraper descarga cada una de las tesis en la carpeta *Downloads* del equipo local.
En el csv formado por el scraper se a帽adi贸 el Resumen/Introduccion/Conclusion de la tesis, dependiendo cual primero estuviera disponible, ya que la complejidad recae en la diferencia de la estructura y formato de cada una de las tesis.
Posteriormente, se le realiz贸 un procesado al dataset con las siguientes tareas:
- Conversi贸n a min煤sculas
- Tokenizaci贸n
- Eliminaci贸n de palabras que no son alfanum茅ricas
- Eliminaci贸n de palabras vac铆as
- Stemming: eliminaci贸n de plurales
## Impacto Social
El presente conjunto de datos favorecer谩 la b煤squeda e investigaci贸n relacionada con tesis en espa帽ol, a partir de su categorizaci贸n autom谩tica por un modelo entrenado con este dataset. Esta tarea favorece el cumplimiento del Objetivo 4 de Desarrollo Sostenible de la ONU: Educaci贸n y Calidad (https://www.un.org/sustainabledevelopment/es/objetivos-de-desarrollo-sostenible/).
## Miembros del Equipo:
- Isaac Isa铆as L贸pez L贸pez ([MajorIsaiah](https://huggingface.co/MajorIsaiah))
- Dionis L贸pez Ramos ([inoid](https://huggingface.co/inoid))
- Yisel Clavel Quintero ([clavel](https://huggingface.co/clavel))
- Ximena Yeraldin L贸pez L贸pez ([Ximyer](https://huggingface.co/Ximyer))
"""
tokenizer = AutoTokenizer.from_pretrained('hiiamsid/BETO_es_binary_classification', use_fast=False)
model = AutoModelForSequenceClassification.from_pretrained(
'hackathon-pln-es/unam_tesis_BETO_finnetuning', num_labels=5, output_attentions=False, output_hidden_states=False)
pipe = TextClassificationPipeline(model=model, tokenizer=tokenizer, return_all_scores=True)
classificationResult = pipe("El objetivo de esta tesis es elaborar un estudio de las condiciones asociadas al aprendizaje desde casa.")
def thesis_prediction(input):
tokenizer = AutoTokenizer.from_pretrained('hiiamsid/BETO_es_binary_classification', use_fast=False)
X_val_inputs, X_val_masks = preprocessingtext(_text,tokenizer)
t0 = time.time()
# Deserialization of the file
#file = open(path + os.path.sep + 'classIndexAssociation.pkl', 'rb')
#new_model = pickle.load(file)
#sizeOfClass = len(new_model)
model = AutoModelForSequenceClassification.from_pretrained(
'hackathon-pln-es/unam_tesis_BETO_finnetuning', num_labels=5, output_attentions=False, output_hidden_states=False)
#Bibliografy from:
#
# https://huggingface.co/docs/transformers/main_classes/output
#
inputs = tokenizer(_text, return_tensors="pt")
labels = torch.tensor([1]).unsqueeze(0) # Batch size 1
outputs = model(**inputs, labels=labels)
loss, logits = outputs[:2]
#Transform in array
logits = logits.detach().cpu().numpy()
#Get max element and position
result = logits.argmax()
return result
#Example from
#
#
#
# pipe = TextClassificationPipeline(model=model, tokenizer=tokenizer, return_all_scores=True)
# # Put the model in evaluation mode
# classificationResult = pipe(_text)
# if classificationResult[0] != None and len (classificationResult[0]) > 0:
# #Order the result with more close to 1
# classificationResult[0].sort(reverse=True, key=lambda x:x['score'])
# # Return the text clasification
# keyClass = classificationResult[0][0]['label']
# keyClass = keyClass.replace("LABEL_","").strip()
# if keyClass.isnumeric():
# return new_model[ int (keyClass)]
# else:
# raise Exception("Not exist class info")
# model.eval()
# outputs = model(X_val_inputs,
# token_type_ids=None,
# attention_mask=X_val_masks)
#
# # The "logits" are the output values
# # prior to applying an activation function
# logits = outputs[0]
#
# # Move logits and labels to CPU
# logits = logits.detach().cpu().numpy()
#
# sorted_tuples = sorted(logits.items(), key=lambda item: item[1])
# #Return the text clasification
# keyClass = sorted_tuples.keys()[0]
# return new_model[keyClass]
#else:
# raise Exception("Not exist model info")
#else:
# raise Exception("Not exist model info")
#return "Text"
#pass
examples = [["Introducci贸n al an谩lisis de riesgos competitivos bajo el enfoque de la funci贸n de incidencia acumulada (FIA) y su aplicaci贸n con R"], ["Los promedios de calificaciones y clasificar por grupo o asignatura se realizaron a trav茅s de tablas din谩micas en Excel"]]
if __name__ == "__main__":
gr.Interface(
fn=thesis_prediction,
inputs=gr.inputs.Textbox(
lines=2,
placeholder="Ingrese de favor el t铆tulo de la tesis o un fragmento de esta."
),
outputs=["text"],
title=title,
description=description,
article=article,
examples=[examples],
).launch()