Naive Bayes per la classificazione del testo multi etichetta


8

Come usare Naive Bayes per la classificazione di testi multi-etichetta in R.

Ho provato ad usare naiveBayes () dalla libreria e1071 ma sembra che durante l'allenamento non accetti la variabile di classe multi-etichetta.

Ho creato TermDocumentMatrix usando il corpus del documento di testo e ho provato a creare il modello usando questa matrice e la variabile di classe (elenco di argomenti a cui appartiene un particolare documento). Di seguito è riportato il codice che ho usato.

trainvector <- as.vector(traindata$bodyText)

trainsource <- VectorSource(trainvector)

traincorpus <- Corpus(trainsource)

trainmatrix <- t(TermDocumentMatrix(traincorpus))

model <- naiveBayes(as.matrix(trainmatrix), as.factor(traindata$topics))

L'ultima riga riporta l'errore seguente:

Error in sort.list(y) : 'x' must be atomic for 'sort.list'

Hai chiamato 'ordina' in un elenco?

Ho provato a usare

model <- naiveBayes(as.matrix(trainmatrix), as.factor(unlist(traindata$topics)))

ma ho ricevuto un errore:

Error in tapply(var, y, mean, na.rm = TRUE) : 
  arguments must have same length

1
Bayes non è un classificatore binario? In R di default ?. Questo è probabilmente il motivo per cui ricevi un errore
Rahul Aedula,

Risposte:


1

Dal momento che generalmente, gli alogoritmi di Naive Bayes implementati dalla maggior parte delle biblioteche non supportano la classificazione multilabel. Sebbene tu possa escogitare il tuo algoritmo prendendo ispirazione dall'approccio ingenuo di bayes.

Per una particolare classe c e documento d (con 3 parole w1, w2, w3)

'/' sta per 'dato' p (a / b) = probabilità (a dato b)

Secondo il teorema di bayes.

p (c / d) = p (c, d) / p (d)

p (c / d) = (p (c) * p (d / c)) / p (d)

dove:

p (d / c) = p (w1 / c) * p (w2 / c) * p (w3 / c)

Dal momento che si presume che le parole siano indipendenti l'una dall'altra.

E p (w1 / c) può essere ottenuto usando il tuo codice, calcolando il conteggio di w1 all'interno dei documenti di classe c diviso per il conteggio complessivo di w1 in tutti i documenti oppure puoi usare la tua logica

Ma se vuoi evitare di scrivere un codice dettagliato

puoi ristrutturare i tuoi dati di input per ottenere la classificazione multilabel. in modo tale che un dato documento d con n etichette / classi (ad esempio d etichettato con c1, c2, c3) venga espanso nei dati di n campioni (3 qui) dello stesso documento d con etichetta diversa ogni volta ((d, c1), ( d, c2), (d, c3)). Ora puoi trasferire questi dati in qualsiasi libreria R / python che supporta baying ingenui multinomiali. Lo stesso deve essere fatto anche nel set di dati. Attualmente stai passando traindata $ argomenti che è y variabile (etichette di addestramento) così com'è, senza modifiche.

Anche dopo aver addestrato i tuoi dati usando questo approccio. È necessario utilizzare una soglia di probabilità, ad esempio 0,2, in modo che le etichette di classe con probabilità superiore a 0,2 vengano assegnate a quel documento di prova.

Approccio migliore che richiede la ristrutturazione del proprio contributo

Se si dispone di etichette di classe "n", è possibile formare un classificatore bayes ingenuo binario diverso per ciascuna classe. Ad esempio, per l'addestramento di un classificatore per la classe 'c1', si addestra un classificatore bayes ingenuo con variabile dipendente Y che indica la presenza della classe c1 su quel documento come '1' e l'assenza come '0'.

Dopo aver addestrato il classificatore bayes ingenuo binario 'n' usando questo approccio. Ora utilizzerai l'output di questi n classificatori. ad es. se tra questi, n classificatori, se un particolare classificatore, che corrisponde alla classe 'c1', ha una probabilità di uscita superiore a 0,5, allora l'etichetta di classe 'c1' verrà assegnata a questo documento di prova.

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.