Saltar al contenido

Visualización de datos de texto usando una nube de palabras

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.

Visualización de datos de texto usando una nube de palabras
Visualización de datos de texto usando una nube de palabras

El conjunto de datos contiene sólo dos campos:

  1. texto – El texto del correo electrónico.
  1. 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