Analizador de texto básico
Introducción
Un analizador de texto básico nos permite extraer información y estadísticas relevantes de un texto, como la cantidad de palabras, caracteres, frecuencia de términos, entre otros datos. Este tipo de aplicaciones constituye un proyecto práctico ideal para consolidar conceptos fundamentales de Python como el manejo de cadenas, estructuras de datos, funciones y entrada/salida de archivo. En este artículo aprenderemos a desarrollar un analizador de texto que nos permitirá obtener métricas interesantes y procesamiento básico sobre cualquier texto.
Planificación del proyecto
Antes de comenzar a programar, definamos las funcionalidades que tendrá nuestro analizador de texto:
- Cargar texto desde un archivo o mediante entrada directa
- Contar palabras, caracteres y líneas
- Identificar palabras más frecuentes
- Analizar la longitud promedio de palabras y oraciones
- Mostrar estadísticas en formato legible
Implementación
Estructura básica del programa
Comencemos creando la estructura principal del programa:
def main():
# Mostrar opciones al usuario
print("ANALIZADOR DE TEXTO BÁSICO")
print("==========================")
print("1. Analizar texto desde archivo")
print("2. Analizar texto desde teclado")
opcion = input("\nSeleccione una opción (1-2): ")
if opcion == "1":
ruta_archivo = input("Introduzca la ruta del archivo: ")
try:
with open(ruta_archivo, 'r', encoding='utf-8') as archivo:
texto = archivo.read()
except FileNotFoundError:
print(f"Error: No se encontró el archivo '{ruta_archivo}'")
return
elif opcion == "2":
print("Introduzca el texto a analizar (pulse Enter y luego Ctrl+D para finalizar):")
lineas = []
try:
while True:
linea = input()
lineas.append(linea)
except EOFError:
texto = "\n".join(lineas)
else:
print("Opción no válida")
return
# Realizar análisis
analizar_texto(texto)
if __name__ == "__main__":
main()
Análisis básico del texto
Ahora implementemos la función principal para analizar el texto:
def analizar_texto(texto):
"""Realiza un análisis básico del texto y muestra estadísticas."""
# Análisis básico
num_caracteres = len(texto)
num_lineas = texto.count('\n') + 1
# Dividir el texto en palabras
# Eliminamos signos de puntuación y convertimos a minúsculas
import re
palabras = re.findall(r'\b\w+\b', texto.lower())
num_palabras = len(palabras)
# Longitud promedio de palabras
total_longitud = sum(len(palabra) for palabra in palabras)
longitud_promedio = total_longitud / num_palabras if num_palabras > 0 else 0
# Frecuencia de palabras
frecuencia_palabras = {}
for palabra in palabras:
if palabra in frecuencia_palabras:
frecuencia_palabras[palabra] += 1
else:
frecuencia_palabras[palabra] = 1
# Palabras más frecuentes
palabras_frecuentes = sorted(frecuencia_palabras.items(),
key=lambda x: x[1], reverse=True)[:10]
# Dividir en oraciones y calcular longitud promedio
import re
oraciones = re.split(r'[.!?]+', texto)
oraciones = [oracion.strip() for oracion in oraciones if oracion.strip()]
num_oraciones = len(oraciones)
palabras_por_oracion = sum(len(re.findall(r'\b\w+\b', oracion))
for oracion in oraciones) / num_oraciones if num_oraciones > 0 else 0
# Mostrar resultados
print("\nRESULTADOS DEL ANÁLISIS")
print("=======================")
print(f"Número de caracteres: {num_caracteres}")
print(f"Número de palabras: {num_palabras}")
print(f"Número de líneas: {num_lineas}")
print(f"Número de oraciones: {num_oraciones}")
print(f"Longitud promedio de palabras: {longitud_promedio:.2f} caracteres")
print(f"Promedio de palabras por oración: {palabras_por_oracion:.2f}")
print("\nPalabras más frecuentes:")
for palabra, frecuencia in palabras_frecuentes:
print(f" {palabra}: {frecuencia} veces")
Mejorando la funcionalidad: búsqueda de palabras
Añadamos una función para buscar palabras específicas:
def buscar_palabra(texto, palabra_buscar):
"""Busca una palabra en el texto y muestra contexto."""
palabra_buscar = palabra_buscar.lower()
texto_lower = texto.lower()
# Buscar todas las ocurrencias
import re
ocurrencias = [m.start() for m in re.finditer(r'\b' + re.escape(palabra_buscar) + r'\b', texto_lower)]
if not ocurrencias:
print(f"La palabra '{palabra_buscar}' no se encontró en el texto.")
return
print(f"La palabra '{palabra_buscar}' aparece {len(ocurrencias)} veces:")
# Mostrar contexto para cada ocurrencia
for i, pos in enumerate(ocurrencias, 1):
# Obtener contexto (30 caracteres antes y después)
inicio = max(0, pos - 30)
fin = min(len(texto), pos + len(palabra_buscar) + 30)
contexto = texto[inicio:fin]
# Resaltar la palabra buscada
pos_palabra = pos - inicio
contexto_resaltado = (contexto[:pos_palabra] +
"[" + contexto[pos_palabra:pos_palabra+len(palabra_buscar)] + "]" +
contexto[pos_palabra+len(palabra_buscar):])
print(f"\n{i}. ...{contexto_resaltado}...")
Añadiendo análisis de complejidad léxica
Podemos mejorar nuestro analizador con una función que evalúe la riqueza de vocabulario:
def analizar_complejidad_lexica(palabras):
"""Analiza la complejidad léxica del texto."""
# Palabras únicas
palabras_unicas = set(palabras)
ratio_diversidad = len(palabras_unicas) / len(palabras) if palabras else 0
# Distribución por longitud
distribucion_longitud = {}
for palabra in palabras:
longitud = len(palabra)
if longitud in distribucion_longitud:
distribucion_longitud[longitud] += 1
else:
distribucion_longitud[longitud] = 1
print("\nANÁLISIS DE COMPLEJIDAD LÉXICA")
print("=============================")
print(f"Palabras únicas: {len(palabras_unicas)}")
print(f"Ratio de diversidad léxica: {ratio_diversidad:.2f}")
print("\nDistribución por longitud de palabras:")
for longitud in sorted(distribucion_longitud.keys()):
cantidad = distribucion_longitud[longitud]
porcentaje = (cantidad / len(palabras)) * 100
print(f" {longitud} letras: {cantidad} palabras ({porcentaje:.1f}%)")
Integrando todo en el programa principal
Finalmente, integremos todo en nuestro programa principal:
def main():
# Mostrar opciones al usuario
print("ANALIZADOR DE TEXTO BÁSICO")
print("==========================")
print("1. Analizar texto desde archivo")
print("2. Analizar texto desde teclado")
opcion = input("\nSeleccione una opción (1-2): ")
if opcion == "1":
ruta_archivo = input("Introduzca la ruta del archivo: ")
try:
with open(ruta_archivo, 'r', encoding='utf-8') as archivo:
texto = archivo.read()
except FileNotFoundError:
print(f"Error: No se encontró el archivo '{ruta_archivo}'")
return
elif opcion == "2":
print("Introduzca el texto a analizar (pulse Enter y luego Ctrl+D para finalizar):")
lineas = []
try:
while True:
linea = input()
lineas.append(linea)
except EOFError:
texto = "\n".join(lineas)
else:
print("Opción no válida")
return
# Realizar análisis básico
import re
palabras = re.findall(r'\b\w+\b', texto.lower())
# Mostrar resultados
analizar_texto(texto)
analizar_complejidad_lexica(palabras)
# Preguntar si desea buscar palabras
respuesta = input("\n¿Desea buscar alguna palabra específica? (s/n): ")
if respuesta.lower() == 's':
palabra = input("Introduzca la palabra a buscar: ")
buscar_palabra(texto, palabra)
if __name__ == "__main__":
main()
Ejemplo de uso
Veamos cómo funciona nuestro analizador con un ejemplo:
ANALIZADOR DE TEXTO BÁSICO
==========================
1. Analizar texto desde archivo
2. Analizar texto desde teclado
Seleccione una opción (1-2): 2
Introduzca el texto a analizar (pulse Enter y luego Ctrl+D para finalizar):
En un lugar de la Mancha, de cuyo nombre no quiero acordarme,
no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero,
adarga antigua, rocín flaco y galgo corredor.
Una olla de algo más vaca que carnero, salpicón las más noches,
duelos y quebrantos los sábados, lantejas los viernes, algún palomino
de añadidura los domingos, consumían las tres partes de su hacienda.
RESULTADOS DEL ANÁLISIS
=======================
Número de caracteres: 357
Número de palabras: 62
Número de líneas: 6
Número de oraciones: 2
Longitud promedio de palabras: 4.58 caracteres
Promedio de palabras por oración: 31.00
Palabras más frecuentes:
de: 5 veces
los: 3 veces
las: 2 veces
y: 2 veces
un: 2 veces
en: 2 veces
lugar: 1 veces
la: 1 veces
mancha: 1 veces
cuyo: 1 veces
ANÁLISIS DE COMPLEJIDAD LÉXICA
=============================
Palabras únicas: 47
Ratio de diversidad léxica: 0.76
Distribución por longitud de palabras:
1 letras: 1 palabras (1.6%)
2 letras: 7 palabras (11.3%)
3 letras: 12 palabras (19.4%)
4 letras: 10 palabras (16.1%)
5 letras: 7 palabras (11.3%)
6 letras: 9 palabras (14.5%)
7 letras: 6 palabras (9.7%)
8 letras: 3 palabras (4.8%)
9 letras: 3 palabras (4.8%)
10 letras: 3 palabras (4.8%)
11 letras: 1 palabras (1.6%)
¿Desea buscar alguna palabra específica? (s/n): s
Introduzca la palabra a buscar: mancha
La palabra 'mancha' aparece 1 veces:
1. ...En un lugar de la [Mancha], de cuyo nombre no quiero...
Mejoras posibles
Nuestro analizador de texto básico es funcional, pero podríamos mejorarlo de varias formas:
- Añadir análisis de sentimiento del texto
- Implementar detección de idioma
- Crear visualizaciones gráficas de los resultados
- Exportar el análisis a formatos como CSV o PDF
- Añadir comparación entre diferentes textos
- Implementar análisis de legibilidad según fórmulas estándar
Resumen
Hemos creado un analizador de texto básico que nos permite cargar texto desde un archivo o mediante entrada directa, obtener estadísticas sobre palabras, caracteres y oraciones, identificar las palabras más frecuentes, analizar la complejidad léxica y buscar palabras específicas con su contexto. Este proyecto nos ha permitido aplicar varios conceptos fundamentales de Python: manejo de cadenas, expresiones regulares, estructuras de datos como diccionarios y conjuntos, entrada y salida de archivos, y funciones. Con estos conocimientos, podemos seguir ampliando nuestro analizador para incluir funcionalidades más avanzadas según nuestras necesidades específicas.