Clasificación de documentos utilizando red neuronal convolucional

11

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.

lenhhoxung
fuente
2
¿Parece adecuado usar el vectorizador TfIdf? ¿Quizás en combinación con word2vec para dejar solo las x palabras principales para cada documento?
Diego
Bueno, no sé qué es Tfldf. Lo revisaré para ver si funciona. Gracias
lenhhoxung
scikit-learn.org/stable/modules/… aquí por ejemplo
Diego
Solo lo reviso y creo que no me ayuda. Básicamente, esa clase auxiliar crea una matriz para un conjunto de documentos. Cada vector de fila (binario o número de palabras) en la matriz corresponde a un documento, pero para CNN, necesitamos una matriz para cada documento.
lenhhoxung
El punto era dejar solo x palabras no triviales por documento clasificadas por su TfIdf. Luego use su codificación original para construir matrices de documentos. No estoy seguro de si surgió esta idea de enfoque de dos pasos.
Diego

Respuestas:

8

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.

Andrés
fuente
Idea interesante. Lo intentaré :)
lenhhoxung
¿Puedo hacer una pregunta? ¿Cómo puedo manejar documentos que tienen longitudes significativamente diferentes (5 oraciones / doc, 500 oraciones / doc) incluso si los represento en vectores de oraciones? Relleno aquí parece raro ...
OffendingCommand: Exch
1
En el procesamiento del habla, algunas personas ordenan las secuencias en función de su longitud para que la secuencia con una longitud similar esté en el mismo lote. Esto podría funcionar para la secuencia de texto.
suthee
4

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)

pygabriel
fuente
1
Gracias por tu enlace de referencia. La incrustación de la región es interesante. Con respecto al documento de tamaño variable, como se menciona en este artículo arxiv.org/abs/1412.1058 (mismo autor), podemos usar múltiples unidades de agrupación en lugar de relleno / corte.
lenhhoxung