Hay un filtro de spam en casi todas las plataformas de correo electrónico o mensajería. El filtro examina cada correo o mensaje a medida que llega y lo clasifica como spam o ham. Su bandeja de entrada muestra los que caen bajo el jamón. Rechaza, o muestra por separado, los mensajes que caen bajo spam.
Puede crear su propio filtro de spam utilizando NLTK, regex y scikit-learn como bibliotecas principales. También necesitará un conjunto de datos para entrenar su modelo.
Comprender su conjunto de datos
La "Clasificación de correo no deseado para NLP básico" es una Conjunto de datos Kaggle. Contiene una mezcla de spam y mensajes de correo sin procesar. Tiene 5.796 filas y 3 columnas.
El CATEGORÍA columna indica si un mensaje es spam o ham. El número uno representa spam mientras que el cero representa jamón. El MENSAJE columna contiene el correo sin procesar real. El NOMBRE DEL ARCHIVO categoría es un identificador de mensaje único.
Preparación de su entorno
Para seguir, necesitará tener un comprensión básica de Python y aprendizaje automático. También debe sentirse cómodo trabajando con Colaboración de Google o Jupyter Notebook.
Para Jupyter Notebook, vaya a la carpeta en la que desea que resida el proyecto. Cree un nuevo entorno virtual y ejecute Jupyter Notebook desde esta carpeta. Google Colab no necesita este paso. Cree un nuevo cuaderno en Google Colab o Jupyter Notebook.
El código fuente completo y el conjunto de datos están disponibles en un repositorio GitHub.
Ejecute el siguiente comando mágico para instalar las bibliotecas necesarias.
!pip instalar nltk scikit-learn regex numpy pandas
Usarás:
- NLTK para procesamiento natural del lenguaje (PNL).
- scikit-learn para crear el modelo de aprendizaje automático.
- regex para trabajar con expresiones regulares.
- NumPy para trabajar con arreglos.
- Pandas para manipular su conjunto de datos.
Importar bibliotecas
Importe las bibliotecas que instaló en su entorno. Importe la biblioteca de expresiones regulares como re y scikit-learn como sklearn.
importar pandas como p.d.
importar entumecido como notario público
importar nltk
de nltk.tallo importar WordNetLemmatizer
de nltk.corpus importar Para las palabras
importar re
de sklearn.modelo_selección importar tren_prueba_dividir
de sklearn.metrics importar informe_clasificación
de sklearn.feature_extraction.text importar ContarVectorizador
de sklearn.feature_extraction.text importar TfidfVectorizer
Utilizará WordNetLemmatizer y los módulos de palabras vacías de NLTK para preprocesar los mensajes sin procesar en el conjunto de datos. Utilizará módulos sklearn importados durante la construcción del modelo.
Preprocesamiento de los datos
Llame a la función pandas read_csv para cargar el conjunto de datos. Asegúrese de almacenar el conjunto de datos en el mismo directorio que su proyecto. Muestre las primeras cinco filas del conjunto de datos para obtener una imagen del conjunto de datos.
df = pd.read_csv('/content/Spam Email texto sin formato para NLP.csv')
df.cabeza()
Suelta la columna FILE_NAME del conjunto de datos. No es una característica útil para la clasificación de spam.
df.drop('NOMBRE DEL ARCHIVO', eje=1, en su lugar=Verdadero)
Compruebe el recuento de correo no deseado y spam en el conjunto de datos. Más adelante, esto lo ayudará a determinar cómo dividir los datos para el entrenamiento y las pruebas del modelo.
d.f. CATEGORÍA.value_counts()
Descargue las palabras vacías del corpus de la biblioteca NLTK. Las palabras vacías son un conjunto de palabras comunes. El preprocesamiento los elimina de los mensajes. Cargue las palabras vacías en inglés y guárdelas en una variable de palabras vacías.
nltk.descargar('Para las palabras')
palabra vacía = nltk.corpus.palabras vacías.palabras('inglés')
Descargue WordNet multilingüe abierto. Es una base de datos léxica de palabras en inglés y sus significados semánticos.
nltk.descargar('omw-1.4')
Descarga el corpus de wordnet. Lo utilizará para la clasificación de texto. Cree una instancia de un objeto WordNetLemmatizer(). Utilizará el objeto durante la lematización. La lematización es una técnica utilizada en PNL para reducir formas derivativas de palabras a su significado de diccionario.
Por ejemplo: Reduciendo la palabra “gatos” obtendrás “gato”. Una palabra después de la lematización se convierte en un lema.
nltk.descargar('red de palabras')
lematizador = WordNetLemmatizer()
Cree una lista vacía que usará para almacenar los mensajes preprocesados.
corpus=[]
Cree un ciclo for para procesar cada mensaje en la columna MENSAJE del conjunto de datos. Elimina todos los caracteres no alfanuméricos. Convierte el mensaje a minúsculas. Divide el texto en palabras. Eliminar las palabras vacías y lematizar las palabras. Convierte las palabras de nuevo en oraciones. Agregue el mensaje preprocesado a la lista de corpus.
para i en rango (len (df)):
# eliminando todos los caracteres no alfanuméricos
mensaje = re.sub('[^a-zA-Z0-9]', ' ', df['MENSAJE'][i])# convertir el mensaje a minúsculas
mensaje = mensaje.inferior()# dividir la oración en palabras para la lematización
mensaje = mensaje.split()# eliminando palabras vacías y lematizando
mensaje = [lemmatizer.lemmatize (palabra) para palabra en mensaje
si palabra noen establecer (palabras vacías.palabras('inglés'))]# Convertir las palabras de nuevo en oraciones
mensaje = ' '.join (mensaje)
# Agregar el mensaje preprocesado a la lista de corpus
corpus.append (mensaje)
Este bucle tardará unos cinco minutos en ejecutarse. El paso de lematización y eliminación de palabras vacías lleva la mayor parte del tiempo. Ya ha preprocesado sus datos.
Ingeniería de características utilizando el modelo de bolsa de palabras frente a la técnica TF-IDF
La ingeniería de características es el proceso de convertir características de datos sin procesar en nuevas características adecuadas para los modelos de aprendizaje automático.
Modelo de bolsa de palabras
El modelo de bolsa de palabras representa datos de texto como una distribución de frecuencia de palabras presentes en el documento. Así es simplemente como el número de veces que aparece una palabra en un documento.
Utilice la clase CountVectorizer de scikit-learn para convertir los datos de texto en vectores numéricos. Ajuste el corpus de mensajes preprocesados y transforme el corpus en una matriz dispersa.
# Tome las 2500 características principales
cv = CountVectorizer (max_features=2500, ngrama_rango=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['CATEGORÍA']
Dividir los datos transformados en conjuntos de entrenamiento y prueba. Utilice el veinte por ciento de los datos para pruebas y el ochenta por ciento para entrenamiento.
x_tren, x_prueba, y_tren, y_prueba = tren_prueba_dividir(
X, y, tamaño_prueba=0.20, estado_aleatorio=1, estratificar=y)
El modelo de bolsa de palabras clasificará correctamente los mensajes en el conjunto de datos. Pero no funcionará bien en la clasificación de sus propios mensajes. No tiene en cuenta el significado semántico de los mensajes. Para clasificar solo los mensajes en el conjunto de datos, utilice esta técnica.
Técnica TF-IDF
La frecuencia de término-frecuencia inversa del documento (TF-IDF) funciona asignando pesos a las palabras en un documento en función de la frecuencia con la que aparecen. TF-IDF otorga mayor peso a las palabras que aparecen con frecuencia en un documento pero que son raras en el corpus. Esto permite que los algoritmos de aprendizaje automático comprendan mejor el significado del texto.
tf = TfidfVectorizador (ngram_range=(1,3), max_features=2500)
X = tf.fit_transform (corpus).toarray()
x_tren, x_prueba, y_tren, y_prueba = tren_prueba_dividir(
X, y, tamaño_prueba=0.20, estado_aleatorio=1, estratificar=y)
Para extraer el significado semántico de los mensajes y clasificar sus propios mensajes, utilice TF-IDF.
Creación y entrenamiento de su modelo
Comience por crear e inicializar un modelo Naive Bayes utilizando la clase MultinomialNB de scikit-learn.
modelo = MultinomialNB()
Ajuste los datos de entrenamiento, lo que permite que el modelo entrene en el conjunto de entrenamiento:
modelo.fit (x_tren, y_tren)
Luego haga predicciones sobre los conjuntos de entrenamiento y prueba usando el método de predicción.
tren_pred = modelo.predecir (x_tren)
test_pred = modelo.predecir (x_test)
Estas predicciones le ayudarán a evaluar su modelo.
Evaluación del modelo
Evalúe el rendimiento de su modelo utilizando la función Classification_report de scikit-learn. Pase las predicciones del conjunto de entrenamiento y las etiquetas del conjunto de entrenamiento real como entrada. Haga lo mismo para el conjunto de prueba.
imprimir (informe_clasificación (tren_pred, y_tren))
imprimir (informe_clasificación (test_pred, y_test))
Cuanto mayor sea la precisión, la recuperación y la exactitud de ambas clases, mejor será el modelo.
Resultados de clasificar sus propios mensajes
Transforma el mensaje en un vector utilizando la técnica TF-IDF. Use el modelo para predecir si el mensaje es spam o ham, luego muestre esa predicción en la pantalla.
imprimir('Predecir...')
mensaje = ["Ganaste 10000 dólares, por favor proporciona tu cuenta
detalles, para que podamos transferir el dinero"]
vector_mensaje = tf.transform (mensaje)
categoría = modelo.predecir (message_vector)
imprimir("El mensaje es", "correo basura"si categoría == 1demás"no spam")
Substituya el mensaje por sus los propios.
La salida es la siguiente:
El modelo puede clasificar nuevos mensajes no vistos como spam o jamón.
El desafío de la clasificación de spam en las aplicaciones
El principal desafío al que se enfrenta la clasificación de spam en las aplicaciones es la clasificación errónea de los mensajes. Los modelos de aprendizaje automático no siempre son correctos. Pueden clasificar el spam como jamón y viceversa. En el caso de clasificar el jamón como spam, un programa puede eliminar el correo electrónico de la bandeja de entrada del usuario, lo que hace que se pierdan mensajes importantes.