Volver al inicio

Python para Análisis Literario: Rutas Espaciales de Alice Selezneva

Aprende cómo Python y expresiones regulares se utilizan para analizar el corpus de textos de Kir Bulychev sobre Alice Selezneva, identificando planetas mencionados y visitados. Caso detallado para especialistas en IT.

Python y Expresiones Regulares: Cartografía de los Planetas de Alice Selezneva
Advertisement 728x90

Análisis Literario con Python: Mapeando los Viajes Cósmicos de Alisa Selezneva con Expresiones Regulares

La aplicación de métodos programáticos para analizar obras literarias abre nuevas fronteras en la comprensión de datos textuales. Este artículo presenta un estudio de caso sobre el uso de Python y expresiones regulares para un análisis profundo del corpus literario que rodea las aventuras de Alisa Selezneva. La investigación no solo buscó identificar todos los planetas mencionados, sino también determinar cuáles de ellos visitó personalmente la protagonista, empleando técnicas de análisis contextual.

Recopilación y Preprocesamiento de Datos

El paso fundamental en cualquier análisis de texto es la recopilación y preparación de datos. En este caso particular, las diversas historias y novelas sobre las aventuras de Alisa Selezneva se agregaron en un único archivo .txt. Dada la naturaleza diversa de las fuentes, la detección automática de la codificación del archivo fue un paso crítico, para lo cual se empleó la biblioteca chardet. Esto evitó problemas con la visualización incorrecta de caracteres y aseguró un procesamiento de texto unificado.

Para el análisis posterior, se utilizaron las bibliotecas estándar de Python:

Google AdInline article slot
  • re: El módulo incorporado para trabajar con expresiones regulares, indispensable para buscar y extraer patrones de texto.
  • collections: Proporciona tipos de datos de contenedores especializados, como defaultdict, que se utilizó para crear diccionarios con valores predeterminados, y Counter para contar frecuencias de elementos.

Identificación de Planetas: De la Búsqueda Simple a la Extracción Precisa

La tarea de identificar todos los planetas mencionados en el texto resultó ser más compleja de lo que se percibió inicialmente. El enfoque inicial implicó buscar la palabra 'planeta' en sus diversas formas gramaticales, para luego extraer la palabra subsiguiente como el nombre del planeta. Esto utilizó una expresión regular que consideraba las diferentes terminaciones de 'planet' (planeta) y capturaba la siguiente palabra, siempre que comenzara con una letra mayúscula.

def find_planets_after_word(text):
    if text is None:
        return [], []
    pattern_planet_name = r'''
        (?<![.\!\?\n])          
        (planets[aeuy]?|planets)   
        \s+                        
        ([A-Z][a-z]+)           
    '''
    # Originally used to exclude sentence beginnings
    # pattern_sentence_start = r'[.\!\?][\s]+([A-Z][a-z]+)' 
    found_planets = []
    all_matches = []
    for match in re.finditer(pattern_planet_name, text, re.IGNORECASE | re.VERBOSE):
        full_match = match.group(0)
        planet_word = match.group(1)  
        planet_name = match.group(2)
        # Additional logic for filtering and contextual analysis was added later

Sin embargo, la aplicación inicial de este patrón con la bandera re.IGNORECASE (búsqueda sin distinción entre mayúsculas y minúsculas) condujo a numerosos falsos positivos. Por ejemplo, adjetivos ('another' - 'otra', 'new' - 'nueva') u otros sustantivos podrían seguir a 'planeta' y ser interpretados erróneamente como nombres de planetas. El recuento total de 'planetas' superó los 600, lo que indicaba claramente la necesidad de refinar el algoritmo.

Para mejorar la precisión, se realizaron los siguientes ajustes:

Google AdInline article slot
  • Sensibilidad a Mayúsculas para Nombres: Limitar la búsqueda a nombres que comiencen solo con una letra mayúscula. Esto redujo significativamente los falsos positivos al excluir adjetivos y otras palabras funcionales.
  • Lista de Palabras Vacías (Stop Words): Crear y aplicar una lista de palabras vacías, incluyendo sustantivos comunes (p. ej., "sistema", "estrella", "órbita", "atmósfera") que podrían seguir a "planeta" pero no son su nombre. Verificar la inclusión de palabras en esta lista ayudó a filtrar coincidencias irrelevantes.
  • Longitud Mínima de Palabras: Introducir una restricción de longitud mínima de palabras para los nombres de planetas para excluir preposiciones y conjunciones.
  • Exclusión de Inicios de Oración: Una verificación adicional para determinar si la palabra encontrada estaba al principio de una oración (después de la puntuación), para evitar identificar erróneamente palabras capitalizadas ordinarias como nombres de planetas.

Después de una serie de iteraciones y refinamientos de expresiones regulares, la lista de planetas identificados se redujo a 281. Este es un resultado más realista, que refleja la diversidad de mundos mencionados en los libros de Alisa Selezneva.

Análisis Contextual de Visitas: Mapeando el Itinerario de Alisa

Una simple mención de un planeta en el texto no implica que la protagonista lo haya visitado realmente. Para determinar los viajes reales de Alisa, se desarrolló un método de análisis contextual. La hipótesis central fue que la visita a un planeta debía corroborarse con la mención simultánea del nombre de Alisa (en varios casos gramaticales) y verbos que indicaran movimiento o presencia, en estrecha proximidad al nombre del planeta.

Para implementar este enfoque, se crearon los siguientes elementos:

Google AdInline article slot
  • Patrones del Nombre de Alisa: Una lista de expresiones regulares que cubren todos los casos gramaticales del nombre "Alisa" (p. ej., r'\balice\b', r'\balice\b', r'\balice\b'). El uso de \b (límites de palabra) aseguró una coincidencia precisa.
  • Verbos de Viaje: Una extensa lista de verbos que indican movimiento, llegada o presencia (p. ej., "arrived" - 'voló a', "visited" - 'visitó', "turned out" - 'se encontró'). Cada verbo también se formateó como una expresión regular con límites de palabra para una mayor precisión.

El algoritmo operó de la siguiente manera: para cada nombre de planeta identificado, se definió un contexto – un fragmento de texto dentro de 100 caracteres antes y después de la palabra. Dentro de este contexto, se buscaron coincidencias para los patrones del nombre de Alisa y los verbos de viaje. Si ambos tipos de patrones se encontraban dentro del contexto especificado, el planeta se consideraba visitado. Este enfoque permitió distinguir los planetas que simplemente servían de fondo o se mencionaban de pasada de aquellos donde tuvieron lugar eventos activos que involucraban a Alisa.

def find_alisa_visited_planets(text, planets_list):
    if text is None:
        return [], []
    alisa_patterns = [
        r'\balice\b', r'\balice\b', r'\balice\b', 
        r'\balice\b', r'\balice\b', r'\balice\b'
    ]
    travel_verbs = [
        r'\barrived\b', r'\barrived\b', r'\barrived\b',
        r'\blanded\b', r'\blanded\b',
        r'\bvisited\b', r'\bvisited\b', r'\bvisited\b',
        r'\bleft\b', r'\bleft\b', r'\bleft\b',
        r'\bwas\b', r'\bwere\b', r'\bwas\b',
        r'\bvisited\b', r'\bvisited\b',
        r'\bset off\b', r'\bset off\b',
        r'\breached\b', r'\breached\b',
        r'\bflew to\b', r'\bflew to\b',
        r'\barrived\b', r'\barrived\b',
        r'\bwas located\b', r'\bwas located\b',
        r'\btraveled\b', r'\btraveled\b',
        r'\bturned out\b', r'\bturned out\b'
    ]
    visited_planets = []
    all_planet_checks = []
    # Simulating planet_pattern from the previous stage
    # For demonstration, we assume that planets_list already contains filtered planet names
    # and for each of them, we search for context
    for planet_name_entry in planets_list:
        planet_name = planet_name_entry # Assuming this is just a string with the planet name
        planet_pattern = r'\b' + re.escape(planet_name) + r'\b'
        planet_visits = []
        for match in re.finditer(planet_pattern, text, re.IGNORECASE):
            position = match.start()
            context_start = max(0, position - 100)
            context_end = min(len(text), position + 100)
            context = text[context_start:context_end].replace('\n', ' ')
            alisa_found = False
            for alisa_pattern in alisa_patterns:
                if re.search(alisa_pattern, context, re.IGNORECASE):
                    alisa_found = True
                    break
            verb_found = False
            matched_verb = None
            for verb_pattern in travel_verbs:
                verb_match = re.search(verb_pattern, context, re.IGNORECASE)
                if verb_match:
                    verb_found = True
                    matched_verb = verb_match.group()
                    break                     
            is_visited = alisa_found and verb_found
            visit_data = {
                'planet': planet_name,
                'position': position,
                'context': context,
                'alisa_found': alisa_found,
                'verb_found': verb_found,
                'matched_verb': matched_verb,
                'is_visited': is_visited
            }
            planet_visits.append(visit_data)
        visited = any(v['is_visited'] for v in planet_visits)
        visit_count = sum(1 for v in planet_visits if v['is_visited'])
        all_planet_checks.append({
            'planet': planet_name,
            'total_mentions': len(planet_visits),
            'visited_mentions': visit_count,
            'is_visited': visited,
            'examples': [v for v in planet_visits if v['is_visited']][:3]
        })
        if visited:
            visited_planets.append({
                'planet': planet_name,
                'total_mentions': len(planet_visits),
                'visited_mentions': visit_count,
                'examples': [v for v in planet_visits if v['is_visited']][:3]
            })
    return visited_planets, all_planet_checks

Como resultado de este análisis, se determinó que de los 281 planetas mencionados, Alisa Selezneva visitó 12. Este número demuestra cuán selectivamente el autor utilizó la geografía de su mundo, centrándose en puntos clave de aventura para la protagonista, mientras que aún creaba la impresión de un universo vasto y detallado a través de numerosas menciones, aunque no siempre visitadas. Para una niña de 10 años, 12 planetas visitados representan una cantidad significativa de viajes, especialmente considerando la necesidad de equilibrarlo con sus estudios.

Visualización de Datos y Conclusiones

La etapa final de la investigación implicó la visualización de los datos recopilados. La biblioteca plotly se utilizó para crear gráficos interactivos y mapas de viaje. La visualización presentó claramente:

  • La distribución de todos los planetas mencionados.
  • Un mapa de los viajes reales de Alisa, mostrando qué planetas visitó realmente.
  • La frecuencia de visitas a cada planeta, proporcionando una visión de los lugares más significativos en sus aventuras.

La representación gráfica de los datos hace que los resultados del análisis sean más accesibles e intuitivos, permitiendo una evaluación rápida de los viajes cósmicos de la protagonista. Por ejemplo, se hace evidente que algunos planetas fueron visitados varias veces, convirtiéndose en lugares clave de acción, mientras que otros se mencionaron solo una vez para crear atmósfera o expandir la tradición.

Los datos y métodos obtenidos pueden utilizarse para análisis posteriores de obras literarias, incluyendo el estudio del estilo autoral, el desarrollo de la trama e incluso para la creación de enciclopedias interactivas de universos ficticios. Este estudio de caso demuestra el potencial del análisis de texto en las humanidades, transformando grandes volúmenes de texto no estructurado en valiosos conocimientos cuantitativos.

Conclusiones Clave

  • La aplicación de Python y expresiones regulares permite un análisis literario profundo de grandes volúmenes de texto, extrayendo datos estructurados.
  • La identificación de entidades (p. ej., planetas) requiere un refinamiento iterativo de patrones para eliminar falsos positivos y tener en cuenta el contexto.
  • El análisis contextual es crucial para distinguir una mera mención de una acción o evento real, lo cual es vital para una interpretación precisa de los datos.
  • Las bibliotecas re, collections, chardet y plotly son herramientas poderosas para el análisis de texto y la visualización de resultados.
  • Incluso en la ficción, se pueden extraer y analizar datos cuantitativos, abriendo nuevas vías para la investigación en humanidades digitales.

— Editorial Team

Advertisement 728x90

Leer después