<jupyter_start><jupyter_text>Ejemplo: Limpieza y procesamiento básico de textos**Autor:** Unidad de Científicos de Datos (UCD)---Este ejemplo muestra las principales funcionalidades del módulo `limpieza`, de la librería **ConTexto**. También muestra ejemplos de uso de las funciones de limpieza contenidas en el módulo auxiliar `limpieza_aux`, que hace parte de `utils`.Para mayor información sobre estos módulos y sus funciones, se puede consultar su documentación:* Limpieza* Funciones auxiliares de limpieza ____ 1. Funciones de limpieza de textosEn esta sección se muestra cómo se pueden hacer distintos procesamientos de un texto de entrada para remover elementos como signos de puntuación, *stopwords*, números y acentos, que pueden llegar a entorpecer el análisis de un conjunto de documentos.  1.1 Importar módulo de ConTexto y definir texto de prueba<jupyter_code>from contexto.limpieza import *

texto_prueba = '''hola, esto es una prueba para verificar que la limpieza
sea hecha con precisión, empeño y calidad! Esperamos que esté todo de 10.

Desde Amazonas hasta la Guajira y san andrés, desde John y María hasta Ernesto,
esperamos       que todo funcione de manera correcta.'''<jupyter_output><empty_output><jupyter_text>1.2 Aplicar funciones de limpieza de textos<jupyter_code># Limpieza básica, se pasa todo a minúsculas, se eliminan signos de puntuación y caracteres numéricos
limpio_basico = limpieza_basica(texto_prueba)

# Si se desea mantener los caracteres numéricos
limpio_basico_nums = limpieza_basica(texto_prueba, quitar_numeros=False)

# Para quitar acentos (diéresis, tildes y virgulillas)
sin_acentos = remover_acentos(limpio_basico)

# Quitar palabras con menos de 4 caracteres
quitar_0a3_caracteres = remover_palabras_cortas(sin_acentos, 4)<jupyter_output><empty_output><jupyter_text>Utilizando la función `limpieza_texto` se puede, a la vez:* Pasar todo el texto a minúsculas* Quitar signos de puntuación* Quitar *stopwords* (palabras y/o expresiones). Para esto, se pueden pasar directamente las listas de palabras y expresiones a quitar, o se puede pasar un archivo que contenga esta información.* Quitar palabras de una longitud menor a *n* caracteres (configurable)* Quitar números (configurable)* Quitar acentos (configurable)<jupyter_code>limpio_completo = limpieza_texto(texto_prueba, ubicacion_archivo='entrada/stopwords_prueba.txt', n_min=3)
print(limpio_completo)<jupyter_output>hola esto una prueba para verificar que sea hecha con precisión empeño esté todo desde amazonas hasta san andrés desde maría hasta ernesto todo funcione manera correcta<jupyter_text>1.3 Quitar elementos repetidos de un textoLa función `quitar_repetidos` permite quitar elementos repetidos de un texto, de acuerdo a un separador definido por el usuario.<jupyter_code>texto_repetido = 'hola, hola, como estas,hola, hola tu'

# Aplicar función directamente
print('texto quitando partes repetidas, utilizando el separador por defecto ("|"):')
print(quitar_repetidos(texto_repetido))

# Especificar el separador entre documentos/frases
print(f'\ntexto quitando partes repetidas, separadas por coma:\n{quitar_repetidos(texto_repetido, ",")}')

# Deshabilitar opción de quitar espacios al inicio y al final
print('\ntexto quitando partes repetidas, separadas por coma y sin quitar espacios al inicio y final:')
print(quitar_repetidos(texto_repetido, ",", remover_espacios=False))<jupyter_output>texto quitando partes repetidas, utilizando el separador por defecto ("|"):
hola, hola, como estas,hola, hola tu

texto quitando partes repetidas, separadas por coma:
hola como estas hola tu

texto quitando partes repetidas, separadas por coma y sin quitar espacios al inicio y final:
hola  hola  como estas  hola tu<jupyter_text>1.4 Cargar listas de *stopwords*, predefinidas y definidas por el usuario**ConTexto** trae algunas listas predefinidas de *stopwords* que pueden ser cargadas y utilizadas directamente. Las listas incluidas son:* Palabras comunes del lenguaje castellano (solo palabras)* Nombres comunes de hombres y mujeres (solo palabras)* Nombres de municipios y departamentos de Colombia (palabras y expresiones: nombres compuestos como "San Andrés")Además de estas listas, la función `lista_stopwords` permite cargar listas predefinidas de las *stopwords* más comunes para varios lenguajes, utilizando la librería NLTK.Finalmente, la función `cargar_stopwords` permite al usuario cargar *stopwords* (tanto palabras como expresiones) desde un archivo plano. Las palabras/expresiones deben ir separadas por comas o ir en renglones separados para ser tenidas en cuenta por aparte.<jupyter_code># Cargar listas de stopwords predefinidas
nombres_hombres = lista_nombres('hombre')
nombres_mujeres = lista_nombres('mujer')
nombres_todos = lista_nombres()
apellidos = lista_apellidos()
municipios = lista_geo_colombia('municipios')
departamentos = lista_geo_colombia('departamentos')
todos_geo = lista_geo_colombia()

# Stopwords comunes de varios lenguajes (por defecto se devuelven las de español)
stopwords = lista_stopwords()
stopwords_ingles = lista_stopwords('ingles')

# Cargar archivo con lista de términos y expresiones que se desean remover
custom_sw = cargar_stopwords('entrada/stopwords_prueba.txt')
print(custom_sw)<jupyter_output>(['calidad', 'limpieza', 'guajira', 'john', 'maria', 'elías'], ['<NAME>', '<NAME>'])<jupyter_text>____ 2. Funciones auxiliares para limpieza de textosAdicionalmente, el módulo auxiliar `limpieza_aux` contiene algunas funciones complementarias que permiten identificar y remover elementos adicionales que puedan entorpecer el análisis de un conjunto de textos.  2.1 Importar funciones auxiliares y definir textos de prueba<jupyter_code>from contexto.utils.limpieza_aux import substrings_en_comun, detectar_coincidencias
from contexto.utils.limpieza_aux import caracteres_repetidos, caracteres_consecutivos, consonantes_consecutivas
from contexto.utils.limpieza_aux import quitar_coincidenias, quitar_palabras_atipicas

# Corpus de prueba
textos_prueba = [
    'Este es el primer texto de prueba para la detección de coincidencias.',
    'Una segunda oración permite evaluar si hay cadenas de caracteres o elementos en común.',
    'Tercera frase que consiste en un texto complementario con palabras comúnmente utilizadas.',
    'En esta oración y la siguiente se introducen elementos para completar un grupo de por lo menos 5.',
    'Finalmente, esta frase cierra un grupo de 5 oraciones para probar la detección de coincidencias.',
    'Una última frase para ampliar un poco el grupo.']<jupyter_output><empty_output><jupyter_text>2.2 Detectar y quitar coincidencias entre un conjunto de textosEn ocasiones un documento puede tener un encabezado o pie de nota común en casi todas sus páginas. Esto puede entorpecer ciertos análisis, al darle un peso demasiado grande a estas coincidencias.Para evitar este problema, la función `quitar_coincidenias` (que a su vez utiliza las funciones `substrings_en_comun` y `detectar_coincidencias`) permite, para un conjunto de textos, encontrar y remover coincidencias (cadenas de caracteres) que cumplan una o varias de estas condiciones:* Que aparezcan en mínimo una proporción determinada de todos los textos* Que su longitud (cantidad de caracteres) sea mayor o igual a un valor determinado* Que la cadena tenga un número de palabras mayor o igual a un valor determinado<jupyter_code># Detectar coincidencias de por lo menos 4 y 10 caracteres
print(substrings_en_comun(textos_prueba[4], textos_prueba[5], longitud_min=4))
print(substrings_en_comun(textos_prueba[4], textos_prueba[5], longitud_min=10))

# Detectar cadenas de caracteres de mínimo 2 palabras que estén en mínimo la mitad de los textos
print(detectar_coincidencias(textos_prueba, prop=0.5, n_min=2, longitud_min=5))

# Quitar las coincidencias encontradas
print(quitar_coincidenias(textos_prueba, prop=0.5, n_min=2, longitud_min=5))<jupyter_output>['a frase ', ' grupo']
[]
['a frase ']
['Este es el primer texto de prueba para la detección de coincidencias.', 'Una segunda oración permite evaluar si hay cadanea de caracteres elementos en común.', 'Tercer que consiste en un texto complementario con palabras comúnmente utilizadas.', 'En esta oración y la siguiente se introducen elementos para completar un grupo de por lo menos 5.', 'Finalmente, est cierra un grupo de 5 oraciones para probar la detección de coincidencias.', 'Una últim para ampliar un poco el grupo.']<jupyter_text>2.3 Detectar y quitar palabras o valores atípicosSi se está trabajando con un texto de mala calidad (por ejemplo, porque se aplicó OCR a un documento antiguo y mal escaneado), es posible que haya "ruido" en el texto, como palabras sin sentido, que puede afectar el análisis de este documento. Otro caso posible es trabajar con textos que tengan palabras o valores numéricos sospechosos (como "abcde" o "0000000"). En este caso, puede ser de utilidad poder detectar y/o remover estas palabras sospechosas o de ruido.Para evitar este problema, la función `quitar_palabras_atipicas` (que a su vez utiliza las funciones `caracteres_repetidos`, `caracteres_consecutivos` y `consonantes_consecutivas`) permite, para un conjunto de textos, encontrar y remover palabras que cumplan una o varias de estas condiciones:* Que tengan un número o letra repetidos de forma seguida más veces de lo permitido* Que tengan números o letras consecutivas de forma seguida en un número mayor de lo permitido* Que tengan más consonantes seguidas de lo permitido<jupyter_code># Detectar si una palabra tiene una cantidad determinada de caracteres repetidos seguidos
caracteres_repetidos('123444321', 4)
# La función por defecto quita acentos y pasa todo a minúsculas, para que esto no afecte la búsqueda de repetidos
caracteres_repetidos('GóOol', 3)

# Detectar si una palabra tiene una cantidad determinada de caracteres consecutivos seguidos
caracteres_consecutivos('123444321', 4)
caracteres_consecutivos('aBCdE', 4)

# Detectar si una palabra tiene una cantidad determinada de consonantes seguidas
consonantes_consecutivas('AbStracto', 3)
consonantes_consecutivas('<NAME>', 4)
# El resultado cambia si se deja de incluir la letra "Y" como vocal
consonantes_consecutivas('<NAME>', 4, incluir_y=False)
# La función quita acentos por defecto, por lo que puede trabajar con consonantes que tengan algún tipo de acento o tilde
consonantes_consecutivas('mñçs', 4)

# Prueba de quitar palabras con problemas en un texto
texto_prueba = 'HolaAá! esta es una pruebba para ver si, En 12345, se pueden abstraer las reglas del abcdario.'

texto_sin_atipicas = quitar_palabras_atipicas(texto_prueba, n_repetidas=3, n_consecutivas=3, n_consonantes=4)

print(f"---------------\nTexto original:\n{texto_prueba}")
print(f"---------------\nTexto sin palabras detectadas como atípicas:\n{texto_sin_atipicas}")<jupyter_output>---------------
Texto original:
HolaAá! esta es una pruebba para ver si, En 12345, se pueden abstraer las reglas del abcdario.
---------------
Texto sin palabras detectadas como atípicas:
! esta es una pruebba para ver si, En, se pueden las reglas del.
{'fraction_non_alphanumeric': 0.06583100369735774, 'fraction_numerical': 0.00829651005500947, 'mean_word_length': 6.072704081632653, 'pattern_counts': {'":': 0, '<': 32, '<?xml version=': 0, '>': 32, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '311527', 'license': 'X11', 'n_tokens_mistral': 3765, 'n_tokens_neox': 3827, 'n_words': 1334, 'path': 'ejemplos/02_Limpieza de textos.ipynb', 'repo_name': 'ucd-dnp/textlib_py', 'size': '11117'}