Los datos se refieren a un tema conocido que todo usuario de correo electrónico debe haber encontrado en algún momento, a saber, los correos electrónicos «spam», que son mensajes no solicitados, que a menudo anuncian un producto, contienen enlaces a programas malignos o intentan estafar al destinatario.
En esta guía, utilizaremos un conjunto de datos de acceso público, descrito por primera vez en el documento de la conferencia de 2006 «Spam Filtering with Naive Bayes — Which Naive Bayes?» de V. Metsis, I. Androutsopoulos y G. Paliouras. Los mensajes «jamón» en este conjunto de datos provienen de la bandeja de entrada del ex director general de investigación de Enron, Vincent Kaminski, una de las bandejas de entrada del Corpus de Enron. Una fuente de mensajes de spam en este conjunto de datos es el corpus SpamAssassin, que contiene mensajes de spam etiquetados a mano aportados por usuarios de Internet. El resto del correo basura fue recogido por el Proyecto Honey Pot, un proyecto que recoge mensajes de correo basura e identifica a los remitentes publicando direcciones de correo electrónico que los humanos sabrían que no deben contactar pero que los bots podrían atacar con el correo basura. El conjunto de datos completo que usaremos fue construido como una mezcla aproximada de 75/25 de los mensajes de jamón y spam.
El conjunto de datos contiene sólo dos campos:
- texto – El texto del correo electrónico.
- spam – Una variable binaria que indica si el correo electrónico es spam o no.
Comencemos por importar las bibliotecas necesarias.
Bibliotecas de importación
1234567891011121314# Supress Warningsimport warningswarnings.filterwarnings($0027ignore$0027)#cargando todas las librerías necesariasimport numpy como npimport pandas como pdimport stringimport collectionssfrom wordcloud import WordCloud, STOPWORDS, ImageColorGeneratorimport matplotlib.cm como cmimport matplotlib.pyplot como plt% matplotlib inline
pitón
Lectura del archivo y comprensión de los datos
La primera línea de código de abajo se lee en los datos como cuadro de datos de pandas, mientras que la segunda línea imprime la forma – 5726 observaciones de 2 variables. La tercera línea imprime los primeros cinco registros. Sólo hay dos variables – $0027texto$0027 y $0027spam$0027 – que han sido explicadas anteriormente. La mayoría de los correos electrónicos son $0027ham$0027, etiquetados como $00270$0027, constituyendo el 76 por ciento de los datos totales.
12345678# cargando los datos archivadosf = pd.read_csv($0027emails2.csv$0027)#forma del dataframeprint($0027La forma del dataframe es :$0027,df.shape)#primeros registrosdf.head()
pitón
Salida:
123456789La forma del marco de datos es : | Sujeto: la pistolera de comercio de acciones Fanny I... || 2 | Asunto: increíbles casas nuevas hechas fácil im... | Asunto: Impresión a 4 colores petición especial añadir... | 1 || 4 | Asunto: no tengo dinero, tengo cds de software... | 1 |
Comprobemos si faltan valores en la variable de texto, lo que puede hacerse por la línea de código de abajo. La salida no muestra valores perdidos.
12#Comprobación de valores nulos en `descripción`df[$0027texto$0027].isull().sum()
pitón
Salida:
10
Empezaremos construyendo la nube de palabras para todos los correos electrónicos que son spam. La primera línea de código de abajo filtra los datos con los correos electrónicos de spam, mientras que la segunda línea imprime la forma – 1368 observaciones de 2 variables.
12spam1 = df[df.spam ==1]print(spam1.shape)
pitón
Salida:
12(1368, 2)
Limpieza y preparación de datos
Antes de construir la nube de palabras, es importante limpiar los datos. Los pasos comunes se llevan a cabo en las secciones siguientes.
Convertir el texto a minúsculas
La primera línea de código que aparece a continuación convierte el texto en minúsculas, mientras que la segunda línea imprime los cinco primeros registros. Esto asegurará que palabras como $0027Enron$0027 y $0027enron$0027 sean tratadas de la misma manera mientras se cuentan las frecuencias de las palabras.
12spam1[$0027texto$0027]= spam1[$0027texto$0027].str.lower()spam1[$0027texto$0027].head()
pitón
Salida:
1234560 sujeto: naturalmente irresistible su corporación...1 sujeto: el pistolero de la bolsa de valores fanny i...2 sujeto: increíbles casas nuevas hechas fáciles im ...3 sujeto: 4 colores de impresión especial añadir... 4 asunto: no tienes dinero, obtener cds de software... Nombre: texto, dtype: object
Dividir y eliminar la puntuación del texto
12all_spam = spam1[$0027text$0027].str.split($0027 $0027)all_spam.head()
pitón
Salida:
1234560 [sujeto:, naturalmente, irresistible, tu, corp...1 [sujeto:, el, stock, comercio, pistolero, , ...2 [sujeto:, increíble, nuevo, casas, hechas, eas...3 [sujeto:, 4, color, impresión, especial, , requ...4 [sujeto:, no, tener, dinero, ,, conseguir, softw...Nombre: texto, dtype: object
Uniéndose a la Revisión Completa
En este paso, uniremos todos los registros de «texto». Esto es necesario para construir el corpus de texto que se utilizará para construir la nube de palabras. Las líneas de código de abajo completan esta tarea para nosotros.
1234567891011all_spam_cleaned =[]para el texto en all_spam: text =[x.strip(string.punctuation)for x in text] all_spam_cleaned. append(text)all_spam_cleaned[0]text_spam =[" ".join(text)for text in all_spam_cleaned]final_text_spam =" ".join(text_spam)final_text_spam[:500]
pitón
Salida:
1$0027subject naturalmente irresistible su identidad corporativa Es muy difícil recordar una empresa el mercado está lleno de suqgestions y la información esoverwhelminq pero un buen logotipo pegadizo statlonery estilo y sitio web excepcional hará la tarea mucho más fácil no prometemos que havinq ordenó un iogo su empresa se convertirá automáticamente en un mundo ieader esguite ciear que sin buenos productos organización empresarial eficaz y objetivo practicable será hotat hoy en día mar$0027