Classification de documents à l'aide d'un réseau neuronal convolutif

11

J'essaie d'utiliser CNN (réseau neuronal convolutionnel) pour classer les documents. CNN pour les textes / phrases courts a été étudié dans de nombreux articles. Cependant, il semble qu'aucun article n'ait utilisé CNN pour un texte ou un document long.
Mon problème est qu'il y a trop de fonctionnalités d'un document. Dans mon jeu de données, chaque document a plus de 1000 jetons / mots. Pour alimenter chaque exemple en CNN, je convertis chaque document en matrice en utilisant word2vec ou gant résultant d'une grande matrice. Pour chaque matrice, la hauteur est la longueur du document et la largeur est la taille du vecteur d'intégration de mots. Mon ensemble de données contient plus de 9 000 exemples et il faut beaucoup de temps pour former le réseau (une semaine entière), ce qui rend difficile le réglage fin des paramètres.
Une autre méthode d'extraction de fonctionnalités consiste à utiliser un vecteur unique pour chaque mot, mais cela créera des matrices très clairsemées. Et bien sûr, cette méthode prend même plus de temps à s'entraîner que la méthode précédente.
Existe-t-il donc une meilleure méthode pour extraire des entités sans créer de grandes matrices d'entrée?
Et comment gérer la longueur variable des documents? Actuellement, j'ajoute des chaînes spéciales pour que le document ait la même longueur, mais je ne pense pas que ce soit une bonne solution.

lenhhoxung
la source
2
L'utilisation du vectoriseur TfIdf semble-t-elle appropriée? Peut-être en combinaison avec word2vec pour ne laisser que les x premiers mots pour chaque document?
Diego
Eh bien, je ne sais pas ce qu'est Tfldf. Je vais le vérifier pour voir si cela fonctionne. Merci
lenhhoxung
scikit-learn.org/stable/modules/… ici par exemple
Diego
Je vérifie et je pense que cela ne m'aide pas. Fondamentalement, cette classe d'assistance crée une matrice pour un ensemble de documents. Chaque vecteur ligne (binaire ou nombre de mots) dans la matrice correspond à un document, mais pour CNN, nous avons besoin d'une matrice pour chaque document.
lenhhoxung
Le but était de ne laisser que x mots non triviaux par document classé par leur TfIdf. Utilisez ensuite votre encodage d'origine pour créer des matrices de documents. Je ne sais pas si cette idée d'approche en deux étapes est venue.
Diego

Réponses:

8

Vous pouvez réduire la longueur de vos données d'entrée en représentant vos documents sous forme de séries de vecteurs de phrases au lieu d'une série plus longue de vecteurs de mots. Doc2vec est une façon de le faire (chaque phrase serait un "document").

Si vous ne voulez pas utiliser Doc2vec, une façon de créer les vecteurs de phrase serait de faire la moyenne des vecteurs de mots pour chaque phrase, vous donnant un seul vecteur de la même largeur pour chaque phrase. Cela peut ne pas être aussi précis que certaines méthodes disponibles via Doc2Vec mais je l'ai utilisé avec un succès considérable pour la modélisation de sujets.

Quoi qu'il en soit, une fois que vous avez vos vecteurs de phrases, alignez-les en séquence pour chaque document comme vous le faites déjà pour vos vecteurs de mots et parcourez ensuite votre modèle. Comme la longueur de séquence de chaque document est plus courte, votre modèle devrait s'entraîner plus rapidement qu'avec des vecteurs de mots.

Soit dit en passant, cette méthode pourrait fonctionner lorsqu'elle est augmentée ou réduite pour répondre à vos besoins de précision et de vitesse. (Par exemple, si votre CNN s'entraîne toujours trop lentement avec des vecteurs de phrases, vous pouvez créer des vecteurs de paragraphe à la place).

Une façon de gérer des documents de différentes longueurs est grâce au rembourrage. Vos séquences de documents doivent toutes être de longueur égale à votre document le plus long. Donc, si votre document le plus long fait 400 phrases, toutes les séquences de documents auront une longueur de 400 vecteurs. Les documents plus courts que la longueur maximale seraient remplis de vecteurs remplis de zéros.

Andrew
la source
Idée intéressante. Je vais l'essayer :)
lenhhoxung
Puis-je demander une question? Comment puis-je traiter des documents de longueurs sensiblement différentes (5 phrases / doc, 500 phrases / doc) même si je les représente dans des vecteurs de phrases? Le rembourrage ici semble étrange ...
stackunderflow
1
Dans le traitement de la parole, certaines personnes ordonnent les séquences en fonction de leur longueur afin que les séquences de longueur similaire soient dans le même lot. Cela pourrait fonctionner pour la séquence de texte.
suthee
4

Vous pouvez utiliser des intégrations de région. Plutôt que de convertir des "jetons" individuels en vecteurs, vous pouvez utiliser une stratégie pour convertir des régions de texte en vecteurs. Cette approche est utilisée ici: https://arxiv.org/abs/1504.01255

Si vous n'êtes pas limité à CNN, vous pouvez utiliser un modèle d'attention hiérarchique tel que celui-ci: https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf où vous avez un pipeline de ce type: word vectors (combined into) sentence vectors (combined into) final document vector

Notez qu'avec cette méthode, vous devrez toujours convertir tous les vecteurs de mots en incorporations, mais pas tous en même temps.

Pour gérer des documents de différentes longueurs, le rembourrage / découpe est la seule solution jusqu'à présent.

Enfin, pour augmenter la vitesse, vous pouvez essayer de réduire la dimension du texte en n'incluant que des sections importantes (peut-être que le début du document suffit pour avoir une bonne précision de classification)

pygabriel
la source
1
Merci pour votre lien de référence. L'intégration de la région est intéressante. En ce qui concerne les documents de taille variable, comme mentionné dans cet article arxiv.org/abs/1412.1058 (même auteur), nous pouvons utiliser plusieurs unités de regroupement au lieu du remplissage / découpage.
lenhhoxung