Risolviamolo da zero. La classificazione (nota anche come categorizzazione) è un esempio di apprendimento supervisionato . Nell'apprendimento supervisionato hai:
- modello - qualcosa che approssima la struttura interna dei dati, permettendoti di ragionare su di esso e fare previsioni utili (ad esempio predire la classe di un oggetto); normalmente il modello ha parametri che si desidera "imparare"
- set di dati di training e testing : insiemi di oggetti utilizzati per l'addestramento del modello (ricerca di buoni valori per i parametri) e ulteriore valutazione
- algoritmi di addestramento e classificazione : in primo luogo viene descritto come apprendere il modello dal set di dati di addestramento, in secondo luogo viene illustrato come derivare la classe di un nuovo oggetto dal modello addestrato
Ora prendiamo un semplice caso di classificazione dello spam. Il set di dati di formazione è un corpus di e-mail + etichette corrispondenti: "spam" o "non spam". Il set di dati di test ha la stessa struttura, ma costituito da alcune e-mail indipendenti (normalmente si divide semplicemente il set di dati e ne si fa, diciamo, 9/10 da utilizzare per l'allenamento e 1/10 - per i test). Un modo per modellare le e-mail è rappresentarle ognuna come un insieme (sacchetto) di parole. Se assumiamo che le parole siano indipendenti l'una dall'altra, possiamo usare il classificatore Naive Bayes , cioè calcolare le probabilità precedenti per ogni parola e ogni classe (algoritmo di addestramento) e quindi applicare il teorema di Bayes per trovare la probabilità posteriore di un nuovo documento a cui appartenere classe particolare.
Quindi, sostanzialmente abbiamo:
raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label
Ora nota che abbiamo rappresentato i nostri oggetti (documenti) come un sacco di parole. Ma è l'unico modo? In effetti, possiamo estrarre molto di più dal testo non elaborato. Ad esempio, al posto delle parole così come possiamo usare i loro gambi o lemmi , eliminare parole di arresto rumorose , aggiungere tag POS di parole, estrarre entità nominate o persino esplorare la struttura HTML del documento. In effetti, la rappresentazione più generale di un documento (e, in generale, di qualsiasi oggetto) è un vettore caratteristica . Ad esempio per il testo:
actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
0, 0, 1, 1, ..., 5, 7, 2, ..., 2, ... | not spam
0, 1, 0, 0, ..., 3, 12, 10, ..., 0, ... | spam
Qui la prima riga è un elenco di possibili funzionalità e le righe successive mostrano quante volte tale funzionalità si verifica in un documento. Ad esempio, nel primo documento non ci sono occorrenze della parola "attore", 1 ricorrenza della parola "brucia", 5 sostantivi, 2 aggettivi e 2 pezzi di testo in grassetto. L'ultima colonna corrisponde a un'etichetta di classe risultante.
Usando il vettore di funzione puoi incorporare qualsiasi proprietà dei tuoi testi. Anche se trovare un buon set di funzionalità potrebbe richiedere del tempo.
E che dire di modello e algoritmi? Siamo legati a Naive Bayes. Affatto. regressione logistica , SVM , alberi decisionali - solo per citare alcuni classificatori popolari. (Si noti che diciamo "classificatore" nella maggior parte dei casi intendiamo modello + algoritmi corrispondenti per addestramento e classificazione).
Per quanto riguarda l'implementazione, è possibile dividere l'attività in 2 parti:
- Estrazione di funzionalità: trasformazione di testi non elaborati in vettori di funzionalità.
- Classificazione degli oggetti - costruzione e applicazione del modello.
Il primo punto è ben elaborato in molte librerie NLP . Il secondo riguarda l'apprendimento automatico, quindi, a seconda del set di dati, è possibile utilizzare Weka o MLlib .