Comprensión de Bayes Ingenuos y sus aplicaciones en clasificación de texto (Parte I)

author
4 minutes, 51 seconds Read

Clasificación de texto con Bayes Ingenuos

Para comprender cómo realizar la clasificación de texto utilizando el algoritmo Bayes Ingenuo, primero necesitamos definir el conjunto de datos que vamos a usar e importarlo.

El conjunto de datos que vamos a utilizar es el conjunto de datos de 20 grupos de noticias (enlace de descarga). El conjunto de datos comprende alrededor de 18.000 publicaciones de grupos de noticias sobre 20 temas divididos en dos subconjuntos: uno para capacitación (o desarrollo) y otro para pruebas (o evaluación del desempeño).

La división entre el tren y el equipo de prueba se basa en mensajes publicados antes y después de una fecha específica. Alternativamente, uno puede descargar y extraer los archivos en Scikit-learn usando:

from sklearn.datasets import fetch_20newsgroups

En este tutorial, nos vamos a centrar en cinco categorías en nuestra variable de destino, a saber alt.atheism, soc.religion.christian, talks.politics.misc, comp.graphics, y sci.med, que especificamos en los equipos de tren y prueba como se muestra a continuación:

categories = news_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True)
news_test = fetch_20newsgroups(subset='test', categories=categories, shuffle=True)

Para acceder a los nombres de destino de nuestros datos de entrenamiento, podemos imprimirlos en una celda de un cuaderno de Jupyter antes de print(news_train). Del mismo modo, podemos ver el contenido de los datos de entrenamiento por print(news_train) , que esencialmente es un diccionario de textos.

Preparación de datos & Modelado

Ahora necesitamos cubrir algunos conceptos importantes en el proceso de clasificación de texto. Vamos a usar una clase especial de sklearn.feature_extraction.text llamada CountVectorizer. Así que la idea es que, dado que tenemos una cadena de texto, podemos asignar números únicos a cada una de las palabras del texto.

Después de asignar los números únicos, contamos la ocurrencia de estos números. Este concepto de asignar números únicos a cada una de las palabras de un texto se denomina tokenización. Echemos un vistazo a un ejemplo:

Example Text: The boy in green shirt is sitting on the chair.Assigning unique number to each word gives:
{'the': 9, 'boy': 0, 'in': 4, 'green': 3, 'shirt': 7, 'is': 5, 'sitting': 8, 'on': 6, 'chair': 2}

Por lo tanto, las características del diccionario de vocabulario son las que se muestran a continuación:


Podemos implementar esto en Scikit-learn con el fragmento de código a continuación:

from sklearn.feature_extraction.text import CountVectorizer
text =
vector = CountVectorizer()
vector.fit(text)#learn a vocabulary dictionary of all tokens in the raw documents
print("Print Vocabulary: "+str(vector.vocabulary_)+'\n\n')vector.get_feature_names()
print("Feature names:"+str(vector.get_feature_names())+'\n\n')counts = vector.transform(text)
print("The shape of count is: "+str(counts.shape)+'\n\n')
#Only 1 sample space and it has 8 features
print("Printing count: "+'\n'+str(counts.toarray()))

Tenga en cuenta, sin embargo, que para usar CountVectorizer, primero tenemos que importar la clase, crear una instancia de la clase a la que llamamos vector y llamar al método fit para aprender el vocabulario en el documento sin procesar. El método transform cuenta las ocurrencias de cada palabra: básicamente en términos de ML, decimos «codificar documentos». El resultado del fragmento es el diccionario de vocabulario, los nombres de entidades, la forma y el recuento de entidades.

Esto se ve prometedor. Sin embargo, una cosa a tener en cuenta que puede haber descubierto es que palabras como «el» tienden a aparecer a menudo en casi todos los documentos de texto. Como tal, el recuento de la palabra «el» no significa necesariamente que sea importante en la clasificación.

Hay maneras de manejar esto:

  1. Eliminar lo que llamamos palabras de parada (palabras que ocurren comúnmente en el idioma inglés como artículos, preposiciones, etc.) y/o
  2. Introducir un concepto llamado Frecuencia de Documento Inversa de Frecuencia de término (TF-IDF). En resumen, TF-IDF primero cuenta el número de veces que una palabra determinada aparece en un documento y luego le da un peso a la palabra, lo que delinea su importancia en la clasificación. Así que vamos a ver cómo se hace en Python:
from sklearn.feature_extraction.text import TfidfTransformer
vectorizer = TfidfTransformer()
vectorizer.fit(counts)
print('Learning Frequency of all features:'+str(vectorizer.idf_)+'\n\n')
freq = vectorizer.transform(counts)
print('Transforming the matrix based on the learnt frequencies or weight: \n\n'+str(freq.toarray()))

De nuevo, importamos el TfidfTransformer, creamos una instancia de la clase y llamamos al método fit, pasando como argumento la matriz de recuentos devueltos por CountVectorizer en el bloque anterior—y finalmente, usamos el método transform para asignar pesos relevantes a estas características, como se muestra a continuación:

Ahora que tenemos una comprensión firme de CountVectorizer y TF-IDF, podemos repetir los mismos pasos para nuestro conjunto de datos de 20 grupos de noticias.

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_tf = count_vect.fit_transform(news_train.data)from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_tf)

Ahora que se ha realizado la transformación y asignación de pesos respectivos, ahora es el momento de construir el modelo Bayes Ingenuo :).

Lo hacemos importando MultiNomialNB de sklearn.naive_bayes para ajustar el modelo al conjunto de entrenamiento:

from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tfidf, news_train.target)

Podemos crear nuestras propias oraciones para probar las predicciones del clasificador:

docs_new = 
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_transformer.transform(X_new_counts)
predicted = clf.predict(X_new_tfidf)

Como podemos ver, funciona muy bien, clasificando los documentos en docs_new en sus respectivos destinos.

Similar Posts

Deja una respuesta

Tu dirección de correo electrónico no será publicada.