Applica le incorporazioni di parole all'intero documento per ottenere un vettore di funzione


38

Come si usa l'incorporamento di parole per mappare un documento su un vettore di caratteristiche, adatto per l'uso con l'apprendimento supervisionato?

Una parola che incorpora mappa ogni parola su un vettore , dove è un numero non troppo grande (ad esempio, 500). Gli incorporamenti di parole popolari includono word2vec e Glove .wvRdd

Voglio applicare l'apprendimento supervisionato per classificare i documenti. Attualmente sto mappando ogni documento su un vettore di funzione usando la rappresentazione bag-of-word, quindi applicando un classificatore standard. Vorrei sostituire il vettore di funzionalità bag-of-word con qualcosa basato su un incorporamento di parole pre-addestrato esistente, per sfruttare la conoscenza semantica contenuta nel incorporamento di parole. Esiste un modo standard per farlo?

Posso immaginare alcune possibilità, ma non so se c'è qualcosa che abbia più senso. Approcci candidati che ho preso in considerazione:

  • Potrei calcolare il vettore per ogni parola nel documento e fare una media di tutti. Tuttavia, sembra che potrebbe perdere molte informazioni. Ad esempio, con la rappresentazione bag-of-words, se ci sono alcune parole che sono molto rilevanti per il compito di classificazione e la maggior parte delle parole sono irrilevanti, il classificatore può facilmente apprenderlo; se faccio una media dei vettori per tutte le parole del documento, il classificatore non ha possibilità.

  • La concatenazione dei vettori per tutte le parole non funziona, perché non porta a un vettore di elementi di dimensioni fisse. Inoltre sembra una cattiva idea perché sarà eccessivamente sensibile al posizionamento specifico di una parola.

  • Potrei usare la parola embedding per raggruppare il vocabolario di tutte le parole in un insieme fisso di cluster, diciamo 1000 cluster, dove uso la somiglianza del coseno sui vettori come misura della somiglianza delle parole. Quindi, invece di un bag-of-word, potrei avere un bag-of-cluster: il vettore di feature che fornisco al classifer potrebbe essere un vettore di 1000, in cui l' esimo componente conta il numero di parole nel documento che fanno parte del cluster .ii

  • Con una parola , queste parole incorporate mi permettono di calcolare una serie delle prime 20 parole più simili e il loro punteggio di somiglianza . Potrei adattare il vettore di funzionalità simile a un sacco di parole usando questo. Quando vedo la parola , oltre a incrementare l'elemento corrispondente alla parola di , potrei anche incrementare l'elemento corrispondente alla parola di , incrementare l'elemento corrispondente alla parola di e così via.ww1,,w20s1,,s20ww1w1s1w2S2

Esiste un approccio specifico che probabilmente funzionerà bene per la classificazione dei documenti?


Non cerco il paragrafo2vec o doc2vec; quelli richiedono una formazione su un corpus di dati di grandi dimensioni e non ho un corpus di dati di grandi dimensioni. Invece, voglio usare un incorporamento di parole esistente.


1
Hai deciso un metodo specifico per rappresentare i documenti utilizzando gli incorporamenti pre-addestrati? Forse questo potrebbe aiutare un po '?
turdus-merula,

1
@ user115202, pulito! Ciò non risolve del tutto il problema che ho avuto, ma è un'idea intelligente che sembra degna di essere conosciuta - grazie per averlo sottolineato! Non ho mai trovato un'ottima soluzione a questo problema che fosse significativamente migliore del semplice uso del bag-of-word. Forse questo non è proprio ciò di cui sono bravi gli incantesimi di parole. Grazie!
DW,

Questo è anche correlato al tuo problema, probabilmente un po 'più di quello precedente: apprendimento della rappresentazione per testi molto brevi usando aggregazione di parole ponderata .
turdus-merula,


1
Perché non usare un RNN? I documenti a lunghezza variabile non rappresentano un problema per gli RNN. wildml.com/2015/09/…
kalu

Risposte:


23

Una tecnica semplice che sembra funzionare abbastanza bene per brevi testi (ad esempio, una frase o un tweet) è di calcolare il vettore per ogni parola nel documento e quindi aggregarli usando la media saggia, min o max.

Sulla base dei risultati di un recente articolo, sembra che l'utilizzo di min e max funzioni abbastanza bene. Non è ottimale, ma è semplice e circa buono o migliore come altre semplici tecniche. In particolare, se i vettori per le parole nel documento sono v 1 , v 2 , , v nR d , calcoli min ( v 1 , , v n ) e max ( v 1 , , v n )nv1,v2,...,vnRdmin(v1,...,vn)max(v1,...,vn). Qui stiamo prendendo il minimo in termini di coordinate, cioè il minimo è un vettore tale che u i = min ( v 1 i , , v n i ) , e allo stesso modo per il max. Il vettore caratteristica è la concatenazione di questi due vettori, quindi otteniamo un vettore caratteristica in R 2 d . Non so se questo sia migliore o peggiore di una rappresentazione bag-of-word, ma per documenti brevi sospetto che potrebbe funzionare meglio del bag-of-word, e consente l'utilizzo di incorporamenti di parole pre-addestrati.uuio=min(vio1,...,vion)R2d

TL; DR: Sorprendentemente, la concatenazione di min e max funziona abbastanza bene.

Riferimento:

Apprendimento della rappresentazione per testi molto brevi usando aggregazione di parole ponderate. Cedric De Boom, Steven Van Canneyt, Thomas Demeester, Bart Dhoedt. Lettere di riconoscimento del modello; arXiv: 1.607,00,57 mila. astratto , pdf . Vedi in particolare le tabelle 1 e 2.

Riconoscimenti: grazie a @ user115202 per aver portato questo documento alla mia attenzione.


4
per il testo breve, avg / min / max potrebbe funzionare bene, ma cosa succede se il testo lungo, come l'articolo di notizie?
avocado,

1
Per chiunque legga quel documento e si confonda quanto me: il documento non si concentra sull'approccio menzionato da @DW, lo menzionano brevemente solo in "5.1. Baseline" come approccio baseline. Il corpo del documento si concentra sulla propria tecnica, che prevede l'addestramento di un classificatore utilizzando gli incorporamenti, che è molto più complesso dell'approccio delineato qui!
Migwell,

16

È possibile utilizzare doc2vec in modo simile a word2vec e utilizzare un modello pre-addestrato da un corpus di grandi dimensioni. Quindi usa qualcosa come .infer_vector()in gensim per costruire un vettore di documento. La formazione doc2vec non deve necessariamente provenire dal set di formazione.

Un altro metodo consiste nell'utilizzare una rete RNN, CNN o feed forward per classificare. Questo combina efficacemente i vettori di parole in un vettore di documento.

È inoltre possibile combinare funzioni sparse (parole) con caratteristiche dense (vettore di parole) per completarsi a vicenda. Quindi la tua matrice caratteristica sarebbe una concatenazione della matrice sparsa di matrice di parole con la media dei vettori di parole. https://research.googleblog.com/2016/06/wide-deep-learning-better-together-with.html

Un altro metodo interessante è utilizzare un algoritmo simile a word2vec ma invece di prevedere una parola target, è possibile prevedere un'etichetta target. Ciò sintonizza direttamente i vettori di parole con l'attività di classificazione. http://arxiv.org/pdf/1607.01759v2.pdf

Per metodi più ad hoc, potresti provare a pesare le parole in modo diverso a seconda della sintassi. Ad esempio, puoi pesare i verbi più fortemente dei determinanti.


6

Se stai lavorando con il testo in inglese e vuoi iniziare con gli incorporamenti di parole pre-addestrati, consulta questo: https://code.google.com/archive/p/word2vec/

Questa è la versione C originale di word2vec. Insieme a questa versione, hanno anche rilasciato un modello addestrato su 100 miliardi di parole tratte dagli articoli di Google News (vedere la sottosezione intitolata "Vettori pre-addestrati di parole e frasi").

Secondo la mia opinione e l'esperienza di lavoro sugli incorporamenti di parole, per la classificazione dei documenti, un modello come doc2vec (con CBOW) funziona molto meglio di un sacco di parole.

Dal momento che, hai un piccolo corpus, suggerisco, inizializzi la tua matrice di incorporamento delle parole con gli incorporamenti pre-addestrati menzionati sopra. Quindi allenati per il vettore di paragrafo nel codice doc2vec. Se ti senti a tuo agio con Python, puoi dare un'occhiata alla versione gensim di esso, che è molto facile da modificare.

Controlla anche questo documento che descrive in dettaglio il funzionamento interno di word2vec / doc2vec: http://arxiv.org/abs/1411.2738 . Ciò renderà molto semplice la comprensione del codice gensim.


1
Grazie per i suggerimenti Non sto chiedendo una parola incorporamento; So già come ottenere un incorporamento di parole pre-addestrato (ho menzionato word2vec nella mia domanda). La mia domanda è come costruire vettori di funzioni da un incorporamento di parole pre-addestrato. Apprezzo il riferimento a doc2vec, ma il mio corpus è piuttosto piccolo e quindi sospetto / temo che il tentativo di addestrare i codici doc2vec si adatterà eccessivamente e funzionerà male (anche se inizializzo la matrice con incorporamenti pre-addestrati).
DW,
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.