TREBALL FINAL DE GRAU
TÍTULO DEL TFG: MyBotWilliam: Un ChatBot para una asignatura de programación.
TITULACIÓN: Grado en Ingeniería de Aeropuertos AUTOR: Sergi González Dalmau
DIRECTOR: Roc Meseguer Pallarès Fecha: 1 de febrero del 2021
Título: MyBotWilliam: Un ChatBot para una asignatura de programación. Autor: Sergi González Dalmau
Director: Roc Meseguer Pallarès Fecha: 1 de febrero del 2021
Resumen
En este trabajo se desarrollará un chatbot con inteligencia artificial con el objetivo de agilizar la resolución de dudas de una asignatura de programación. Para la creación del chatbot hemos creado diferentes bases de datos con preguntas y respuestas, extraídas mediante el Web Scraping, de una página web muy conocida: Stack Overflow. Para determinar cómo va a encontrar las respuestas nuestro chatbot, hemos estudiado diferentes métodos de selección de respuesta: similitud, árboles de decisión, redes neuronales y deep learning. Se realizará una comparativa del rendimiento de los diferentes modelos para cada base de datos con el objetivo de decidir qué modelo aplicar en nuestro chatbot. Finalmente, comprobaremos el correcto funcionamiento del chatbot a tiempo real.
Después de analizar diferentes posibles combinaciones de bases de datos y tecnologías de selección de respuesta, se ha construido el chatbot con un modelo de inteligencia artificial basado en redes neuronales y base de datos sin modificar. Éste obtiene un porcentaje de acierto en su evaluación del 80%. Sin embargo, a pesar de su buen rendimiento no se consigue agilizar la resolución de dudas, dado que para que sea efectivo se debe saber qué preguntas hay en la base de datos. Además, es posible que la respuesta esté relacionada con el tema ya que hay coincidencia en las palabras, pero no responda a tu pregunta realmente.
En conclusión, podemos decir que hemos cumplido prácticamente todos los objetivos del proyecto excepto la agilización de la respuesta de preguntas, como hemos mencionado anteriormente. Aun así, hemos logrado crear diferentes datasets y métodos de selección de respuesta para crear un chatbot a tiempo real.
Title: MyBotWilliam: A ChatBot for a programming subject. Author: Sergi González Dalmau
Director: Roc Meseguer Pallarès Date: February 1st 2021
Overview
In this project we are going to develop a chatbot with artificial intelligence, with the aim to accelerate the resolution of doubts for a programming subject. For the creation of the chatbot, we have created different datasets with questions and answers, extracted via web scraping from a well-known web page: Stack Overflow. To determine how the chatbot intends to find the answers, we have studied different selection methods: similarity, decision tree, neural nets and deep learning. A comparative of the performance of the different methods for each database is going to be done, with the objective to decide which model is best to apply to our chatbot. Finally, we are going to corroborate the correct functioning of the real-time chatbot.
After analysing different possible combinations of datasets and selection method technologies, the chatbot has been decided to build based on a neural net model with the unmodified dataset. This combination results in an accuracy efficiency of 80%. Nevertheless, even though its performance is good it does not achieve to accelerate the doubts resolution, because for the answer to be effective you have to know what questions are included in the database. Additionally, there is a possibility that the answer is related to the topic, because there is a word coincidence, but it is not really answering your question.
All in all, we can say that we have accomplished almost every objective of our project except the aforementioned answer acceleration. On the other hand, we have achieved to create different datasets and selection methods to develop a real-time chatbot.
ÍNDICE
INTRODUCCIÓN ... 1
CAPÍTULO 1. PRESENTACIÓN ... 2
1.1. ¿Pueden pensar las máquinas?... 2
1.1.1. Inteligencia artificial ... 2
1.2. Chatbot ... 3
1.2.1. ¿Qué es un bot? ... 3
1.2.2. ¿Qué es un chatbot? ... 4
1.3. Web scraping ... 5
1.3.1. ¿Qué es una API REST? ... 5
CAPÍTULO 2. CONCEPTO Y TECNOLOGÍA ... 7
2.1. Natural Language Processing ... 7
2.1.1. Aplicando NLTK ... 8
2.1.2. Aplicando CountVectorizer ... 9
2.2. Similitud entre preguntas ... 10
2.2.1. Similitud Coseno ... 10
2.2.2. Índice de Jaccard ... 11
2.3. Modelos de inteligencia artificial ... 12
2.3.1. Decision Tree... 12
2.3.2. Neural Net ... 13
CAPÍTULO 3. PREPARACIÓN DE DATOS Y ENTRENAMIENTO DE MODELOS ... 16
3.1. Preparación de los datos ... 16
3.1.1. Obtención de datos con web scraping ... 17
3.1.2. Conversión de los datos de texto a formato numérico con NLP ... 17
3.2. Entrenamiento de modelos ... 19
3.2.1. Entrenamiento de modelos con la librería de Sckicit-learn ... 19
3.2.2. Entrenamiento de modelos con la librería de Tensorflow ... 20
3.3. Evaluación de resultados ... 20
3.4. Conclusiones ... 21
CAPÍTULO 4. ANÁLISIS Y EVALUACIÓN DE MODELOS CON UNA BASE DE DATOS MÁS REALISTA ... 23
4.1. Influencia del aumento de preguntas en la base de datos ... 23
4.2. Análisis en la construcción de la red de deep learning ... 24
4.2.1. Análisis de la salida dimensional ... 24
4.2.2. Análisis del número de capas... 25
CAPÍTULO 5. GENERACIÓN ARTIFICIAL DE PREGUNTAS ... 28
5.1. Generación manual de preguntas... 28
5.1.1. Multiplicación de muestras ... 28
5.1.2. Generación de preguntas a través de páginas web ... 29
5.2. Generación sintética de preguntas... 30
5.3. Conclusiones ... 30
CAPÍTULO 6. MY BOT WILLIAM ... 32
6.1. Características del chatbot ... 32
6.1.1. Base de datos ... 32
6.1.2. Modelo de selección de respuesta ... 32
6.2. Uso del chatbot ... 32
CAPÍTULO 7. CONCLUSIONES DEL TRABAJO ... 35
7.1. Conclusiones técnicas ... 35
7.2. Objetivos del trabajo y trabajo pendiente ... 35
7.3. Valoración personal del proyecto ... 36
BIBLIOGRAFÍA ... 38
ANEXO A ... 40
INTRODUCCIÓN
En este trabajo vamos a desarrollar una aplicación para la ayuda docente en una asignatura de programación. Esta aplicación se trata de un chatbot, un bot que tendrá respuestas sobre preguntas de programación con el objetivo de agilizar la resolución de dudas.
Este proyecto está enfocado en la creación de un chatbot con inteligencia artificial (IA) que contenga una base de datos con posibles preguntas de los alumnos. Por lo tanto, un aspecto muy importante del trabajo es la recopilación de estos datos, ya que la calidad de las respuestas dependerá en gran parte de la base de datos. Para crearla, implementaremos una técnica llamada web scraping en una página de preguntas y respuestas enfocadas a programación muy conocida, Stack Overflow; es de este último punto de donde surgió el nombre del proyecto: MyBotWilliam, “W” de web scraping. Se crearán diferentes tipos de base de datos, de menor a mayor extensión, y se estudiarán diferentes modelos de selección de respuesta con cada uno de estos datasets. Finalmente, haremos una comparativa del rendimiento del chatbot con las diferentes opciones.
En cuanto a los objetivos del proyecto, queremos: 1) desarrollar una base de datos para el chatbot a partir del web scraping, 2) estudiar y crear diferentes modelos de selección de respuesta con las tecnologías de IA más comunes, 3) modificar el dataset para determinar la afectación en el rendimiento de los modelos, 4) una vez evaluadas las diferentes opciones, escogeremos el dataset y el modelo de selección de respuesta más adecuados y se desarrollará un chatbot a tiempo real, 5) testearemos que el chatbot es capaz de responder a preguntas de programación y que pueda agilizar la resolución de dudas de los alumnos.
La memoria está estructurada en diferentes capítulos:
En el Capítulo 1 revisaremos los conceptos teóricos básicos del proyecto: qué es la IA, qué es un chatbot y en qué consiste el web scraping. En el Capítulo 2 se estudiarán los métodos de selección de respuesta tanto en un ámbito teórico como aplicado en Python. Nos centraremos en los modelos de similitud, los árboles de decisión, las redes neuronales y el deep learning. En el Capítulo 3, crearemos una pequeña base de datos de unas 30 preguntas y estudiaremos el rendimiento de los diferentes modelos de selección de respuesta, para así determinar la viabilidad tecnológica del proyecto. En el Capítulo 4, se añadirán nuevas preguntas a la base de datos, unas 1600 en total, para analizar los mismos métodos de IA en un dataset más realista. En el Capítulo 5, intentaremos ampliar de nuevo nuestra base de datos generando nuevas entradas a partir de las preguntas existentes de manera artificial. Estudiaremos el rendimiento de cada modelo de selección de respuesta con estos nuevos datasets. En el Capítulo 6 decidiremos qué combinación de dataset y modelo usaremos para nuestro chatbot y lo implementaremos. Finalmente, en el
Capítulo 7 revisaremos el trabajo realizado y qué líneas de desarrollo se pueden
CAPÍTULO 1.
PRESENTACIÓN
En este capítulo haremos unas pinceladas sobre los aspectos que destacan en la historia más reciente de los chatbots y de los sistemas de extracción de datos de la web, los temas principales de este trabajo.
1.1. ¿Pueden pensar las máquinas?
Desde los primeros pasos en la informática, aquellos interesados en el tema siempre han tenido la misma pregunta: “¿Pueden pensar los ordenadores?” En 1950, el matemático de origen británico Alan Turing publicó un artículo llamado “Computing Machinery and Intelligence” (véase [1]), que proponía lo que ahora se conoce como el Test de Turing para establecer si las máquinas podían mostrar un comportamiento inteligente similar al de un humano. Esta prueba consistía en un juez humano interactuando a tiempo real con dos interlocutores: un humano y una máquina. Si la máquina era capaz de engañar y hacer pensar al juez que era el humano, entonces se diría que la máquina es ‘inteligente’. La prueba que propuso Turing fue ampliamente influyente, y a su vez muy criticada, porque se implementó la prueba como medida de inteligencia (véase [2]). Muchos científicos y filósofos marcaron que un interlocutor no podía establecer si una máquina era inteligente o “pensante” al comparar su respuesta con la de un humano.
1.1.1. Inteligencia artificial
La inteligencia artificial (IA) es una rama de las ciencias de la informática que se dedica al desarrollo software capaz de realizar ciertas acciones que requieran de aprendizaje. Ejemplos de este tipo de inteligencia son los ordenadores que juegan al ajedrez o los coches que conducen solos.
El principio de la IA se remonta al 1943 cuando Warren McCulloch y Walter Pitts crearon un algoritmo de redes neuronales artificiales que simulaban la interconexión neuronal biológica (véase [3]). En 1956 empezó la investigación en el campo de la Inteligencia artificial, época en la que se generaron muchas expectativas sobre el campo; sin embargo, quince años más tarde, la falta de nuevos avances y la enorme cantidad de promesas incumplidas generó una falta de interés y fondos para seguir con parte de la investigación. Esta etapa es denominada Invierno IA.
Desde entonces la inteligencia artificial ha sufrido altibajos en popularidad hasta que, debido al avance en el poder computacional de los ordenadores, se empezó a implementar la IA en muchos campos. Tal fue el avance que el 11 de mayo de 1997, Deep Blue (véase [4]) se convirtió en el primer ordenador que derrotó al vigente campeón mundial de ajedrez, Garry Kasparov.
Actualmente, la inteligencia artificial tiene el apoyo de muchas empresas multimillonarias cómo Google o IBM.
1.2. Chatbot
Para poder definir qué es un chatbot, empezaremos por saber qué es un bot, para que se usan y por qué pueden utilizarse con fines malévolos.
1.2.1. ¿Qué es un bot?
La palabra bot (que proviene de la abreviación de robot) tiene muchas aplicaciones y muy variadas, pero no tiene una definición concreta. El estudio realizado por Carlene Lebeuf define los bots como:
“una interfaz que conecta los usuarios con los servicios. Estos servicios pueden ser internos en el código del bot y/o accesibles externamente. El bot además aporta un valor adicional (en forma de estilo de interacción, automatización, antropomorfismo, etc.) a las capacidades básicas del software.”
__ Carlene Lebeuf, 2018 [5]
Estos programas informáticos permiten hacer todo tipo de tareas, y una forma de clasificarlos es según la función que desempeñan o su especialización (véase [6]):
• Bots generales, que proporcionan una gran variedad de tareas y redirigen al usuario a recursos externos cuando es necesario.
• Bots transaccionales, que favorecen el interés económico del usuario. • Bots informativos, que se encargan de generar mensajes con información
reciente.
• Bots de productividad, que implementan diferentes tareas para aumentar la eficiencia colectiva o personal.
• Bots colaborativos, cuya tarea es facilitar la coordinación de los usuarios. Los bots son herramientas muy potentes que permiten hacer multitud de operaciones en un instante. Según Imperva, en su análisis anual (véase [7]), casi el 40 % del tráfico de Internet en 2019 estaba formado por bots, de los cuales más de la mitad tenían propósitos malignos. Estos datos se pueden ver en la
Fig. 1.1 Resultados clave del Bad Bot Report 2020. Origen: Imperva
1.2.1.1. Bots perjudiciales vs. bots beneficiosos
Los bots perjudiciales, según Cloudflare (véase [8]), son aquellos que llevan a cabo cualquier acción automatizada que infringe las intenciones del propietario de un sitio web, las Condiciones del servicio o las reglas Robots.txt de la web o realice cualquier acción ilegal.
Tampoco es necesario que se infrinja la ley para que se consideren maliciosos. Un ejemplo claro son los ataques DDoS (en inglés, Distributed Denial of Service). Estos ataques tienen el objetivo de sobresaturar un servidor generándole un pico de demanda excesivo y alterar su normal funcionamiento. Otros usos maliciosos podrían ser los bots generadores de spam, los bots que buscan vulnerabilidades de páginas web para permitir ataques de día cero o generar fraude de clics. Por otro lado, los bots beneficiosos son todos aquellos que no perjudican a un usuario en Internet. Hay muchos tipos de bots “buenos”, como puede ser el caso de los chatbots, los asistentes personales o los web crawlers, que estos últimos son indispensables para indexar la web.
1.2.2. ¿Qué es un chatbot?
Un chatbot es un bot especializado para mantener una conversación con una persona. Provee respuestas automatizadas a las preguntas del usuario ya sea mediante procesamiento de lenguaje natural y una sofisticada inteligencia artificial, o mediante una consulta a una base de datos a través de una palabra clave (véase [9]).
El primer bot conversacional reconocido fue ELIZA (véase [10]), ya que fue el primer programa en poder mantener una conversación con un humano. Se desarrolló en 1966 por el profesor del MIT Joseph Weizenbaum y su método de actuación era buscar palabras clave. ELIZA suplía su falta de vocabulario imitando a un psicólogo muy famoso.
Actualmente, estos tipos de softwares están muy presentes en nuestro día a día. Los casos más conocidos son Siri y Alexa, de Apple y Amazon respectivamente. Sin embargo, estos están en un nivel superior, considerados asistentes personales debido a todas las tareas que son capaces de realizar.
Por otro lado, muchas empresas han optado por los chatbots para ofrecer consultas sobre sus servicios y atención al cliente las 24 h, permitiendo una considerable reducción de las largas esperas telefónicas.
1.3. Web scraping
El web scraping es una técnica para extraer grandes cantidades de información (Big data) de forma automatizada. Es usada por muchos analistas o empresas para comparar precios o rellenar bases de datos. Permitiendo rebajar en gran medida la carga de trabajo, manejar grandes cantidades de datos, clasificar información entre otras muchas cosas (véase [11]).
El proceso de ‘scrapear’ solo consta de 3 pasos: primero, la computadora envía una solicitud HTTP GET a una web específica; cuando el sitio web responde, se analiza el documento html para buscar un patrón específico; y finalmente, se extraen los datos y se procesan. Para más información puede visitar el siguiente enlace (véase [12]).
Actualmente, hay mucha controversia en el uso del web scraping y en su legalidad. Muchas empresas quieren evitar que se recoja información de su página web de forma no autorizada; de hecho, ha habido juicios entre empresas por este motivo. Un ejemplo de ello es el caso entre hiQ labs, Inc. y LinkedIn, Corp., en el que LinkedIn denunció a hiQ labs por la descarga de información de su servidor (véase [13]).
Para mantener una página web lejos del alcance del web scraping se pueden realizar una serie de acciones que limitan su efectividad (véase [14]). Estas acciones podrían ser: limitar el ratio de acceso de una IP, pedir el inicio de sesión, cambiar regularmente el formato HTML de la página web o usar CAPTCHAs, entre otros.
Por el contrario, hay diferentes maneras de facilitar la extracción de datos de una página web, tal y como puede ser una API REST.
1.3.1. ¿Qué es una API REST?
API son las siglas de “Application Programming Interface”, y es una interfaz ofrecida por una página web o biblioteca que establece un conjunto de procedimientos para facilitar a los programadores la extracción de datos de la misma (véase [15]).
Las API están muy presentes en nuestro día a día, aunque como usuarios del servicio no nos demos cuenta. Hay muchos ejemplos, como pueden ser los pagos con nuestra tarjeta de crédito o PayPal en una aplicación externa, registrar una cuenta mediante el correo electrónico o acceder a un tweet destacado. En todos estos ejemplos, las aplicaciones utilizan una interfaz API que evitan que el desarrollador tenga que construir la aplicación de cero.
Cada API tiene su documentación en la que se describe qué ofrece la API y cómo utilizar sus servicios. Este documento es vital para su uso, porque detalla las clases y funciones del servicio o las limitaciones que puede tener. Es directamente una guía para el desarrollador.
CAPÍTULO 2.
CONCEPTO Y TECNOLOGÍA
En este capítulo vamos a profundizar sobre la inteligencia artificial de una manera teórica y cómo aplicarlo a nuestro proyecto mediante librerías en Python. Como podemos ver a partir del diagrama de la Fig. 2.1, el primer paso será procesar los datos de texto de nuestra base de datos. El objetivo es pasar los datos de texto a numéricos; haremos esto mediante el NLP. Veremos que hay diversos métodos para implementarlo. En nuestro caso, usaremos dos métodos dependiendo de la tecnología del método de selección de respuesta que vayamos a utilizar. Para el caso de similitud entre preguntas, usaremos el NLP basado en NLTK; en el caso de trabajar con modelos de IA, usaremos el NLP basado en CountVectorizer. Una vez procesada la base de datos mediante el método NLP correspondiente, trabajaremos con el método de selección respectivo.
Fig. 2.1 Estructura de aplicación de NLP.
Vamos a diferenciar entre los métodos que requieren de entrenamiento (métodos de inteligencia artificial) y los que no lo requieren (similitud entre preguntas). Estos últimos permiten seleccionar una respuesta después de la conversión con NLP; en cambio, para los primeros métodos, esta conversión es una etapa previa al entrenamiento.
2.1. Natural Language Processing
Hay una gran rama dentro de la inteligencia artificial, el NLP (Natural Language Processing), que se dedica a procesar textos para que un ordenador simule su entendimiento (véase [16]). El NLP se usa en la minería de textos para procesar un texto en lenguaje humano y convertirlo en datos con información relevante (véase [17]).
Para llevar a cabo el procesado de un documento de texto hay una gran variedad de métodos del NLP, que, según el objetivo que quieras realizar, se implementaran unos u otros. Los métodos más comunes son tres: “tokenization”, “lemmatization” y “stop words”.
• Tokenization: divide el texto en frases y posteriormente en palabras para puntuar la importancia a las palabras en la oración.
• Stemming o lemmatization: encuentra la raíz de la palabra. • Stop Words: quita las palabras que no aportan significado.
Estos tres métodos son realmente muy importantes para el análisis de los textos, ya que permiten que el ordenador se centre en los puntos clave del texto y no desvíe su atención. Se pueden aplicar diferentes tipos de procesados según la finalidad de tu aplicación.
2.1.1. Aplicando NLTK
En este apartado estudiaremos las opciones que tenemos para la implementación de NLP para los métodos de similitud de preguntas. Existen diferentes opciones a la hora de implementarlo, como pueden ser spaCy o Polyglot, entre otros. Sin embargo, nosotros vamos a utilizar la librería de NLTK (véase [18]).
Para implementar NLTK en un proyecto de Python debemos instalar el paquete siguiendo la guía de la documentación según el sistema operativo y usando la herramienta pip: ‘pip install nltk’.
Una vez instalada la librería debemos importar las herramientas que se vayan a utilizar mediante los imports. En las siguientes Fig. 2.2 y Fig. 2.3, se puede observar una función del proyecto que implementa los tres métodos explicados anteriormente, con una prueba con la siguiente frase: “This is a test for my TFG:
Testing”.
Fig. 2.3 Resultados de la implementación de NLP.
En la segunda figura, podemos observar paso a paso la función y analizar los diferentes aspectos: al aplicar el word_tokenize() se parte la frase en una lista con cada palabra (y también los signos de puntuación) en una posición; después analizamos las palabras y nos quedamos con las raíces aplicando SnowballStemmer(). Finalmente, quitamos las palabras que no aportan significado y nos quedamos con 4 posiciones en el vector: “test”, “tfg”, “:” y “test”. El resultado de esta función es bastante representativo de lo que podemos esperar en el procesado de texto natural. Partiendo de la frase original, creemos que “test” y “tfg” hacen un buen esquema del significado de la oración.
2.1.2. Aplicando CountVectorizer
En este apartado implementaremos NLP para los métodos de selección de respuesta basados en IA. En este caso, usaremos CountVectorizer de Sklearn. Esta librería nos ayudará a convertir los datos de texto a formato numérico generando un diccionario de palabras, con el añadido de que nos permite aplicar métodos adicionales como stop words o strip accents (elimina los acentos). Esta librería es muy útil para la generación de modelos de IA ya que en lugar de tener que recorrer toda la base de datos, pasará de una base de datos en formato de texto a una estructura numérica mediante un diccionario de palabras. Esta estructura tendrá como filas las preguntas y como columnas todas las palabras del diccionario; nos indicará el número de veces que aparece cada palabra en cada pregunta (count).
En la Fig. 2.4 podemos ver la implementación en Python del CountVectorizer. Primeramente, importaremos la librería. En la línea 2 podemos crear un diccionario vacío en el que seleccionaremos qué métodos de NLP usaremos; en este caso, strip_accents y stop_words. Finalmente, rellenaremos el diccionario gracias a la función fit_transform.
2.2. Similitud entre preguntas
Los chatbots más sencillos utilizan una herramienta que compara una entrada de texto con otros resultados en su base de datos para proveer una respuesta. Esta herramienta es un algoritmo matemático que compara la similitud de dos vectores (obtenidos a partir del NLP) y extrae una puntuación (véase [19]). Para la implementación de estos recursos a un chatbot se compararía una entrada de texto (la pregunta del usuario) con todas las preguntas de la base de datos, para averiguar cuál es la posible respuesta a la pregunta del usuario.
Un posible ejemplo de este proceso sería comparar la similitud de dos frases. En las siguientes Fig. 2.5 y Fig. 2.6 se puede observar la comparación de dos fases similares y de otras que no lo son. En el siguiente apartado, nos adentraremos en el código que hay detrás.
Fig. 2.5 Ejemplo comparación similitud.
Fig. 2.6. Resultado comparación similitud.
En nuestro proyecto vamos a utilizar la similitud coseno, uno de los métodos más empleados, y el índice de Jaccard.
2.2.1. Similitud Coseno
La similitud coseno es una medida de similitud entre dos vectores distintos de cero en un espacio vectorial. Se calcula el valor del coseno del ángulo entre ellos
(2.1) y ofrece un resultado entre menos uno y uno, siendo uno el valor del coseno
de dos vectores iguales.
cosθ = 𝑎⃗ · 𝑏⃗
Para aplicar este cálculo en Python podemos hacerlo con una librería como NLTK o seguir un breve tutorial (véase [20]). Para comparar la similitud de dos oraciones debemos aplicar un procesado similar al obtenido en el apartado 2.1.1 y, tras obtener las listas de palabras, hacer el proceso de la función cosine_similarity() de la Fig. 2.7.
Fig. 2.7 Similitud coseno.
En el código de la figura anterior, podemos dividir la función en dos partes: en la primera creamos listas de unos y ceros por cada palabra que contenga una de las oraciones con respecto a la suma de las palabras; en la segunda parte, se aplica la fórmula 2.1 y se devuelve el valor de la operación.
2.2.2. Índice de Jaccard
De manera parecida a la similitud coseno, el índice de Jaccard (IJ) mide la similitud entre dos conjuntos dividiendo la intersección con la unión de los mismos (2.2).
𝐼𝐽 = |𝐴∩𝐵|
|𝐴∪𝐵| (2.2)
Para aplicar este concepto en Python, debemos calcular la intersección y la unión de dos listas (también partiendo de un proceso similar al del apartado 2.1.1) y hacer la correspondiente división. Este cálculo se puede ver en la Fig. 2.8.
Fig. 2.8 Índice de Jaccard.
2.3. Modelos de inteligencia artificial
Cuando hay una gran cantidad de datos puede llegar a ser muy costoso (en cuanto a recursos se refiere) comparar los resultados uno a uno con todas las entradas. Por este motivo, se entrenan previamente unos modelos de comparación en los que se almacenan los datos de tal manera que chequear una extensa base de datos sea mucho más rápido.
Los modelos de inteligencia artificial se desarrollan mediante cálculos matemáticos, los más utilizados en la implementación de chatbots son los árboles de decisión y las redes neuronales.
2.3.1. Decision Tree
Los árboles de decisión (DT) son un método de clasificación en el que el objetivo es dividir una decisión compleja en múltiples cuestiones mucho más sencillas de interpretar (véase [21]).
En la Fig. 2.9 se puede apreciar un ejemplo de árbol de decisión de Scikit-learn.
Fig. 2.9 Árbol de decisión. Origen: Scikit-learn.
Las principales ventajas de los DT son una fácil visualización y entendimiento del esquema, que el coste por predicción es logarítmico en función del número
de datos usados para entrenar el modelo, y que requiere poca preparación de los datos. Por contraparte, las desventajas son la posibilidad de crear un árbol de decisión demasiado complejo o sobreentrenado y la inestabilidad a variaciones en los datos, entre otros (véase [22]).
¿Cómo aplicar el modelo de selección de respuesta de DT en Python? En primer lugar, es necesario un procesado de la base de datos mediante NLP para convertir los datos de texto en numéricos; en este caso, al tratarse de un modelo de IA, se utilizará CountVectorizer. En segundo lugar, importaremos la librería DecisionTreeClassifier de Sklearn para crear el modelo de DT. Finalmente, entrenaremos el modelo de selección de respuesta con los datos procesados de la base de datos.
Podremos ver de forma más detallada en el próximo capítulo (véase 3.1.2.2,
3.2.1) todos los pasos mencionados, y sus códigos de implementación
respectivos.
2.3.2. Neural Net
Las redes neuronales artificiales están basadas en las redes neuronales biológicas. El objetivo principal es intentar imitar la manera de aprender de los humanos (véase [22]), por lo que están formadas por un conjunto de sistemas llamados neuronas. Estos mecanismos aplican una operación matemática a una entrada (input) generando una salida (output), tal y como se puede observar en la Fig. 2.10.
Fig. 2.10 Neurona artificial. Origen: Towards data science.
Las neuronas artificiales se pueden agrupar y crear combinaciones (de operaciones matemáticas) denominadas capas de neuronas. A partir de un conjunto de capas de neuronas se puede formar una especie de red interconectada, conocida como red neuronal.
Las redes neuronales pueden estar formadas por múltiples capas de distinto número de neuronas, toda capa intermedia se llama capa oculta (debido a que no se percibe visualmente su aporte). Un ejemplo generalizado de estas redes neuronales se puede ver en la Fig. 2.11. Generalmente, si la red contiene más de una capa oculta se conoce como red neuronal profunda (en inglés, deep learning) (véase [22]).
Fig. 2.11 Generalización de una red neuronal multicapa con n capas ocultas, m
nodos y d elementos de entrada. Origen: Towards data science.
Las redes neuronales son muy útiles para encontrar patrones que son muy complejos o tediosos para un humano, extraerlos y enseñar a un ordenador a reconocerlos. Es por este motivo que las redes neuronales tienen un mejor rendimiento cuantos más datos haya para analizar.
¿Cómo aplicar el modelo de selección de respuesta de redes neuronales en Python? De forma muy similar a la implementación en DT, primero necesitaremos procesar los datos con CountVectorizer e importar la librería específica de este modelo, que en este caso se trata de MLPClassifier de Sklearn. Se entrenará dicho modelo con los datos procesados del dataset. Podremos ver de forma más detallada en el próximo capítulo (véase 3.1.2.2,
3.2.1) todos los pasos mencionados, y sus códigos de implementación
respectivos.
2.3.2.1. Deep learning
El deep learning es una vertiente de las redes neuronales que implementan una estructura con más de una capa oculta. El número de capas necesarias para pasar de hablar de redes neuronales a redes neuronales profundas (deep learning) no está claro. Es por este motivo que a veces se considera el deep learning como un efecto de marketing.
¿Por qué son necesarias más capas? Cuando queremos resolver un problema, muchas veces es más sencillo resolver subproblemas y gradualmente integrar las soluciones. Esto es lo que ocurre en el deep learning: se resuelven problemas a partir de múltiples capas de abstracción. Por ejemplo, si una capa se especializa en el reconocimiento de una característica tendrá mejor precisión
que si se intenta clasificar esa característica conjuntamente con otras (véase [23]).
Para que todas las capas sean efectivas, es necesario un gran volumen de datos y gran fuerza de computación. Estos son unos de los motivos de su actual auge, ya que cada vez los ordenadores son más potentes y, a través del cloud computing (véase [24]) y otros servicios de internet, se pueden almacenar y obtener muchos datos (Big Data).
¿Cómo aplicar el modelo de selección de respuesta de deep learning en Python? De la misma manera que hemos visto en los previos modelos de IA, se procesará en primer lugar la base de datos con CountVectorizer. Posteriormente, para entrenar el modelo, deberemos importar las librerías necesarias: Keras y Dense, de Tensorflow. A continuación, debemos construir un conjunto de capas con las que crearemos un sistema de deep learning e, igual que anteriormente, entrenar este modelo con la base de datos procesada,
Podremos ver de forma más detallada en el próximo capítulo (véase 3.1.2.2,
3.2.2) todos los pasos mencionados, y sus códigos de implementación
CAPÍTULO 3.
PREPARACIÓN DE DATOS Y
ENTRENAMIENTO DE MODELOS
En este capítulo nos centraremos en probar diferentes métodos de selección de respuesta, con el objetivo de determinar la viabilidad tecnológica del proyecto. Utilizaremos diferentes conceptos y librerías en una base de datos pequeña, de unas 30 preguntas, y evaluaremos los resultados obtenidos.
La mecánica que se ha seguido para realizar el proyecto se puede observar en la Fig. 3.1. En primer lugar, se obtendrán los datos para rellenar la base de datos utilizando web scraping en Stack Overflow. Una vez tengamos nuestra base de datos de texto, será necesario procesarla con NLP; seguiremos las pautas que se han explicado en la sección 2.1. Como podemos ver, dependiendo de qué método de selección queremos utilizar – si es de entrenamiento o no – se usará NLTK o CountVectorizer. Posteriormente, se usarán los métodos de selección correspondientes: similtud entre preguntas, que podremos desarrollar tanto con similitud coseno como con el índice de Jaccard. O, por otro lado, usando modelos de IA; entre estos, podremos aplicar árboles de decisión, redes neuronales o deep learning.
Fig. 3.1 Estructura del proyecto.
3.1. Preparación de los datos
En este apartado obtendremos los datos de texto de una web de preguntas y respuestas y los convertiremos a formato numérico.
3.1.1. Obtención de datos con web scraping
Antes de poder generar modelos de selección de respuesta, necesitamos obtener los datos de Internet. Por este motivo, implementaremos web scraping a una página web con gran volumen de preguntas y respuestas: Stack Overflow (véase [25]). Para acceder a los datos, utilizaremos su API para que la demanda sea menos invasiva y de forma protocolaria. Seguiremos como guía la documentación de la API de Stack Exchange (véase [26]).
El primer paso es autentificarse en la API para poder acceder a la información de manera más consistente y sin tener que esperar un periodo de tiempo. Según la documentación, las aplicaciones de escritorio pueden autentificarse accediendo a un enlace, consiguiendo un token de acceso. Es lo que hace la función “get_url_questions() (Fig. 3.2).
Fig. 3.2 Autentificación en la API.
Una vez validados, ya podemos empezar a buscar información. Nuestro primer objetivo es coger 30 preguntas y sus 30 respuestas de la API y guardarlas en nuestra base de datos y obtener una primera muestra con la que poder trabajar. Para ello, accederemos a las preguntas mejor valoradas de Stack Overflow y escogeremos 30 al azar. Nos guardaremos los siguientes parámetros: título de la pregunta, enlace a la pregunta y el id de la respuesta considerada correcta o la mejor aceptada.
El siguiente paso es acceder a la respuesta de cada pregunta. No obstante, la API no nos permite acceder al texto de la respuesta. Por este motivo, decidimos complementar la búsqueda con BeautifulSoup. Con esta librería accederemos a la respuesta de la pregunta con los métodos find() y get_text() (Fig. 3.3).
Fig. 3.3 Accedemos a la respuesta de la pregunta con BeautifulSoup.
El último paso es comprobar que no haya preguntas repetidas y finalmente guardar los datos en una base de datos.
3.1.2. Conversión de los datos de texto a formato numérico con NLP
Los modelos de inteligencia artificial requieren de una entrada vectorial, por lo que el siguiente paso para la generación de modelos es la conversión de los
datos de texto a formato numérico. Se usarán las tecnologías explicadas en el apartado 2.1, NLTK y CountVectorizer.
3.1.2.1. Similitud entre preguntas
Como hemos mencionado en el anterior capítulo, estas implementaciones no requieren de un entrenamiento. Es decir, tras una pregunta de un usuario, aplicando este método se recorrerá la base de datos en la búsqueda de la mejor similitud.
Antes de calcular la similitud, mediante NLP (apartado 2.1), se separa la frase en palabras, luego nos quedamos con la raíz de la palabra, y finalmente quitamos las palabras que no aportan significado. Este proceso resultará en un vector de texto con las palabras más significativas de la pregunta.
Una vez tenemos procesados el vector de texto del usuario y el de la pregunta de la base de datos con la que queremos comparar, se creará un nuevo vector numérico a partir de la intersección entre estos. Podemos ver un ejemplo de este vector en la Fig. 3.4. A partir de este vector, podemos obtener la similaridad con diferentes métodos matemáticos; en este trabajo nos centraremos en la similitud coseno y el índice de Jaccard (apartado 2.2).
Finalmente, se compara la pregunta del usuario con toda la base de datos. La entrada de la base de datos que consiga una mejor similitud será la pregunta seleccionada. En la siguiente figura podemos ver una representación de la comparación de similitud de una pregunta de un usuario con la base de datos.
Fig. 3.4 Representación de comparación de similitud.
3.1.2.2. Modelos de inteligencia artificial
Esta etapa de los métodos de inteligencia artificial es un procesado previo al entrenamiento. En este preprocesado lo que se quiere obtener es una conversión de los datos de texto a formato numérico. Para este proceso hemos utilizado el método CountVectorizer de Sckit-learn.
Esta implementación genera un diccionario de palabras de la base de datos, para representar la importancia de cada palabra en las preguntas de la base de datos. Es decir, CountVectorizer genera una estructura numérica que contiene el número de veces que aparece cada palabra en una pregunta. En las Fig. 3.5 podemos ver una representación de estas estructuras numéricas.
Fig. 3.5 Representación del vector CountVectorizer.
A partir de este punto, podemos generar los modelos de inteligencia artificial con el vector creado y un identificador que enlace cada pregunta en formato numérico con la original.
3.2. Entrenamiento de modelos
En este apartado nos centraremos en la creación de diferentes modelos de selección de respuesta. Implementaremos tres tipos de inteligencia: los árboles de decisión, ya que permiten crear modelos eficaces y sencillos; las redes neuronales, por su gran implementación en diferentes ámbitos; y el deep learning de Keras, muy popular por su rendimiento.
En los modelos de redes neuronales y arboles de decisión aplicaremos la librería de Sckicit-learn, por otra parte, en el deep learning usaremos Tensorflow.
3.2.1. Entrenamiento de modelos con la librería de Sckicit-learn
Partiendo del preprocesado del apartado anterior, vamos a generar diferentes modelos usando la librería de Sckicit-learn. Este proceso es muy simple e intuitivo, ya que solo hay que importar el tipo de modelo que se quiera crear y pasarle el vector creado en el apartado 3.1.2.2 y un identificador, tal y como se puede ver en la Fig. 3.6.
3.2.2. Entrenamiento de modelos con la librería de Tensorflow
La segunda librería que hemos implementado es la de Tensorflow. La principal diferencia es la creación de capas que se apilan para crear un sistema de deep learning.
Para crear estas capas son indispensables dos aspectos: en primer lugar, se requiere que la primera capa tenga una dimensión de entrada (en la Fig. 3.7 está definido como “input_dim”) igual al número total de palabras diferentes del diccionario creado en el apartado 3.1.2.2; por otro lado, la capa final debe de tener una salida dimensional igual al número de identificadores (también en la
Fig. 3.7 se puede ver como “units”).
Fig. 3.7 Creación de las capas con Tensorflow.
El modelo que vamos a entrenar tiene dos capas con una salida dimensional de 20 en la primera capa y 31 en la última. Finalmente, una vez estructurado el modelo, se compila y se ajusta para nuestros datos.
3.3. Evaluación de resultados
A partir de este punto, donde hemos creado un modelo de cada tipo, vamos a proceder a hacer una evaluación de los resultados obtenidos. Para ello, hemos creado una lista de preguntas ‘Test_Similar_Questions.txt’ en la que están las preguntas de la base de datos, pero escritas de otra manera. Este documento se puede encontrar en el Anexo B.1.
El procedimiento de la comparativa será recorrer la lista de preguntas, simulando una pregunta de un usuario real, y obtener diferentes parámetros: número de aciertos, porcentaje de aciertos, tiempo de entrenamiento del modelo y tiempo de predicción. Tal y como ya habíamos mencionado anteriormente, y como podemos ver en la Fig. 3.8, los métodos de similitud de preguntas realizan todo el proceso de selección una vez la pregunta es realizada, ya que recorren toda la base de datos para encontrar la mejor respuesta. En cambio, los modelos de IA se entrenan previamente para agilizar este proceso y no tener que recorrer toda la base de datos.
Los resultados de la comparativa se encuentran en la siguiente Tabla 3.1.
Tabla 3.1. Comparativa de los resultados con 30 preguntas.
Número de preguntas: 30
Preguntas en la base de datos: 30
Método de selección de respuesta Número de aciertos Porcentaje de aciertos (%) Tiempo de entrenamiento del modelo (s) Tiempo de predicción (s) Cosine 29 96.67 - 0.86 Jaccard 29 96.67 - 0.77 Decision Tree 28 93.33 1.85 0.047 Neural Net 28 93.33 1.87 0.031 Deep L. 26 86.87 5.81 1.97
La anterior tabla nos muestra diferentes aspectos sobre los resultados obtenidos tras la simulación de los métodos de selección de respuesta:
En primer lugar, se puede observar el gran número de aciertos de todos los métodos. Además, todos los tiempos de predicción son muy bajos, destacando los de la librería Sklearn (Decison Tree y Neural Net), que son los más reducidos. Finalmente, podemos señalar que los tiempos de entrenamiento y predicción del Deep Learning son más elevados que los otros dos modelos.
3.4. Conclusiones
A continuación, vamos a realizar un pequeño análisis de los diferentes aspectos más relevantes del capítulo.
En primer lugar, queremos destacar el tipo de base de datos con la que hemos trabajado: una base de datos con 30 preguntas. Como ya hemos mencionado a lo largo del capítulo, esto ha sido así para empezar a realizar diferentes pruebas. En segundo lugar, los tiempos de simulación para este tipo de base de datos son muy pequeños en todos los métodos de selección de respuesta. Por este motivo, en este capítulo no consideraremos el tiempo como un factor crítico.
En tercer lugar, la librería de Tensorflow (Deep Learning) es más sofisticada que la de Sklearn, ya que requiere de más preparación y más tiempo. Sin embargo, los resultados obtenidos en esta primera evaluación son muy parecidos.
Y, por último, todos los métodos analizados han conseguido un muy buen porcentaje de aciertos. Este resultado nos permite determinar positivamente la viabilidad tecnológica de estos métodos de selección de respuesta.
Con todo el trabajo realizado, si se pretende realizar un chatbot con un abanico de preguntas bastante limitado, recomendamos implementar un mecanismo basado en similitud por su gran rendimiento y sencillez. Por otro lado, si se pretende implementar un bot con una base de datos más grande, le invitamos a seguir leyendo los próximos capítulos.
CAPÍTULO 4.
ANÁLISIS Y EVALUACIÓN DE MODELOS
CON UNA BASE DE DATOS MÁS REALISTA
En este capítulo vamos a generar modelos de inteligencia artificial para una base de datos con 1688 preguntas y respuestas. El objetivo es determinar cómo influye el aumento del dataset, si siguen siendo viables los métodos de selección de respuesta del capítulo 3 e intentar mejorar los modelos con la modificación de sus parámetros.
Hemos añadido las preguntas de la base de datos anterior para realizar la comparativa con el mismo fichero de preguntas que el capítulo anterior.
4.1. Influencia del aumento de preguntas en la base de datos
En este apartado vamos a observar el comportamiento de los diferentes métodos de selección de respuesta con la nueva base de datos. Para ello, hemos creado los mismos modelos que en el anterior capítulo y, en la siguiente tabla (Tabla4.1) podemos ver los resultados de realizar las 30 preguntas del archivo
“Test_Similar_Questions.txt”.
Tabla 4.1. Evaluación de los modelos tras el aumento de preguntas en la base
de datos.
Número de preguntas realizadas: 30 Preguntas en la base de datos: 1688 Método comparativo Número de aciertos Porcentaje de aciertos (%) Tiempo de entrenamiento del modelo (s) Tiempo de predicción (s) Cosine 26 86.67 - 45.05 Jaccard 24 80 - 40.76 Decision Tree 22 73.73 86.59 0.047 Neural Net 24 80 75.65 0.078 Deep L. 17 56.67 51.90 0.45
Si analizamos la anterior tabla, podemos ver que, tras ampliar la base de datos, todos los métodos de selección de respuesta bajan su rendimiento, aunque en general sigue siendo bastante alto. El método con más bajada de rendimiento es el modelo de deep learning. Una de las posibles causas podría deberse a que hemos utilizado la misma red que en el capítulo 3, y por este motivo, esta red quizás es demasiado simple. Lo analizaremos en profundidad en el apartado 4.2. Otro aspecto muy importante es el tiempo de predicción de los modelos de distancia (Cosine y Jaccard), que han aumentado un 5150% con respecto al capítulo anterior. Esto es debido a que hacen una comparativa de similitud para cada pregunta en la base de datos, y cuantas más preguntas haya en la base de datos, más tiempo costará obtener una predicción. Por este motivo, y debido a
la orientación del proyecto a construir un chatbot a tiempo real, las implementaciones de distancia las consideraremos no viables.
Nos gustaría remarcar que la importancia del tiempo de creación de modelos no es tanta como el tiempo de simulación, ya que los modelos, una vez entrenados, sólo se tienen que volver a entrenar si hay un cambio en la base de datos; por otro lado, el tiempo de simulación es crítico para tener una respuesta inmediata.
4.2. Análisis en la construcción de la red de deep learning
En este apartado nos centraremos en ajustar las características de la red en el deep learning para analizar su comportamiento e intentar obtener mejores resultados que en la primera evaluación.
En primer lugar, analizaremos como afecta la modificación de la unidad de salida dimensional de las capas, y después estudiaremos el impacto de añadir más capas y crear una red más compleja.
4.2.1. Análisis de la salida dimensional
El primer análisis que vamos a realizar es la modificación de la salida dimensional (units) (véase [27]) para una red neuronal de dos capas. Este parámetro afecta a la percepción del sistema añadiendo más o menos neuronas en la construcción de la red.
Vamos a realizar un estudio sobre cómo afecta la salida dimensional creando diferentes modelos y haciendo una comparativa. Las dimensiones escogidas son: 5, 10, 15, 20, 100, 250, 500, 1000, 1250, 1500 y 1688. Hemos escogido un gran abanico de opciones que van desde una dimensión bastante pequeña (5), hasta la máxima permitida (ya que 1688 son el número total de preguntas de la base de datos). En la Fig. 4.1 tal podemos ver una gráfica de los resultados obtenidos.
Fig. 4.1 Análisis de la salida dimensional para una red de dos capas con
Tensorflow.
De la anterior gráfica podemos apreciar que si aumentamos la salida dimensional mejora la precisión del sistema. Sin embargo, a partir de una dimensión de salida igual a 100 el sistema obtiene resultados estables. Por otro lado, vemos que aumentar la dimensión de salida crea una red más compleja, que se traduce en más tiempo de entrenamiento de modelo.
4.2.2. Análisis del número de capas
Tras el primer análisis de las unidades de salida dimensional para una red de dos capas, vamos a estudiar cómo afecta el número de capas en los modelos de deep learning.
Hemos creado modelos con 2, 3, 4, 5, 6, 10 y 15 capas, y en cada capa, hemos ido variando la dimensión de salida en 5, 10, 15, 20, 100, 250, 1000 y 1688. Los resultados se pueden ver en las siguientes gráficas (Fig. 4.2, Fig. 4.3).
Fig. 4.2 Comparativa de la precisión con el tiempo de entrenamiento en
Tensorflow.
Fig. 4.3 Comparativa de la precisión con el tiempo de predicción en Tensorflow.
De estas gráficas podemos extraer varias conclusiones: en primer lugar, una red más compleja (más número de capas y de salida dimensional) no comporta un mejor rendimiento del sistema. Esto se puede reflejar viendo que los mejores resultados se dan en la red de dos capas. Además, destacamos el buen rendimiento que consigue la red de 4 capas en dimensiones de salida bastante bajos, contrastando con la red de 2 capas, que sus mejores resultados vienen de dimensiones más elevadas.
Por otro lado, las redes más complejas no solo son más lentas (tanto entrenando como prediciendo), si no que no consiguen producir buenas selecciones de respuesta.
En el Anexo B.2 podemos encontrar una tabla con todos los datos con los que se han obtenido las gráficas anteriores. Finalmente, el modelo con mayor precisión es la red de 2 capas con una dimensión de salida de 250, con rendimiento del 83,33 %.
4.3. Conclusiones
De este capítulo, donde hemos generado modelos con una base de datos más grande, podemos destacar diferentes análisis:
Queremos remarcar la inviabilidad de los métodos de selección de respuesta por distancia entre preguntas si se quiere implementar un mecanismo a tiempo real. Como hemos mencionado anteriormente, esto es debido a que estos métodos comparan la pregunta del usuario con toda la base de datos, aumentando mucho el tiempo de simulación.
Recomendamos el uso de sistemas de redes neuronales, ya que permiten obtener muy buenos resultados con un coste muy bajo. Además, su implementación es relativamente sencilla, comparado con otros métodos como el deep learning. Los árboles de decisión también entran en este bloque, aunque tienen menos precisión que las redes neuronales.
Finalmente, aconsejamos no implementar modelos de deep learning si la base de datos con la que se trabaja se actualiza frecuentemente. Esto es así porque la implementación de este tipo de modelos requiere de una personalización de la red bastante precisa.
CAPÍTULO 5.
GENERACIÓN ARTIFICIAL DE
PREGUNTAS
En este capítulo vamos a generar modelos modificando la base de datos. Creemos que el formato de la base de datos que hemos usado hasta ahora no es el mejor, debido a que cada pregunta de la base de datos solo cuenta con una muestra. Esto hace que sea difícil encontrar patrones para que los métodos de IA entrenen el modelo.
Para intentar solventar esta limitación, modificaremos la base de datos usada en el capítulo 4 añadiendo muestras de las preguntas. Contaremos con dos métodos de modificación: la generación manual de preguntas y la generación sintética de preguntas.
5.1. Generación manual de preguntas
La generación manual de preguntas consistirá de dos métodos: en el primero, añadiremos muestras a la base de datos multiplicando las preguntas que ya tenemos. En el segundo, implementaremos web scraping a una página web de modificación de frases para aumentar las muestras.
5.1.1. Multiplicación de muestras
La multiplicación de muestras es el primer método que vamos a utilizar para obtener más datos de entrenamiento de modelos. Cada pregunta de la base de datos se añadirá 30 veces, es decir que cada pregunta tendrá 31 muestras. Recordemos que partimos de una base de datos con 1688 preguntas, así que en la base de datos habrá 52328 preguntas.
A continuación, vamos a realizar modelos de árboles de decisión, redes neuronales y deep learning, tal y como hemos hecho en los anteriores capítulos. En cuanto al deep learning, implementaremos la estructura de capas que mejor nos ha funcionado en el apartado 4.2: 2 capas de dimensión de salida 250. Además, implementaremos otro modelo de deep learning con una capa adicional llamada Dropout. Esta capa añade aleatoriamente ruido modificando la entrada de preguntas (véase [28]); es decir que, junto a la multiplicación de muestras, el ruido nos permitirá generar muestras diferentes.
En la siguiente Tabla 5.1 podemos ver los resultados de la creación de modelos con la base de datos multiplicada.
Tabla 5.1. Comparativa de modelos en una base de datos con muestras
multiplicadas 31 veces.
Número de preguntas realizadas: 30 Preguntas en la base de datos: 52328
Método comparativo Número de aciertos Porcentaje de aciertos (%) Tiempo de entrenamiento del modelo (s) Tiempo de predicción (s) Decision Tree 13 43.33 202.19 0.32 Neural Net 24 80 1290 0.51 Deep L. 25 83.33 3853 0.82 Deep L. with Dropout 26 86.67 3489 1.65
De la anterior tabla, podemos destacar que el árbol de decisión empeora tras el aumento de muestras en la base de datos. En cambio, el modelo de redes neuronales se mantiene igual que en el apartado 4.1, aunque aumentando los tiempos de entrenamiento y predicción. Del mismo modo, el modelo de deep learning sin dropout también consigue igualar su resultado en el apartado 4.2.2. Sin embargo, el modelo con dropout consigue obtener el máximo resultado hasta ahora, con 26 aciertos de 30.
5.1.2. Generación de preguntas a través de páginas web
En este apartado, la modificación de la base de datos se hará mediante web scraping a una página web llamada “Web-hobbies”. Esta página web contiene un elemento que reescribe una frase, en la medida de lo posible, de otra forma (véase [29]).
El resultado de web scrapear esta página web es obtener dos muestras para cada pregunta de la base de datos, eso sí, parcialmente distintas. El resultado de los diferentes modelos creados se puede ver en la Tabla 5.2.
Tabla 5.2. Comparativa de modelos para la base de datos extendida con web
scraping.
Número de preguntas realizadas: 30 Preguntas en la base de datos: 3376 Método comparativo Número de aciertos Porcentaje de aciertos (%) Tiempo de entrenamiento del modelo (s) Tiempo de predicción (s) Decision Tree 13 43.33 100,63 0.18 Neural Net 25 83.33 257.98 0.08 Deep L. 26 86.67 237.01 0.64
De la anterior comparativa, remarcamos que el árbol de decisión sigue obteniendo malos resultados; sin embargo, las redes neuronales y el deep learning han conseguido mejorado los resultados del capítulo anterior.
5.2. Generación sintética de preguntas
La generación sintética de preguntas se realizará mediante una técnica llamada SMOTE (Synthetic Minority Over-sampling Technique), que como su nombre indica, es una técnica de aumentación de muestras. Suele ser usada en datasets no balanceados, con alguna clase de clasificación con menos muestras que las demás. Para más información se puede visitar el siguiente documento (véase [30]).
Para aplicar Smote en Python usaremos la librería imblearn. Tal y cómo se puede ver en la Fig. 5.1, antes de crear el modelo se modifican los datos con la función Smote. Sin embargo, el número de muestras no aumenta tras este proceso (Fig.
5.2). Hemos probado tanto la base de datos sin modificar, como la duplicada y
la extendida con la página web en el anterior apartado, y el resultado es el mismo en todas.
Fig. 5.1 Aplicar Smote en Python.
Fig. 5.2 Longitud de las dimensiones de los vectores para la base de datos sin
modificar.
Creemos que el principal motivo por el que no se generan nuevas muestras con Smote es debido a la poca cantidad de muestras diferentes que contiene la base de datos. Generalmente, Smote se aplica en bases de datos no balanceados y, aunque nuestro dataset no es ideal, sí que está balanceado. Es decir, sí que contiene un número de muestras igual para cada pregunta.
5.3. Conclusiones
En este capítulo hemos modificado nuestro dataset con el objetivo de mejorar los resultados del capítulo 4. Podemos destacar las siguientes conclusiones: En primer lugar, y como ya hemos mencionado anteriormente, destacamos que los modelos de árboles de decisión empeoran cuando se complica el dataset. Esto creemos que es así porque por su estructura no se adapta bien a variaciones.
Por otro lado, nos ha sorprendido el excelente rendimiento del modelo de deep learning con dropout para la base de datos duplicada. Del mismo modo, la base de datos extendida a través de páginas web ha conseguido mejorar los resultados del anterior capítulo para los modelos de redes neuronales y de deep learning.
Por último, la generación artificial de preguntas con Smote no nos ha permitido añadir muestras al dataset. Este apartado podría mejorarse en un futuro a través de una base de datos con más muestras por pregunta.
CAPÍTULO 6.
MY BOT WILLIAM
En este capítulo vamos a definir y preparar nuestro chatbot con todo lo aprendido en este trabajo. Después probaremos la funcionalidad del bot.
6.1. Características del chatbot
6.1.1. Base de datos
El primer paso para la construcción del chatbot es escoger la base de datos que queremos usar. Después del capítulo 5, tenemos tres opciones: la base de datos sin modificar, la base de datos duplicada y la base de datos extendida con páginas web.
La que creemos que tiene menos sentido usar es la base de datos duplicada, ya que aporta más carga de trabajo y lentitud en comparación a las otras dos. Por otro lado, la base de datos extendida es un poco más difícil de mantener si se quieren añadir más preguntas en un futuro. Por este motivo, implementaremos la base de datos sin modificar.
6.1.2. Modelo de selección de respuesta
Una vez escogida la base de datos, debemos escoger el modelo de selección de respuesta que vamos a implementar en nuestro bot. Recordemos que debido a la orientación de hacer un chatbot a tiempo real, ya descartamos los métodos de selección por similitud.
En este caso, también tenemos tres opciones para escoger: los modelos de árboles de decisión, los modelos de redes neuronales y los modelos de deep learning. En primer lugar, descartaremos los modelos de árboles de decisión porque se ven solapados con los modelos de redes neuronales. Es decir, los árboles de decisión son peores en rendimiento que las redes neuronales. En cuanto a si implementar los modelos de redes neuronales o los de deep learning, nos hemos decidido a usar los de redes neuronales. Esto es debido a su menor complejidad y mejores tiempos. Además, son mucho más fáciles de mantener. En resumen, vamos a implementar un modelo de redes neuronales a partir de la base de datos sin modificar.
6.2. Uso del chatbot
En este apartado vamos a probar la funcionalidad del chatbot haciendo preguntas sobre programación.
Para empezar, la interfaz de pregunta y respuesta cumple con la función de un bot conversacional. Es decir, al empezar la conversación el bot se introduce y te explica como finalizar la aplicación, tal y como se puede ver en la Fig. 6.1.
Fig. 6.1 Interfaz del chatbot MyBotWilliam.
En cuanto al rendimiento de la aplicación, se ha añadido una capa de filtrado en la que se compara la pregunta del usuario con la predicha por el modelo (con similitud coseno). Si las dos frases no se parecen en ninguna palabra, el bot reconocerá su falta de entendimiento y devolverá una oración predefinida: “Excuse me, I did not understand that.”.
Sin embargo, tras probar el bot varias veces, podemos extraer diferentes inconvenientes. El principal obstáculo para el uso del bot es tener que saber que preguntas hay en la base de datos para poder preguntarle de manera eficiente. De otro modo, el bot no sabrá que responderte y el resultado siempre será la frase predefinida. Además, aunque el tema de tu pregunta y la seleccionada por el bot pueda estar relacionado, la respuesta obtenida no siempre es lo que se busca. Incluso, la respuesta muchas veces es demasiado extensa.
Las siguientes imágenes (Fig. 6.2, Fig. 6.3 y Fig. 6.4) son un ejemplo de la funcionalidad del chatbot. En primer lugar, en la Fig. 6.2 William no es capaz de encontrar la respuesta a la pregunta, aunque sí que está en la base de datos. Por otro lado, en la Fig. 6.3 el chatbot ofrece una respuesta relacionada con el tema y, en cambio en la figura Fig. 6.4 se responde a la pregunta correctamente.
Fig. 6.2 Funcionalidad del chatbot I; no encuentra la respuesta.
CAPÍTULO 7.
Conclusiones del trabajo
En el último capítulo del trabajo, vamos a recopilar las conclusiones que se han obtenido en este trabajo y determinar qué objetivos del proyecto se han cumplido. Por otro lado, también se hará una valoración personal acerca del proyecto realizado y, finalmente, habrá un apartado destinado a futuros proyectos relacionados.
7.1. Conclusiones técnicas
A continuación, vamos a recapitular los detalles técnicos más relevantes del trabajo. Para empezar, en el capítulo 3 hemos demostrado la viabilidad tecnológica de los diferentes métodos de selección de respuesta probados. La viabilidad ha sido demostrada porque todos los métodos implementados han conseguido proporcionar respuestas adecuadas.
La principal característica de un chatbot a tiempo real es la rapidez de predicción del modelo, ya que es crítica para una respuesta inmediata. Por este motivo, los métodos de similitud no son apropiados en chatbots a tiempo real con bases de datos extensas. Esto es así debido a que tienen que comparar la pregunta del usuario con todas las entradas de la base de datos.
Sin embargo, si se quiere realizar un chatbot con un abanico de respuestas bastante limitado, sí que recomendamos el uso de métodos de selección de respuesta por similitud. Esto es debido a la sencillez de su implementación, el gran rendimiento que se obtiene y porque los tiempos de predicción no se elevan demasiado. Por el contrario, si se quiere construir un bot de selección de respuestas con una base de datos extensa, recomendamos el uso de modelos de redes neuronales, tal y como hemos aplicado en el capítulo 6.
En el capítulo 5, hemos visto que al hacer más compleja la base de datos los árboles de decisión empeoran los resultados. Esto se produce debido a la facilidad de estos modelos a saturarse debido a su estructura en árbol. No obstante, en los modelos de deep learning, al agregar ruido para simular más muestras en la base de datos, se han obtenido unos resultados mejores. Finalmente, al aplicar Smote para obtener más muestras de la base de datos, hemos visto que no se han podido generar más preguntas sintéticamente, debido a la falta de patrones.
7.2. Objetivos del trabajo y trabajo pendiente
Una vez comentadas las conclusiones del trabajo, haremos un repaso sobre los objetivos determinados al principio del trabajo y si los hemos logrado.
• Hemos creado una base de datos para el chatbot a partir del web scraping.
• Hemos creado diferentes modelos de selección de respuesta con las tecnologías de IA más comunes.
• Hemos modificado el dataset para determinar la afectación en el rendimiento del chatbot.
• Hemos desarrollado un chatbot a tiempo real. • El chatbot responde preguntas de programación.
• El chatbot no puede agilizar la resolución de dudas de los alumnos. En cuanto al trabajo pendiente, si se quiere ampliar el trabajo realizado en este proyecto, recomendamos la creación de una base de datos más específica de la asignatura que los alumnos y los profesores puedan ir ampliando progresivamente. Esta nueva base de datos permitiría mejorar la capacidad del chatbot en la agilización de la resolución de dudas de los alumnos.
Otra idea de mejora sería trabajar en la relación entre pregunta y respuesta, tal y como hemos intentando en el capítulo 5. El motivo tras esto es que los modelos de IA trabajan mejor cuando hay más patrones con los que relacionar los datos. Mejoraría mucho la capacidad de respuesta del chatbot tener varias opciones de pregunta para cada respuesta, para así afinar la búsqueda.
Por último, creemos que una vía de mejora interesante es trabajar en la solución del problema de que el bot puede sobredetectar o no detectar la respuesta. Es decir, si la pregunta y la respuesta coinciden en temática (tienen palabras clave comunes) pero no está respondiendo realmente a tu pregunta, consideramos que está sobredetectando. En cambio, es posible que, debido a la formulación de la pregunta, las palabras clave no sean exactas o se traten de sinónimos y éste no encuentre ninguna relación y no detecte ninguna respuesta. Para solventarlo, sería interesante trabajar en un conjunto de palabras que sean sinónimos o que estén relacionadas. Una librería en Python que puede implementar esto es Word2Vec.
7.3. Valoración personal del proyecto
En este apartado, valoraré tanto de forma académica como personal el resultado de este proyecto, MyBotWilliam.
En cuanto a el proyecto en sí, si tuviese que volver a empezarlo, creo que seguiría en la misma línea de trabajo centrándome en Python, como me recomendó mi tutor. Todas las librerías tienen mucha documentación accesible, además de que mucha gente trabaja con ellas, lo que ha facilitado la resolución de dudas. Un factor determinante que estaría bien reconsiderar es el método usado para rellenar la base de datos. En lugar de bajar las preguntas de una página web de preguntas y respuestas, estaría bien buscar alternativas con más preguntas por cada respuesta.
En el ámbito personal, me ha permitido mejorar en mis habilidades de programación y aprender conceptos que no conocía, como recoger información de páginas web mediante una API y web scraping. Me ha ayudado a ampliar los conocimientos adquiridos durante la carrera en asignaturas como Informática I y
II, donde trabajamos con bases de datos, y en Aeropuertos Inteligentes y Gestión de Instalaciones, donde hemos estudiado brevemente los conceptos básicos de la IA. Por otro lado, realizar un proyecto de este tamaño me ha permitido mejorar mis capacidades organizativas y adentrarme en el mundo de la inteligencia artificial, que me ha descubierto posibilidades laborales que no me había planteado.
En resumen, mi experiencia en este trabajo ha sido positiva, aunque no se hayan cumplido todos los objetivos del proyecto, me voy satisfecho con el trabajo y esfuerzo realizado. Me gustaría aprovechar para agradecer a mi tutor, Roc Meseguer, por su implicación a lo largo de estos meses, ya que me ha guiado y ayudado activamente durante todo proyecto.