Este proyecto estaba pensado originalmente para un curso de IA en la Universidad de Sofía. Durante su ejecución, tuve limitaciones de tiempo y no pude implementar todas las ideas que tenía, pero planeo continuar trabajando en ello... y retomé el tema para mi tesis de maestría, usando Transformadores T5 para generar preguntas. responder en parejas junto con distractores . Compruébalo en el repositorio de Question-Generation-Transformers.
El enfoque para identificar palabras clave utilizadas como respuestas objetivo se aceptó en la conferencia RANLP2021: Generación de candidatos de respuestas para cuestionarios y generadores de preguntas con reconocimiento de respuestas.
La idea es generar respuestas de opción múltiple a partir de texto, dividiendo este complejo problema en pasos más simples:
Para evitar conflictos con paquetes de Python de otros proyectos, es una buena práctica crear un entorno virtual en el que se instalarán los paquetes. Si no desea esto, puede omitir los siguientes comandos e instalar directamente el archivo requisitos.txt.
Crea un entorno virtual:
python -m venv venv
Ingrese al entorno virtual:
Ventanas:
. .venvScriptsactivate
Linux o Mac OS
source .venvScriptsactivate
Instale ipython dentro del venv:
ipython kernel install --user --name=.venv
Instale jupyter lab dentro del venv:
pip install jupyterlab
pip install -r .requirements.txt
jupyter lab
Antes de poder hacer algo, quería entender más sobre cómo se hacen las preguntas y qué tipo de palabras son las respuestas.
Utilicé el conjunto de datos SQuAD 1.0 que tiene alrededor de 100 000 preguntas generadas a partir de artículos de Wikipedia.
Puede leer sobre los conocimientos que encontré en el cuaderno jupyter de exploración de datos .
Mi suposición era que las palabras del texto serían excelentes respuestas a las preguntas . Todo lo que tenía que hacer era decidir qué palabras o frases cortas eran lo suficientemente buenas como para convertirse en respuestas.
Decidí hacer una clasificación binaria de cada palabra del texto. spaCy realmente me ayudó con el etiquetado de palabras.
Prácticamente necesitaba crear todo el conjunto de datos para la clasificación binaria. Extraje cada palabra continua de los párrafos de cada pregunta en el conjunto de datos SQuAD y le agregué algunas características como:
Y la etiqueta es Respuesta : si la palabra extraída del párrafo es la misma y está en el mismo lugar que la respuesta de la pregunta SQuAD.
Algunas otras características como la puntuación TF-IDF y la similitud del coseno con el título serían geniales, pero no tuve tiempo de agregarlas.
Aparte de eso, depende de nuestra imaginación crear nuevas funciones, tal vez ya sea al principio, en la mitad o al final de una oración, información sobre las palabras que la rodean y más... Aunque antes de agregar más funciones sería bueno tener una métrica para evaluar si la función será útil o no.
Encontré que el problema es similar al filtrado de spam , donde un enfoque común es etiquetar cada palabra de un correo electrónico como proveniente de un correo electrónico no deseado o no.
Utilicé el algoritmo Gaussian Naive Bayes de scikit-learn para clasificar cada palabra si es una respuesta.
Los resultados fueron sorprendentemente buenos: de un vistazo rápido, el algoritmo clasificó la mayoría de las palabras como respuestas. Los que no lo hicieron, de hecho, no eran aptos.
Lo bueno de Naive Bayes es que obtienes la probabilidad de cada palabra. En la demostración, lo usé para ordenar las palabras desde la respuesta más probable a la menos probable.
Otra suposición que tuve fue que la oración de una respuesta podría convertirse fácilmente en una pregunta . Con solo colocar un espacio en blanco en la posición de la respuesta en el texto obtengo una pregunta "cloze" (oración con un espacio en blanco para la palabra que falta)
Respuesta: oxígeno
Pregunta: _____ es un elemento químico de símbolo O y número atómico 8.
Decidí que no valía la pena transformar la pregunta cerrada en una oración más parecida a una pregunta, pero imagino que se podría hacer con una red neuronal seq2seq , de manera similar a la forma en que se traduce el texto de un idioma a otro.
La parte salió muy bien.
Para cada respuesta, genero las palabras más similares usando incrustaciones de palabras y similitud de coseno .
La mayoría de las palabras están bien y podrían confundirse fácilmente con la respuesta correcta. Pero hay algunas que evidentemente no son apropiadas.
Como no tenía un conjunto de datos con respuestas incorrectas, recurrí a un enfoque más clásico.
Eliminé las palabras que no eran la misma parte del discurso o la misma entidad con el mismo nombre que la respuesta y agregué más contexto a la pregunta.
Me gustaría encontrar un conjunto de datos con respuestas de opción múltiple y ver si puedo crear un modelo de ML para generar mejores respuestas incorrectas.
Después de agregar un proyecto de demostración, las preguntas generadas no son realmente aptas para entrar en un aula al instante, pero tampoco son malas.
Lo bueno es la simplicidad y modularidad del enfoque, donde puedes encontrar dónde está funcionando mal ( por ejemplo, al clasificar los verbos ) y solucionarlo.
Tener una red neuronal compleja ( como lo hacen todos los artículos sobre estos temas ) probablemente funcionará mejor, especialmente en la época en que vivimos. Pero lo mejor que descubrí sobre este enfoque es que es como una puerta de entrada para que un ingeniero de software , con su mentalidad de ingeniería de software, ingrese al campo de la IA y vea resultados significativos.
Este tema me parece bastante interesante y con mucho potencial. Probablemente continuaría trabajando en este campo.
Incluso me inscribí en una Maestría en Minería de Datos y probablemente haga algunos proyectos similares. Vincularé cualquier cosa útil aquí.
Ya dediqué más tiempo a terminar el proyecto, pero me gustaría transformarlo más en un tutorial sobre cómo ingresar al campo de la IA y al mismo tiempo tener la capacidad de ampliarlo fácilmente con nuevas funciones personalizadas.
Actualización - 29.12.19: El repositorio se ha vuelto bastante popular, así que agregué un nuevo cuaderno ( Demo.ipynb ) que combina todos los módulos y genera preguntas para cualquier texto. Reordené los otros cuadernos y documenté el código (un poco mejor).
Actualización - 03.09.21: Se agregó un archivo requisitos.txt con instrucciones para ejecutar un entorno virtual y se corrigió el error con ValueError: los operandos no se pudieron transmitir junto con las formas (230, 121) (83,)
También comencé a trabajar en mi tesis de maestría con un tema similar de generación de preguntas.
Actualización - 27.10.21: He subido el código de mi tesis de maestría en el repositorio Question-Generation-Transformers. Te animo encarecidamente a que lo compruebes.
Además, el enfoque que utiliza un clasificador para seleccionar las respuestas candidatas se aceptó como trabajo de los estudiantes en la conferencia RANLP2021. Papel aquí.