Proyecto: Procesamiento Natural del Lenguaje —
Tokenización, Limpieza, NER y Análisis de Frecuencias
Alexander Oviedo Fadul
Maria Fernanda Ruiz Paipilla
Neheman Samir Jaller Cerchiaro
William David Obando Lopez
Grupo 7
Especialización en Inteligencia Artificial
Corporación Universitaria Minuto de Dios (UNIMINUTO)
NRC-8774 — Procesamiento Natural del Lenguaje — Semana 3
Docente: Nathalia Orozco Morales
Julio de 2026
Tabla de Contenidos
Pag.
URL Google Colab: https://colab.research.google.com/drive/1SmT8sN8hKgkhei0tXGgcXb_WgDDKoQ6R 4
3.2 Extracción y limpieza de texto 5
3.3 Tokenización y eliminación de stop words 6
3.5 Análisis de frecuencias y visualizaciones 7
3.7 Etiquetado POS (Part-of-Speech) 8
3.8 Reconocimiento de entidades nombradas (NER) 8
Introducción
El Procesamiento de Lenguaje Natural (PLN) constituye uno de los campos más dinámicos de la inteligencia artificial contemporánea. Su objetivo central es dotar a las máquinas de la capacidad de comprender, interpretar y generar lenguaje humano de manera significativa. Desde los asistentes virtuales que usamos a diario hasta los sistemas de traducción automática, el PLN se ha convertido en una pieza clave para múltiples industrias (Moreira et al., 2021).
En el ámbito académico, comprender las herramientas y técnicas fundamentales del PLN resulta indispensable para cualquier profesional en inteligencia artificial. Librerías como NLTK y spaCy ofrecen un ecosistema robusto para abordar tareas que van desde la tokenización básica hasta el reconocimiento de entidades nombradas (NER), pasando por el análisis morfológico y la lematización. A esto se suman las técnicas de visualización que permiten comunicar los hallazgos de forma accesible y clara.
El presente proyecto tiene como objetivo aplicar un pipeline completo de PLN sobre texto extraído de la página de Wikipedia de la novela Cien años de soledad, de Gabriel García Márquez. Se eligió esta fuente porque, además de cumplir con el requisito del enunciado de la actividad, ofrece un texto rico en entidades nombradas (personas, lugares, organizaciones), vocabulario literario diverso y una extensión adecuada para un análisis significativo. El pipeline incluye extracción web, limpieza, tokenización, eliminación de stop words, stemming y lematización, análisis de frecuencias con visualizaciones, exploración léxica con WordNet y reconocimiento de entidades con spaCy.
Este documento acompaña al notebook de Google Colab donde se ejecuta el código Python correspondiente, y se estructura según las normas APA 7ª edición conforme a los lineamientos institucionales de UNIMINUTO.
Planeación
URL Google Colab: https://colab.research.google.com/drive/1SmT8sN8hKgkhei0tXGgcXb_WgDDKoQ6R
Para la ejecución de este proyecto, el equipo definió un plan de trabajo organizado en fases, con actividades específicas y responsables asignados según las fortalezas de cada integrante. La tabla 1 presenta el cronograma de actividades del proyecto.
| Fase | Actividad | Responsable |
| 1. Investigación | Revisión de la bibliografía asignada (Campesato, Ganegedara, Moreira, Srinivasa) | Todo el equipo |
| 2. Configuración | Creación del entorno Colab, instalación de NLTK, spaCy y dependencias | Alexander Oviedo |
| 3. Extracción | Web scraping de la página de Wikipedia (Cien años de soledad) | William Obando |
| 4. Limpieza | Pipeline de limpieza: URLs, paréntesis, emojis, caracteres especiales | Neheman Jaller |
| 5. Análisis NLTK | Tokenización, stop words, stemming, WordNet | Maria Fernanda Ruiz |
| 6. Análisis spaCy | POS tagging, NER, displacy | Alexander Oviedo |
| 7. Visualización | Word clouds, gráficas de frecuencias y distribución POS/NER | William Obando |
| 8. Documentación | Redacción del documento .docx y conclusiones | Todo el equipo |
| 9. Revisión | Revisión cruzada, corrección de estilo y entrega final | Todo el equipo |
La metodología adoptada sigue un enfoque iterativo: cada fase genera resultados intermedios que se revisan antes de avanzar a la siguiente. Este enfoque, recomendado tanto en la bibliografía consultada como en las indicaciones de la docente Orozco (2026), permite detectar y corregir errores tempranamente, especialmente en la etapa de limpieza, que es crítica para la calidad del análisis posterior.
Desarrollo
3.1 Librerías utilizadas
Para este proyecto se emplearon dos librerías principales de PLN en Python, cada una con fortalezas complementarias:
• NLTK (Natural Language Toolkit):
NLTK es la librería clásica para investigación en PLN. Ofrece herramientas para tokenización, acceso a corpus lingüísticos, stopwords en múltiples idiomas, stemming y exploración léxica con WordNet. Su principal ventaja es la amplia cobertura de tareas básicas y la extensa documentación educativa disponible (Campesato, 2021).
• spaCy:
spaCy proporciona pipelines optimizados para producción con modelos preentrenados. Para este proyecto se utilizó el modelo es_core_news_sm, entrenado con el corpus AnCora del español, que incluye componentes de tokenización, morphologizer, parser, attribute_ruler, lemmatizer y NER. Su integración con displacy para visualización de entidades resulta especialmente útil para el análisis visual de resultados.
Adicionalmente se emplearon BeautifulSoup para la extracción web, matplotlib y WordCloud para visualizaciones, y pandas para la estructuración tabular de datos.
3.2 Extracción y limpieza de texto
La fuente de datos seleccionada fue el artículo de Wikipedia en español sobre Cien años de soledad. El proceso de extracción utilizó la librería requests para descargar el HTML y BeautifulSoup para parsearlo. Se eliminaron etiquetas HTML no relevantes (scripts, estilos, tablas, figuras, botones, superíndices de referencias) y se conservaron únicamente los párrafos con contenido textual significativo (más de 60 caracteres).
La limpieza del texto extraído se realizó mediante un pipeline de expresiones regulares que abordó los siguientes aspectos: eliminación de contenido entre paréntesis (notas de desambiguación de Wikipedia), remoción de URLs, eliminación de emojis y caracteres Unicode especiales, supresión de números sueltos (años y referencias), conservación exclusiva de letras y puntuación básica, y colapso de espacios múltiples. Como se discutió en la clase del 15 de julio, esta etapa es determinante para la precisión de las tareas posteriores, particularmente el NER (Orozco, 2026).
3.3 Tokenización y eliminación de stop words
La tokenización se realizó con word_tokenize de NLTK configurado para español. Este proceso descompone el texto continuo en tokens (unidades mínimas: palabras y signos de puntuación). Posteriormente se aplicaron dos filtros sucesivos: primero la eliminación de tokens no alfabéticos (signos de puntuación, números residuales) y luego la remoción de stop words usando la lista predefinida de NLTK para español, que contiene artículos, preposiciones, conjunciones y otras palabras de alta frecuencia pero bajo contenido semántico.
Como señala Srinivasa (2018), la eliminación de stop words permite que los algoritmos de análisis se concentren en los términos que realmente caracterizan el contenido. Sin embargo, es importante considerar que en tareas como análisis de sentimiento o traducción, estas palabras pueden aportar información gramatical valiosa.
3.4 Stemming y lematización
Se compararon dos técnicas de normalización morfológica. El stemming, implementado con SnowballStemmer de NLTK para español, reduce las palabras a su raíz eliminando sufijos de forma algorítmica. La lematización, aplicada mediante el modelo de spaCy, busca la forma base real de cada palabra en un diccionario lingüístico.
Los resultados mostraron que la lematización de spaCy produce formas base lingüísticamente válidas, mientras que el stemming genera raíces que en ocasiones carecen de sentido. Por ejemplo, "novelista" se reduce a "novel" mediante stemming, pero se mantiene como "novelista" con la lematización. No obstante, el stemming logra una mayor reducción del vocabulario, lo cual puede ser ventajoso en tareas de recuperación de información donde la cobertura prima sobre la precisión léxica (Campesato, 2021).
3.5 Análisis de frecuencias y visualizaciones
Se calcularon distribuciones de frecuencia en tres momentos del pipeline: con tokens crudos, tras la eliminación de stop words y tras la lematización. En cada caso se generaron gráficas de barras horizontales con las 20 palabras o lemas más frecuentes, así como nubes de palabras (word clouds) que ofrecen una representación visual intuitiva de los temas predominantes.
Las visualizaciones revelaron que, tras la limpieza y eliminación de stop words, las palabras más frecuentes reflejan con claridad los temas centrales del artículo: familia, soledad, pueblo, Macondo, realismo, Nobel, entre otras. Este resultado valida la efectividad del pipeline de preprocesamiento aplicado.
3.6 Sinónimos con WordNet
Se utilizó WordNet a través de NLTK para explorar las relaciones léxicas de palabras clave identificadas en el texto. WordNet organiza las palabras en conjuntos de sinónimos (synsets) que comparten un significado y proporciona definiciones, relaciones de hiponimia/hiperonimia y ejemplos de uso. Se exploraron palabras como "novela", "familia", "pueblo", "soledad", "historia", "realismo", "autor", "personaje", "mundo" y "obra".
La cobertura de WordNet en español (a través del módulo OMW-1.4) resultó variable: algunas palabras como "novela" y "familia" ofrecieron múltiples synsets con sinónimos útiles, mientras que términos más específicos como "realismo" requirieron consultar los synsets en inglés. Esta limitación es común en recursos léxicos multilingües y motiva la exploración de bases de datos léxicas específicas para el español en futuros trabajos.
3.7 Etiquetado POS (Part-of-Speech)
El etiquetado POS asigna a cada token su categoría gramatical (sustantivo, verbo, adjetivo, etc.). Se aplicó mediante el pipeline de spaCy, que utiliza un modelo de morphologizer entrenado para español. Los resultados mostraron una distribución coherente con un texto narrativo-enciclopédico: predominancia de sustantivos (NOUN) y adjetivos (ADJ), seguidos de verbos (VERB) y determinantes (DET).
La gráfica de distribución POS generada permite identificar rápidamente la estructura gramatical del texto y puede servir como indicador del tipo de discurso analizado. Por ejemplo, un texto con alta proporción de verbos sugeriría un estilo más narrativo, mientras que uno con predominancia de sustantivos y adjetivos apunta a un estilo descriptivo o informativo (Campesato, 2021).
3.8 Reconocimiento de entidades nombradas (NER)
El NER se implementó con el modelo es_core_news_sm de spaCy, que clasifica las entidades detectadas en cuatro categorías principales: PER (personas), LOC (lugares), ORG (organizaciones) y MISC (entidades misceláneas como eventos, nacionalidades o productos). Los resultados se presentaron en formato tabular con la entidad, su tipo y la frecuencia de aparición, y se visualizaron con displacy para una inspección visual directa sobre el texto.
El modelo logró identificar correctamente la mayoría de las entidades relevantes del artículo: Gabriel García Márquez como PER, Colombia y Macondo como LOC, el Premio Nobel como MISC, y la Editorial Sudamericana como ORG. Sin embargo, también se observaron errores típicos de los modelos ligeros: en algunos casos, apellidos fueron clasificados como locaciones, y frases extensas fueron agrupadas incorrectamente como entidades misceláneas. Como se discutió en clase, estos errores pueden mitigarse con una limpieza más exhaustiva, reglas de post-procesamiento o el uso de modelos de mayor tamaño como es_core_news_md o es_core_news_lg (Orozco, 2026).
| Tipo de entidad | Código | Ejemplo | Descripción |
| Persona | PER | Gabriel García Márquez | Nombres de personas y familias |
| Lugar | LOC | Colombia, Macondo | Ubicaciones geográficas |
| Organización | ORG | Editorial Sudamericana | Empresas, instituciones, agencias |
| Miscelánea | MISC | Premio Nobel | Eventos, nacionalidades, obras |
4. Resultados
El pipeline de PLN aplicado sobre el artículo de Wikipedia de Cien años de soledad produjo los siguientes resultados principales:
• Extracción exitosa: se obtuvieron varios miles de caracteres de texto limpio a partir del artículo de Wikipedia, tras eliminar etiquetas HTML, tablas, figuras y contenido no textual.
• Reducción por limpieza: el texto pasó de 79.996 a 75.599 caracteres, lo que representa una reducción aproximada del 5,5 %. Esta reducción corresponde principalmente a números, paréntesis, caracteres especiales y espacios repetidos.
• Tokenización efectiva: se generaron cientos de tokens únicos a partir del texto limpio, de los cuales la mayoría corresponde a sustantivos y adjetivos descriptivos del contenido literario.
• Filtrado de stop words: la eliminación de palabras vacías redujo el número de tokens significativamente, concentrando el análisis en el vocabulario temático del artículo.
• Lematización superior al stemming: la lematización con spaCy produjo formas base lingüísticamente válidas con una reducción moderada del vocabulario, mientras que el stemming logró una mayor reducción a costa de generar raíces no siempre reconocibles.
• NER con buena cobertura: el modelo identificó correctamente la mayoría de personas, lugares y organizaciones mencionadas en el artículo, con una distribución coherente de tipos de entidad. Los errores observados se concentraron en ambigüedades léxicas y fragmentos con formato complejo.
El notebook ejecutado en Google Colab con todos los outputs visibles se entrega como complemento de este documento. Las gráficas de frecuencias, nubes de palabras, distribución POS y visualización NER se incluyen como evidencia de la ejecución exitosa del pipeline.
5. Conclusiones
A lo largo de este proyecto aplicamos un pipeline completo de PLN sobre un texto real en español, y la experiencia nos dejó varias lecciones que vale la pena compartir.
En primer lugar, la limpieza del texto demostró ser el paso más determinante de todo el proceso. No se trata solo de un paso técnico previo: una limpieza deficiente propaga errores a todas las etapas siguientes. Las notas entre paréntesis de Wikipedia, las referencias numéricas y los artefactos HTML generaban tokens espurios que distorsionaban tanto el análisis de frecuencias como el NER.
En segundo lugar, NLTK y spaCy resultaron ser herramientas complementarias, no excluyentes. NLTK fue especialmente útil para la tokenización inicial, el acceso a stop words y la exploración léxica con WordNet, mientras que spaCy demostró superioridad en tareas más estructuradas como POS tagging y NER gracias a su pipeline preentrenado. En un flujo de trabajo real, combinar ambas herramientas permite aprovechar lo mejor de cada una.
Finalmente, el NER requiere un enfoque iterativo. El modelo es_core_news_sm logró buenos resultados generales, pero presentó errores en casos de ambigüedad léxica (apellidos que coinciden con locaciones) y en fragmentos con formato complejo. Como indicó la docente Orozco en la sesión de clase, estos errores son inherentes a los modelos ligeros y pueden mitigarse con limpieza previa más exhaustiva, reglas de post-procesamiento o el uso de modelos de mayor tamaño.
En síntesis, este laboratorio reforzó la idea de que el PLN no es un proceso lineal sino iterativo: cada resultado intermedio debe revisarse y ajustarse antes de avanzar. La combinación de herramientas clásicas (NLTK) con soluciones modernas (spaCy) ofrece un marco robusto para abordar tareas de análisis de texto en español, y las visualizaciones generadas permiten comunicar los hallazgos de forma clara y accesible.
6. Referencias
Arumugam, R. y Shanmugamani, R. (2018). Chapter 2. Text Classification and POS Tagging Using NLTK. En Hands-on natural language processing with python: A practical guide to applying deep learning architectures to your NLP applications (pp. 28-51). Packt Publishing.
Campesato, O. (2021). Working with Text: POS. En Natural language processing fundamentals for developers (pp. 69-74). Mercury Learning and Information.
Campesato, O. (2021). Chapter 4. Algorithms and Toolkits (I). En Natural language processing fundamentals for developers (pp. 123-160). Mercury Learning and Information.
Ganegedara, T. (2018). Chapter 2: Understanding TensorFlow. En Natural language processing with TensorFlow: Teach language to machines using python's deep learning library (pp. 27-65). Packt Publishing.
Guerrero, F. y Marco, M. (2014). Parte II: Gramáticas de contexto libre, Parsing, unificación de rasgos y semántica y análisis semántico. En Procesamiento del Lenguaje Natural. Monografías de la Revista NeoInstrumenta (pp. 30-87).
Moreira, D., Cruz, I., Gonzalez, K., Quirumbay, A., Magallan, C., Guarda, T., Andrade, A. y Castillo, C. (2021). Análisis del estado actual de procesamiento de lenguaje natural. Revista Ibérica de Sistemas e Tecnologias de Informação, (E42), 126-136.
Echeverri, M. y Manjarres, R. (2020). Asistente Virtual Académico Utilizando Tecnologías Cognitivas de Procesamiento de Lenguaje Natural. Revista Politécnica, 16(31), 85-96.
Srinivasa, B. (2018). Chapter 1. What is Text Analysis. En Natural language processing and computational linguistics: A practical guide to text analysis with python, gensim, spacy, and keras (pp. 9-20). Packt Publishing.