Classificazione dei documenti mediante rete neurale convoluzionale


11

Sto cercando di usare la CNN (rete neurale convoluzionale) per classificare i documenti. La CNN per brevi testi / frasi è stata studiata in molti articoli. Tuttavia, sembra che nessun documento abbia usato la CNN per lunghi testi o documenti.
Il mio problema è che ci sono troppe funzioni da un documento. Nel mio set di dati, ogni documento ha più di 1000 token / parole. Per alimentare ogni esempio in una CNN, converto ogni documento in una matrice usando word2vec o guanto risultando una matrice grande. Per ogni matrice, l'altezza è la lunghezza del documento e la larghezza è la dimensione del vettore di incorporamento delle parole. Il mio set di dati ha più di 9000 esempi e ci vuole molto tempo per addestrare la rete (un'intera settimana), il che rende difficile mettere a punto i parametri.
Un altro metodo di estrazione delle funzionalità consiste nell'utilizzare un vettore a caldo per ogni parola, ma ciò creerà matrici molto sparse. E, naturalmente, questo metodo richiede anche più tempo per allenarsi rispetto al metodo precedente.
Esiste quindi un metodo migliore per estrarre funzionalità senza creare matrici di input di grandi dimensioni?
E come dovremmo gestire la lunghezza variabile dei documenti? Attualmente, aggiungo stringhe speciali per rendere il documento della stessa lunghezza, ma non credo sia una buona soluzione.


2
L'uso del vectorizer TfIdf sembra adatto? Forse in combinazione con word2vec per lasciare solo x parole in alto per ogni documento?
Diego,

Beh, non so cosa sia Tfldf. Lo controllerò per vedere se funziona. Grazie
lenhhoxung l'


Lo controllo e penso che non mi aiuti. Fondamentalmente, quella classe di supporto crea una matrice per una serie di documenti. Ogni vettore di riga (binario o conteggio parole) nella matrice corrisponde a un documento, ma per la CNN è necessaria una matrice per ciascun documento.
Lenhhoxung,

Il punto era lasciare solo x parole non banali per documento classificate in base al loro TfIdf. Quindi utilizzare la codifica originale per creare matrici di documenti. Non sono sicuro se questa idea di approccio in due passaggi si è imbattuta.
Diego,

Risposte:


8

È possibile ridurre la lunghezza dei dati di input rappresentando i documenti come una serie di vettori di frasi anziché una serie più lunga di vettori di parole. Doc2vec è un modo per farlo (ogni frase sarebbe un "documento").

Se non vuoi usare Doc2vec, un modo per creare i vettori di frase sarebbe quello di fare una media dei vettori di parole per ogni frase, dandoti un singolo vettore della stessa larghezza per ogni frase. Questo potrebbe non essere preciso come alcuni metodi disponibili tramite Doc2Vec, ma l'ho usato con notevole successo per la modellazione degli argomenti.

Ad ogni modo, una volta che hai i tuoi vettori di frase, allineali in sequenza per ciascun documento come fai già per i tuoi vettori di parole ed esegui quindi il tuo modello. Poiché la lunghezza della sequenza per ciascun documento è inferiore, il modello deve essere addestrato più rapidamente rispetto ai vettori di parole.

A proposito, questo metodo potrebbe funzionare se ingrandito o ridotto per soddisfare le esigenze di precisione e velocità. (ad es. se la tua CNN si allena ancora troppo lentamente con i vettori di frasi, puoi invece creare vettori di paragrafo).

Un modo per gestire documenti di diversa lunghezza è attraverso l'imbottitura. Le sequenze dei documenti dovrebbero essere tutte uguali in lunghezza rispetto al documento più lungo. Quindi, se il documento più lungo è di 400 frasi, tutte le sequenze di documenti avranno una lunghezza di 400 vettori. I documenti più corti della lunghezza massima verrebbero riempiti con vettori pieni di zeri.


Idea interessante. Ci proverò :)
lenhhoxung,

Posso fare una domanda? Come posso gestire documenti che hanno lunghezze significativamente diverse (5 frasi / documento, 500 frasi / documento) anche se li rappresento in vettori di frase? L'imbottitura qui sembra strana ...
stackunderflow

1
Nell'elaborazione del parlato, alcune persone ordinano le sequenze in base alla sua lunghezza in modo che la sequenza con una lunghezza simile sia nello stesso batch. Questo potrebbe funzionare per la sequenza di testo.
suthee,

4

È possibile utilizzare i matrimoni regionali. Invece di convertire singoli "token" in vettori, è possibile utilizzare una strategia per convertire regioni di testo in vettori. Questo approccio è utilizzato qui: https://arxiv.org/abs/1504.01255

Se non sei limitato alla CNN, potresti utilizzare modelli di attenzione gerarchici come questo: https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf in cui hai una pipeline di questo tipo: word vectors (combined into) sentence vectors (combined into) final document vector

Nota che, con questo metodo, dovrai comunque convertire tutti i vettori di parole in incorporamenti, ma non tutti in una volta.

Per gestire documenti di diverse lunghezze, l'imbottitura / taglio è l'unica soluzione finora.

Infine, per aumentare la velocità, potresti provare a ridurre la dimensione del testo includendo solo sezioni importanti (forse solo l'inizio del documento è sufficiente per avere una buona precisione di classificazione)


1
Grazie per il tuo link di riferimento. L'incorporamento della regione è interessante. Per quanto riguarda il documento di dimensioni variabili, come menzionato in questo articolo arxiv.org/abs/1412.1058 (stesso autore), possiamo usare più unità di raggruppamento anziché imbottitura / taglio.
Lenhhoxung,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.