Naive Bayes para clasificación de texto de etiqueta múltiple

8

Cómo usar Naive Bayes para la clasificación de texto de etiquetas múltiples en R.

Intenté usar naiveBayes () de la biblioteca e1071 pero parece que durante el entrenamiento, no acepta variables de clase de etiquetas múltiples.

Creé TermDocumentMatrix usando el corpus de documentos de texto e intenté crear el modelo usando esta matriz y variable de clase (lista de temas a los que pertenece un documento en particular). A continuación se muestra el código que usé.

trainvector <- as.vector(traindata$bodyText)

trainsource <- VectorSource(trainvector)

traincorpus <- Corpus(trainsource)

trainmatrix <- t(TermDocumentMatrix(traincorpus))

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

La última línea muestra el siguiente error:

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

¿Has llamado 'ordenar' en una lista?

Traté de usar

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

pero tengo error:

Error in tapply(var, y, mean, na.rm = TRUE) : 
  arguments must have same length
Gaurav Joshi
fuente
1
¿No es Bayes un clasificador binario? En R por defecto ?. Esa es probablemente la razón por la que obtienes un error
Rahul Aedula

Respuestas:

1

Dado que, en general, los alogoritmos de bayes Naive implementados por la mayoría de las bibliotecas no admiten la clasificación de múltiples etiquetas. Aunque puede diseñar su propio algoritmo tomando inspiración del enfoque ingenuo de bayes.

Para una clase particular c, y documento d (con 3 palabras w1, w2, w3)

'/' significa 'dado' p (a / b) = probabilidad (a dado b)

Según el teorema de bayes.

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

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

dónde:

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

Dado que se supone que las palabras son independientes entre sí.

Y p (w1 / c) se puede obtener usando su código, calculando el recuento de w1 dentro de los documentos de clase c dividido por el recuento general de w1 en todos los documentos o puede usar su propia lógica

Pero si quieres evitar escribir código detallado

puede reestructurar sus datos de entrada para lograr la clasificación de múltiples etiquetas. de modo que un documento dado d con n etiquetas / clases (por ejemplo, d etiquetado con c1, c2, c3) se expanda en datos de n muestras (3 aquí) del mismo documento d con una etiqueta diferente cada vez ((d, c1), ( d, c2), (d, c3)). Ahora puede pasar estos datos a cualquier biblioteca R / python que admita bayes ingenuos multinomiales. Lo mismo debe hacerse en su conjunto de datos también. Actualmente, está pasando traindata $ topics que es y variable (etiquetas de entrenamiento) tal como es, sin modificaciones.

Incluso después de entrenar sus datos con este enfoque. Debe usar un umbral de probabilidad, por ejemplo, 0.2, de modo que las etiquetas de clase con probabilidad superior a 0.2 se asignen a ese documento de prueba.

Más mejor enfoque que requiere reestructurar su entrada

Si tiene etiquetas de clase 'n', entonces puede entrenar 'n' diferentes clasificadores de bayes ingenuos binarios para cada una de las clases. Por ejemplo, para entrenar un clasificador para la clase 'c1', entrena un clasificador ingenuo bayes con la variable dependiente Y que denota la presencia de la clase c1 en ese documento como '1' y la ausencia como '0'.

Después de entrenar 'n' binario ingenuo bayes clasificador utilizando este enfoque. Ahora usará la salida de estos n clasificadores. por ejemplo, si está fuera de estos, n clasificadores, si un clasificador particular, que corresponde a la clase 'c1' tiene una probabilidad de salida superior a 0,5, la etiqueta de clase 'c1' se asignará a este documento de prueba.

Alok Nayak
fuente