Muy buenas, les saluda Luis y en esta ocasión les traigo un nuevo tutorial.
Índice
Cómo limpiar a fondo un conjunto de datos compuesto por sitios web HTML
raspados
El paso más importante de cualquier proyecto basado en datos es obtener datos de calidad. Sin estos pasos de procesamiento previo, los resultados de un proyecto pueden estar fácilmente sesgados o completamente malinterpretados.
Aquí, nos centraremos en la limpieza de datos que se componen de páginas web raspadas.
Obteniendo los datos
Hay muchas herramientas para raspar la web. Si está buscando algo rápido y simple, el módulo de manejo de URL en Python llamado urllib podría hacer el truco por ti. De lo contrario, recomiendo scrapyd
por las posibles personalizaciones y robustez.
Es importante asegurarse de que las páginas que está raspando contengan datos de texto enriquecido que sean adecuados para su caso de uso.
De HTML
a texto
Una vez que hemos obtenido nuestras páginas web raspadas, comenzamos extrayendo el texto de cada página web. Los sitios web tienen muchas etiquetas que no contienen información útil cuando se trata de PNL, como <script>
y <button>
.
Afortunadamente, hay un módulo de Python llamado boilerpy3
que facilita la extracción de texto.
Usamos el ArticleExtractor
para extraer el texto. Este extractor se ha ajustado para artículos de noticias que funcionan bien para la mayoría de HTML
.
Puede probar otros extractores enumerados en la documentación de boilerpy3
y ver qué funciona mejor para su conjunto de datos.
A continuación, condensamos todos los caracteres de nueva línea (n
y r
) en uno n
personaje. Esto se hace para que cuando dividimos el texto en oraciones n
y puntos, no obtenemos oraciones sin palabras.
Si los extractores de boilerpy3
no funcionan para sus páginas web, puede utilizar beautifulsoup
para crear su propio extractor de texto personalizado.
A continuación se muestra un ejemplo de reemplazo del método parse_html
.
Limpieza grande de N-Gram
Una vez extraído el texto, queremos continuar con el proceso de limpieza. Es común que las páginas web contengan información repetida, especialmente si extrae varios artículos del mismo dominio.
Elementos como títulos de sitios web, eslóganes de empresas y pies de página pueden estar presentes en el texto analizado. Para detectar y eliminar estas frases, analizamos nuestro corpus observando la frecuencia de grandes n-gramas
.
N-gramas
es un concepto de NLP donde el"gramo"
es una secuencia contigua de palabras de un cuerpo de texto, y"N"
es el tamaño de estas secuencias.Esto se usa con frecuencia para construir modelos de lenguaje que pueden ayudar en tareas que van desde el resumen de texto hasta la predicción de palabras. A continuación se muestra un ejemplo de
trigramas
(3 gramos):
input = 'It is quite sunny today.' output = ['It is quite', is quite sunny', 'quite sunny today.']
"él"
y "a"
. Sin embargo, a medida que aumentamos nuestro tamaño de n-gramo
, la probabilidad de que se repita el n-gramo
disminuye.
Los trigramas comienzan a volverse más raros y es casi imposible que los artículos contengan la misma secuencia de 20 palabras. Al buscar grandes n-gramas
que ocurren con frecuencia, podemos detectar los elementos repetidos en los sitios web de nuestro corpus y filtrarlos manualmente.
Comenzamos este proceso dividiendo nuestro conjunto de datos en oraciones dividiendo los fragmentos de texto por los caracteres de nueva línea y puntos.
A continuación, convertimos nuestras oraciones en fichas (dividimos la oración en cadenas de una sola palabra). Con estas oraciones tokenizadas
, podemos generar n-gramas
de un tamaño específico (queremos comenzar grande, alrededor de 15
).
Queremos ordenar los n-gramos
por frecuencia usando la función FreqDist
proporcionada por nltk
. Una vez que tenemos nuestro diccionario de frecuencias, imprimimos los 10
primeros n-gramos
.
Si la frecuencia es superior a 1
o 2
, la oración podría ser algo que consideraría eliminar del corpus. Para eliminar la oración, copie la oración completa y agréguela como una sola cadena en la formación filter_strs
.
Se puede copiar la oración completa aumentando el tamaño de n-gramo
hasta que toda la oración se capture en un n-gramo
y se imprima en la consola, o simplemente imprimiendo parsed_texts
y buscando la frase.
Si hay varias oraciones no deseadas con palabras ligeramente diferentes, puede copiar la subcadena común en filter_strs
, y la expresión regular filtrará todas las oraciones que contengan la subcadena.
Si ejecuta el código anterior en su conjunto de datos sin agregar filtros a filter_strs
, es posible que obtenga un gráfico similar al siguiente. En mi conjunto de datos, puede ver que hay varios 15 gramos que se repiten 6
, 3
y 2 veces
.
Una vez que pasamos por el proceso de poblar filter_strs
con frases no deseadas, nuestra trama de 15 gramos se aplana.
Tenga en cuenta que no existe un umbral óptimo para el tamaño y la frecuencia de n-gramas
que determine si una oración debe eliminarse o no, así que juegue con estos dos parámetros.
A veces, necesitará reducir el tamaño de n-gramo
a 3
o 4
para elegir un título repetido, pero tenga cuidado de no eliminar datos valiosos. Este bloque de código está diseñado para ser un proceso iterativo, donde se construye lentamente el filter_strs
matriz después de muchos experimentos diferentes.
Puntuación, mayúsculas y tokenización
Después de limpiar el corpus, el siguiente paso es procesar las palabras de nuestro corpus. Queremos eliminar la puntuación, poner en minúsculas todas las palabras y dividir cada oración en matrices de palabras individuales (tokenización).
Para hacer esto, me gusta usar el método simple_preprocess
de biblioteca de gensim. Esta función realiza las tres tareas de una vez y tiene algunos parámetros que permiten cierta personalización.
Configurando deacc=True
, se eliminarán los acentos. Cuando se elimina la puntuación, la puntuación en sí se trata como un espacio y las dos subcadenas a cada lado de la puntuación se tratan como dos palabras separadas.
En la mayoría de los casos, las palabras se dividirán en una subcadena con una longitud de uno. Por ejemplo, "don't"
terminará como "don"
y "t"
. Como resultado, el valor predeterminado min_len
el valor es 2
, por lo que las palabras con 1
letra no se mantienen.
Si esto no es adecuado para su caso de uso, también puede crear un procesador de texto desde cero. Python string
la clase contiene un atributo punctuation
que enumera toda la puntuación de uso común.
Con este conjunto de signos de puntuación, puede utilizar str.maketrans
para eliminar toda la puntuación de una cadena, pero manteniendo las palabras que sí tenían puntuación como una sola palabra ("no"
se convierte en "no"
).
Tenga en cuenta que esto no captura la puntuación tan bien como los gensim simple_preprocess
. Por ejemplo, hay tres tipos de guiones ('-' em guión, - 'en guión' - 'guión
) y mientras simple_preprocess
los quita todos, string.punctuation
no contiene el guión em
y por lo tanto, no lo elimina.
Para las palabras
Una vez que tengamos nuestro corpus bien tokenizado, eliminaremos todas las palabras vacías del corpus. Las palabras vacías son palabras que no proporcionan mucho significado adicional a una oración.
Las palabras en el vocabulario en inglés incluyen "the"
, "a"
e "in"
. nltk
contiene una lista de palabras vacías en inglés, por lo que la usamos para filtrar nuestras listas de tokens.
Lematización y derivación
La lematización es el proceso de agrupar diferentes formas de la misma palabra y reemplazar estas instancias con el lema de la palabra (forma de diccionario). Por ejemplo, "funciones"
se reduce a "función"
.
La derivación es el proceso de reducir una palabra a su palabra raíz (sin sufijos ni prefijos). Por ejemplo, "correr"
se reduce a "correr"
. Estos dos pasos disminuyen el tamaño del vocabulario, facilitando que la máquina entienda nuestro corpus.
Ahora que sabe cómo extraer y preprocesar sus datos de texto, puede comenzar el análisis de datos. ¡Mucha suerte con tus aventuras de PNL!
- Si está etiquetando el corpus con etiquetas de partes del discurso, las palabras vacías deben mantenerse en el conjunto de datos y la lematización no debe realizarse antes del etiquetado.
- El repositorio de GitHub para Jupyter Notebook se puede encontrar aquí.
Espero que hayas aprendido algo nuevo.
Añadir comentario