2014-10-26 16 views
15

Ho familiarità con l'uso delle funzioni di BOW per la classificazione del testo, in cui per prima cosa troviamo la dimensione del vocabolario per il corpus che diventa la dimensione del nostro vettore di funzionalità. Per ogni frase/documento, e per tutte le sue parole costituenti, mettiamo quindi 0/1 a seconda dell'assenza/presenza di quella parola in quella frase/documento.Come utilizzare la rappresentazione vettoriale di parole (ottenute da Word2Vec, ecc.) Come funzionalità per un classificatore?

Tuttavia, ora che sto cercando di utilizzare la rappresentazione vettoriale di ogni parola, è essenziale creare un vocabolario globale?

+0

cos'è "un vocabolario globale"? – Daniel

+1

Ho bisogno di un vettore di funzionalità di lunghezza fissa per ogni frase, anche se il numero di parole in ogni frase è diverso. Quindi ho bisogno di contare la dimensione del vocabolario del mio intero corpus e di mantenere la lunghezza del vettore di funzionalità uguale alla dimensione del vocabolario. Questo è ciò che intendo per vocabolario globale. Dispiace per la confusione. Non ero abbastanza chiaro con le mie parole. –

risposta

7

Supponiamo che la dimensione dei vettori sia N (di solito tra 50 o 500). Il modo ingenuo di generalizzare il tradizionale di generalizzazione di BOW è semplicemente la sostituzione di 0 bit (in BOW) con N zeri e sostituzione di 1 bit (in BOW) con il vettore reale (ad esempio da Word2Vec). Quindi la dimensione delle caratteristiche sarebbe N * | V | (Rispetto ai vettori di caratteristiche | V | in BOW, dove | V | è la dimensione dei vocab). Questa semplice generalizzazione dovrebbe funzionare bene per un numero decente di istanze di addestramento.

Per rendere più piccoli i vettori di caratteristiche, le persone utilizzano varie tecniche come l'utilizzo della combinazione ricorsiva di vettori con varie operazioni. (Vedere ricorsivo/recidivante Neural Network e trucchi simili, ad esempio: http://web.engr.illinois.edu/~khashab2/files/2013_RNN.pdf o http://papers.nips.cc/paper/4204-dynamic-pooling-and-unfolding-recursive-autoencoders-for-paraphrase-detection.pdf)

+0

Non capisco perché lo schema nel tuo primo paragrafo sia migliore del semplice sacco di parole. Qualsiasi cosa un classificatore possa imparare da questa rappresentazione (con le caratteristiche di N * | V |), dovrebbe essere in grado di imparare da una rappresentazione BOW (con caratteristiche | V |). Ad esempio, considera la regressione logistica; qualsiasi modello su questa rappresentazione è equivalente a un modello corrispondente su una rappresentazione ARCO. Quindi questo sembra inutile. Mi sto perdendo qualcosa? –

0

Per ottenere una caratteristica lunghezza del vettore fissa per ogni frase, anche se il numero di parole in ogni frase è diverso, procedere come segue:

  1. tokenize ogni frase in parole costituenti
  2. per ogni parola ottenere parola vettore (se non è lì ignorare la parola)
  3. media tutti i vettori di parole che avete ottenuto
  4. questo vi darà sempre un d-dim vettore (d è parola vettore dim)

sotto è il pezzo di codice presentato

def getWordVecs(words, w2v_dict): 
    vecs = [] 
    for word in words: 
     word = word.replace('\n', '') 
     try: 
      vecs.append(w2v_model[word].reshape((1,300))) 
     except KeyError: 
      continue 
    vecs = np.concatenate(vecs) 
    vecs = np.array(vecs, dtype='float') 
    final_vec = np.sum(vecs, axis=0) 
return final_vec 

parole è la lista dei token ottenuti dopo la creazione di token una frase.