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()