QuestionClustering

Clasificador de preguntas escrito en python 3 que fue implementado en el siguiente vídeo: https://youtu.be/qnlW1m6lPoY

MIT License

Stars
15

Clasificador de Preguntas

El objetivo de este proyecto es implementar un algoritmo no supervisado capaz de agrupar preguntas, permitiendo as, dadas un gran nmero de preguntas, detectar cuales son similares entre ellas. De esta forma, podramos saber cuales son las preguntas ms recurrentes, los temas de inters ms relevantes... de un grupo de usuarios. Cree este proyecto por que pens que sera muy til para los streaming que realiz en la plataforma youtube donde mis seguidores pueden preguntar sus dudas, en ocasiones en nmero de preguntas es tan alto que es imposible responder a todas, sin embargo, muchas de las preguntas se repiten constantemente, por lo que esta aplicacin podr ser extremadamente til.

README OBSOLETO, SE ACTUALIZAR A LA VERSIN 2.0 CUANDO TENGA TIEMPO. MIENTRAS TANTO AQU EST EXPLICADO TODO LO QUE HE HECHO Y LOS RESULTADOS OBTENIDOS (https://github.com/ikergarcia1996/QuestionClustering/releases/download/2.0/Measuring_Question_Similarity_GitHub.pdf)

Qu se ha hecho hasta ahora?

Ahora mismo hay dos funciones principales que permiten extraer informacin de un grupo de preguntas:

  • Clustering: Aplica el algoritmo kmeans sobre las preguntas transformadas a una representacin vectorial.
  • k_nearest: Dada una pregunta, responde con las k preguntas ms cercanas usando como mtrica la similitud coseno.

A parte de esto se han implementado funciones para obtener todas las preguntas de un chat de youtube, y un gestor de preguntas que normaliza las preguntas (tokenizacin, eliminacin de palabras poco relevantes, eliminacin de smbolos y emoticonos...), calcula las palabras que ms se repiten y transforma las preguntas a representaciones vectoriales. Para esto ltimo, se calcula la representacin vectorial para una pregunta como la media de los vectores que representan a las palabras que la forman (Tras normalizar la pregunta). Las representaciones vectoriales de palabras se han obtenido aplicando el algoritmo FastText (https://fasttext.cc/) sobre un corpus generado a partir de texto extrado de webs de noticias tecnolgicas espaolas usando el crawler https://github.com/fhamborg/news-please

Direcciones futuras

De momento, el algoritmo no proporciona resultados de la calidad esperada, por lo que son necesarias mejoras. Algunas ideas son:

  • Modificar el corpus de entrenamiento de los word embeddings para que los word embeddings sean capaces de representar conocimiento del tipo "El 1700X es un procesador Ryzen, el 8700K es un procesador intel, la 2060 es una GPU de Nvidia..." puesto que parece que esa clase de conocimiento no se ha capturado. Una manera de hacer esto es modificando la ventana usada por los algoritmos de generacin de word embeddings.

  • Modificar el algoritmo de clustering para usar como medida la similitud coseno. Parece que la funcin k_nearest si obtiene los resultados esperados, es posible que el clustering de mejores resultados si en vez de usar la implementacin por defecto del kmeans (sklearn) usaremos un algoritmo que use como distancia la similitud coseno.

  • Entrenar sentence embeddings en vez de word embeddings, quiz buscar la forma de aplicar encoders como BERT, ELMO... a este problema.

  • Aadir informacin que conviertan el problema en una tarea supervisada o semi-supervisada, por ejemplo generar un dataset donde dadas dos frases se diga si son similares o no. El problema es que esto llevara demasiado tiempo...

Autores

Iker Garca Ferrero - ikergarcia1996

Toda ayuda es bienvenida, si quieres aportar al proyecto te animo a hacerlo, ya sea haciendo un pull request con cdigo que hayas implementado como aportando ideas para mejorar el algoritmo!!!

Qu hay en este directorio?

  • QuestionCluster.ipynb: Jupyter Notebook con los algoritmos para clasificar preguntas y descargar preguntas desde un chat de youtube.
  • embedding.py: Cdigo python3 que se encarga de cargar word embeddings y manipularlos (por ejemplo incluye funciones como word_to_vector que dada una palabra devuelve el vector que la representa)
  • vocabulary.py: Gestor del vocabulario de un word embeddings, es una dependencia de embedding.py
  • utils.py: Algunas funciones tiles para diferentes tareas, es una dependencia de embedding.py
  • json_to_text.py: Transoforma el output (archivos json) de news-please (https://github.com/fhamborg/news-please) a un nico archivo txt que contiene solo el texto de las noticias descargadas por news-please
  • leidas.txt: Durante el directo de youtube donde se implement la primera versin de este programa se descargaron una gran cantidad de preguntas realizadas por los espectadores. El programa descargaba el chat completo cada 0.2 segundos, por lo que las preguntas se repiten decenas de veces, una vez eliminadas las duplicadas hay 309 preguntas.
  • test_questions.txt: 68 preguntas recopiladas a mano de este directo: https://youtu.be/aRKSRGDva84

Word Embeddings

Para ejecutar el cdigo necesitas word embeddings. He generado unos en espaol especializados en el dominio tecnolgico. Para ello usando news-please (https://github.com/fhamborg/news-please) he descargado noticias de las principales webs de noticias tecnolgicas en espaol y he aplicado dos algoritmos de generacin de word embeddings. FastText (https://fasttext.cc) y GloVe (https://nlp.stanford.edu/projects/glove/). En ambos casos se han usado los parmetros por defecto del algoritmo y todas las letras del corpus se han transformado a minsculas.

Qu puedo hacer con este cdigo?

Lo que quieras :D Eres libre de hacer lo que te de la gana con l, usarlo en tus programas, hacer un nuevo programa basado en l, modificarlo como quieras, redistribuirlo... Lo nico que te pido es que cites a todas las personas que hayan aportado su granito de arena al proyecto, se incluirn todas en la seccin autores que se encuentra un poco ms arriba. Cualquier programa derivado, copia, modificacin... de este programa debe usar la licencia MIT al igual que todo el contenido de este github, para ms informacin consulta el archivo LICENSE (https://github.com/ikergarcia1996/QuestionClustering/blob/master/LICENSE)