2012-04-18 13 views
5

Sto tentando di eseguire una classificazione dei documenti utilizzando l'API java di Weka.Interpretazione dell'output di StringToWordVector() - Weka

Ecco la mia struttura di directory dei file di dati.

+- text_example 
| 
+- class1 
| | 
| 3 html files 
| 
+- class2 
| | 
| 1 html file 
| 
+- class3 
    | 
    3 html files 

Ho il file 'arff' creato con 'TextDirectoryLoader'. Quindi utilizzo il filtro StringToWordVector sul file arff creato, con filter.setOutputWordCounts(true).

Di seguito è riportato un esempio dell'output dopo l'applicazione del filtro. Ho bisogno di chiarire alcune cose.

@attribute </form> numeric 
@attribute </h1> numeric 
. 
. 
@attribute earth numeric 
@attribute easy numeric 

Questo elenco enorme dovrebbe essere la tokenizzazione del contenuto dei file html iniziali. destra?

Poi ho,

@data 
{1 2,3 2,4 1,11 1,12 7,..............} 
{10 4,34 1,37 5,.......} 
{2 1,5 6,6 16,...} 
{0 class2,34 11,40 15,.....,4900 3,... 
{0 class3,1 2,37 3,40 5.... 
{0 class3,1 2,31 20,32 17...... 
{0 class3,32 5,42 1,43 10......... 

perché non v'è alcun attributo di classe per i primi 3 articoli? (dovrebbe avere classe 1). cosa significa lo 0 iniziale come in {0 class2, ..}, {0 class3 ..}. Si dice, ad esempio, che nel 3 ° file html nella cartella class3, la parola identificata dal numero intero 32 appare 5 volte. Solo per vedere come ottengo la parola (token) indicata da 32?

Come ridurre la dimensionalità del vettore funzione? non è necessario che tutti i vettori di funzionalità abbiano le stesse dimensioni? (come si considerano solo i 100 termini più frequenti dal set di allenamento e più tardi quando si tratta di test, si consideri l'occorrenza di solo quei 100 termini nei documenti di test. Perché, in questo modo, cosa succede se arriviamo a una parola completamente nuova nella fase di test, il classificatore lo ignorerà?).

Mi manca qualcosa qui? Sono nuovo di Weka.

Inoltre, apprezzo molto l'aiuto se qualcuno mi può spiegare come il classificatore utilizza questo vettore creato con il filtro StringToWordVector. (Come creare il vocabolario con i dati di allenamento, la riduzione dimensionalità, sono quelli accadendo all'interno del codice di Weka?)

risposta

8
  1. La lista enorme di @attribute contiene tutti i gettoni derivati ​​dal vostro input.
  2. La sezione @data è nel formato sparse, ovvero per ogni attributo, il valore viene indicato solo se è diverso da zero. Per le prime tre righe, l'attributo class è class1, non puoi vederlo (se fosse sconosciuto, vedresti un 0 ? all'inizio delle prime tre righe). Perchè è così? Weka internamente rappresenta gli attributi nominali (che include le classi) come doppi e inizia a contare a zero. Quindi le tue tre classi sono internamente: class1 = 0.0, class2 = 1.0, class3 = 2.0. Poiché i valori zero non sono indicati nel formato sparse, non è possibile visualizzare la classe nelle prime tre righe. (Vedere anche la sezione "File ARFF sparsi" su http://www.cs.waikato.ac.nz/ml/weka/arff.html)
  3. Per ottenere la parola/token rappresentata dall'indice n, è possibile contare o, se si dispone dell'oggetto Instances, richiamare attribute(n).name() su di esso. Per questo, n inizia il conteggio a 0.
  4. Per ridurre la dimensionalità del vettore di funzionalità, ci sono molte opzioni. Se si desidera solo avere i 100 termini più frequenti, è stringToWordVector.setWordsToKeep(100). Nota che questo cercherà di mantenere 100 parole di ogni classe. Se non si desidera mantenere 100 parole per classe, stringToWordVector.setDoNotOperateOnPerClassBasis(true).Otterrai leggermente sopra 100 se ci sono più parole con la stessa frequenza, quindi il 100 è solo una sorta di valore obiettivo.
  5. Per quanto riguarda le nuove parole che si verificano nella fase di test, penso che ciò non possa accadere perché devi consegnare allo stringToWordVector tutte le istanze prima della classificazione. Non sono sicuro al 100% su quello, poiché sto usando un setup di due classi e lascio che StringToWordVector trasformi tutte le mie istanze prima di dire al classificatore qualcosa a riguardo.

In genere posso consigliare a voi, di sperimentare con lo strumento Weka KnowledgeFlow per imparare come utilizzare le diverse classi. Se sai come fare le cose lì, puoi usare quella conoscenza per il tuo codice Java abbastanza facilmente. Spero di essere stato in grado di aiutarti, anche se la risposta è un po 'in ritardo.

+0

Sì, l'an è un po 'in ritardo dove ho appreso le risposte da solo. Ma grazie per la tua risposta e lo accetto. Ehi, hai qualche esperienza con una classificazione di classe con libsvm (wrapper) in weka? Sono un po 'bloccato con esso – KillBill

+0

@ user601 No, mi dispiace. Non ho mai usato libsvm in Weka. Solo per curiosità: stai scrivendo una tesi su qualche argomento di machine learning/data mining per caso? – Malhelo

+0

sì, sto facendo la mia tesi di laurea che riguarda la classificazione del testo. Stai facendo qualcosa di simile? – KillBill