Estoy tratando de usar CNN (red neuronal convolucional) para clasificar documentos. CNN para textos cortos / oraciones ha sido estudiado en muchos artículos. Sin embargo, parece que ningún documento ha utilizado CNN para textos o documentos largos.
Mi problema es que hay demasiadas características de un documento. En mi conjunto de datos, cada documento tiene más de 1000 tokens / palabras. Para alimentar cada ejemplo a una CNN, convierto cada documento en una matriz usando word2vec o guante que resulta en una matriz grande. Para cada matriz, la altura es la longitud del documento y el ancho es el tamaño del vector de incrustación de palabras. Mi conjunto de datos tiene más de 9000 ejemplos y lleva mucho tiempo entrenar la red (una semana completa), lo que dificulta el ajuste de los parámetros.
Otro método de extracción de características es usar un vector de un solo hot para cada palabra, pero esto creará matrices muy dispersas. Y, por supuesto, este método incluso lleva más tiempo entrenar que el método anterior.
Entonces, ¿hay un mejor método para extraer características sin crear grandes matrices de entrada?
¿Y cómo debemos manejar documentos de longitud variable? Actualmente, agrego cadenas especiales para que el documento tenga la misma longitud, pero no creo que sea una buena solución.
fuente
Respuestas:
Puede reducir la longitud de sus datos de entrada al representar sus documentos como series de vectores de oraciones en lugar de una serie más larga de vectores de palabras. Doc2vec es una forma de hacerlo (cada oración sería un "documento").
Si no desea usar Doc2vec, una forma de crear los vectores de las oraciones sería promediar los vectores de palabras para cada oración, dándole un solo vector del mismo ancho para cada oración. Puede que esto no sea tan preciso como algunos métodos disponibles a través de Doc2Vec, pero lo he usado con bastante éxito para el modelado de temas.
De cualquier manera, una vez que tenga sus vectores de oraciones, alinéelos en secuencia para cada documento como ya lo está haciendo para sus vectores de palabras y luego pase por su modelo. Debido a que la longitud de la secuencia para cada documento es más corta, su modelo debería entrenarse más rápidamente que con vectores de palabras.
Por cierto, este método podría funcionar cuando se amplía o reduce para satisfacer sus necesidades de precisión y velocidad. (por ejemplo, si su CNN aún se entrena demasiado lentamente con vectores de oraciones, puede crear vectores de párrafo en su lugar).
Una forma de manejar documentos de diferente longitud es a través del relleno. Sus secuencias de documentos deben tener la misma longitud que su documento más largo. Entonces, si su documento más largo tiene 400 oraciones, todas las secuencias de documentos tendrán 400 vectores de longitud. Los documentos más cortos que la longitud máxima se rellenarán con vectores llenos de ceros.
fuente
Podría usar incrustaciones de región. En lugar de convertir "tokens" individuales en vectores, podría usar una estrategia para convertir regiones de texto en vectores. Este enfoque se utiliza aquí: https://arxiv.org/abs/1504.01255
Si no está limitado a CNN, puede usar modelos de atención jerárquica como este: https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf donde tiene una tubería de este tipo:
word vectors (combined into) sentence vectors (combined into) final document vector
Tenga en cuenta que, con este método, aún tendrá que convertir todos los vectores de palabras en incrustaciones, pero no todos a la vez.
Para manejar documentos de diferentes longitudes, el relleno / corte es la única solución hasta ahora.
Finalmente, para aumentar la velocidad, podría intentar reducir la dimensión del texto al incluir solo secciones importantes (tal vez solo el comienzo del documento sea suficiente para tener una buena precisión de clasificación)
fuente