Retour à l'accueil

Python pour l'Analyse Littéraire : Les Routes Spatiales d'Alice Selezneva

Découvrez comment Python et les expressions régulières sont utilisées pour analyser le corpus des textes de Kir Bulychev sur Alice Selezneva, en identifiant les planètes mentionnées et visitées. Étude de cas détaillée pour les spécialistes IT.

Python et Expressions Régulières : Cartographie des Planètes d'Alice Selezneva
Advertisement 728x90

Analyse Littéraire avec Python : Cartographier les Voyages Cosmiques d'Alisa Selezneva avec les Expressions Régulières

L'application de méthodes programmatiques à l'analyse d'œuvres littéraires ouvre de nouvelles perspectives dans la compréhension des données textuelles. Cet article présente une étude de cas sur l'utilisation de Python et des expressions régulières pour une analyse approfondie du corpus littéraire des aventures d'Alisa Selezneva. La recherche visait non seulement à identifier toutes les planètes mentionnées, mais aussi à déterminer celles que la protagoniste a personnellement visitées, en employant des techniques d'analyse contextuelle.

Collecte et Prétraitement des Données

L'étape fondamentale de toute analyse textuelle est la collecte et la préparation des données. Dans ce cas précis, les différentes histoires et nouvelles sur les aventures d'Alisa Selezneva ont été regroupées dans un seul fichier .txt. Compte tenu de la nature diverse des sources, la détection automatique de l'encodage du fichier était une étape cruciale, pour laquelle la bibliothèque chardet a été utilisée. Cela a permis d'éviter les problèmes d'affichage incorrect des caractères et d'assurer un traitement textuel unifié.

Pour l'analyse ultérieure, des bibliothèques Python standard ont été utilisées :

Google AdInline article slot
  • re : Le module intégré pour travailler avec les expressions régulières, indispensable pour la recherche et l'extraction de motifs textuels.
  • collections : Fournit des types de données conteneurs spécialisés, tels que defaultdict, qui a été utilisé pour créer des dictionnaires avec des valeurs par défaut, et Counter pour compter les fréquences d'éléments.

Identification des Planètes : De la Recherche Simple à l'Extraction Précise

La tâche d'identifier toutes les planètes mentionnées dans le texte s'est avérée plus complexe qu'initialement perçue. L'approche initiale consistait à rechercher le mot « planète » sous ses diverses formes grammaticales, puis à extraire le mot suivant comme nom de la planète. Cela utilisait une expression régulière qui tenait compte des différentes terminaisons de « planet » (planète) et capturait le mot suivant, à condition qu'il commence par une majuscule.

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

Cependant, l'application initiale de ce motif avec le drapeau re.IGNORECASE (recherche insensible à la casse) a conduit à de nombreux faux positifs. Par exemple, des adjectifs (« another » – « autre », « new » – « nouvelle ») ou d'autres noms pouvaient suivre « planète » et être interprétés à tort comme des noms de planètes. Le nombre total de « planètes » dépassait 600, indiquant clairement la nécessité d'affiner l'algorithme.

Pour améliorer la précision, les ajustements suivants ont été effectués :

Google AdInline article slot
  • Sensibilité à la Casse pour les Noms : Limiter la recherche aux noms commençant uniquement par une majuscule. Cela a considérablement réduit les faux positifs en excluant les adjectifs et autres mots fonctionnels.
  • Liste de Mots Vides (Stop Words) : Créer et appliquer une liste de mots vides, incluant des noms communs (par exemple, « système », « étoile », « orbite », « atmosphère ») qui pourraient suivre « planète » mais ne sont pas son nom. La vérification de l'inclusion de mots dans cette liste a aidé à filtrer les correspondances non pertinentes.
  • Longueur Minimale des Mots : Introduire une contrainte de longueur minimale pour les noms de planètes afin d'exclure les prépositions et les conjonctions.
  • Exclusion des Débuts de Phrase : Une vérification supplémentaire pour déterminer si le mot trouvé était au début d'une phrase (après la ponctuation), afin d'éviter d'identifier par erreur des mots ordinaires commençant par une majuscule comme des noms de planètes.

Après une série d'itérations et d'affinements des expressions régulières, la liste des planètes identifiées a été réduite à 281. C'est un résultat plus réaliste, reflétant la diversité des mondes mentionnés dans les livres d'Alisa Selezneva.

Analyse Contextuelle des Visites : Cartographier l'Itinéraire d'Alisa

Une simple mention d'une planète dans le texte n'implique pas que la protagoniste l'ait réellement visitée. Pour déterminer les voyages réels d'Alisa, une méthode d'analyse contextuelle a été développée. L'hypothèse principale était qu'une visite de planète devait être corroborée par la mention simultanée du nom d'Alisa (sous diverses formes grammaticales) et de verbes indiquant un mouvement ou une présence, à proximité du nom de la planète.

Pour mettre en œuvre cette approche, les éléments suivants ont été créés :

Google AdInline article slot
  • Motifs du Nom d'Alisa : Une liste d'expressions régulières couvrant tous les cas grammaticaux du nom « Alisa » (par exemple, r'\balice\b', r'\balice\b', r'\balice\b'). L'utilisation de \b (limites de mots) a assuré une correspondance précise.
  • Verbes de Voyage : Une liste exhaustive de verbes indiquant le mouvement, l'arrivée ou la présence (par exemple, « arrived » – « est arrivée en volant », « visited » – « a visité », « turned out » – « s'est retrouvée »). Chaque verbe a également été formaté comme une expression régulière avec des limites de mots pour une précision accrue.

L'algorithme fonctionnait comme suit : pour chaque nom de planète identifié, un contexte était défini – un fragment de texte de 100 caractères avant et après le mot. Dans ce contexte, des correspondances pour les motifs du nom d'Alisa et les verbes de voyage étaient recherchées. Si les deux types de motifs étaient trouvés dans le contexte spécifié, la planète était considérée comme visitée. Cette approche a permis de distinguer les planètes qui servaient simplement de toile de fond ou étaient mentionnées en passant de celles où des événements actifs impliquant Alisa se sont déroulés.

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

À la suite de cette analyse, il a été déterminé que sur les 281 planètes mentionnées, Alisa Selezneva en a visité 12. Ce nombre démontre à quel point l'auteur a utilisé sélectivement la géographie de son monde, se concentrant sur les points d'aventure clés pour la protagoniste tout en créant l'impression d'un univers vaste et détaillé à travers de nombreuses mentions, bien que toutes n'aient pas été visitées. Pour une jeune fille de 10 ans, 12 planètes visitées représentent une quantité considérable de voyages, surtout si l'on considère la nécessité de concilier cela avec ses études.

Visualisation des Données et Conclusions

La dernière étape de la recherche a consisté à visualiser les données collectées. La bibliothèque plotly a été utilisée pour créer des graphiques interactifs et des cartes de voyage. La visualisation a clairement présenté :

  • La distribution de toutes les planètes mentionnées.
  • Une carte des voyages réels d'Alisa, montrant les planètes qu'elle a réellement visitées.
  • La fréquence des visites sur chaque planète, offrant un aperçu des lieux les plus significatifs de ses aventures.

La représentation graphique des données rend les résultats de l'analyse plus accessibles et intuitifs, permettant une évaluation rapide des pérégrinations cosmiques de la protagoniste. Par exemple, il devient évident que certaines planètes ont été visitées plusieurs fois, devenant des lieux d'action clés, tandis que d'autres n'ont été mentionnées qu'une seule fois pour créer une atmosphère ou enrichir l'univers.

Les données et méthodes obtenues peuvent être utilisées pour des analyses ultérieures d'œuvres littéraires, y compris l'étude du style d'auteur, le développement de l'intrigue, et même pour la création d'encyclopédies interactives d'univers fictifs. Cette étude de cas démontre le potentiel de l'analyse textuelle dans les humanités numériques, transformant de grands volumes de texte non structuré en précieuses informations quantitatives.

Points Clés

  • L'application de Python et des expressions régulières permet une analyse littéraire approfondie de grands volumes de texte, en extrayant des données structurées.
  • L'identification d'entités (par exemple, les planètes) nécessite un affinement itératif des motifs pour éliminer les faux positifs et prendre en compte le contexte.
  • L'analyse contextuelle est cruciale pour distinguer une simple mention d'une action ou d'un événement réel, ce qui est vital pour une interprétation précise des données.
  • Les bibliothèques re, collections, chardet et plotly sont des outils puissants pour l'analyse textuelle et la visualisation des résultats.
  • Même dans la fiction, des données quantitatives peuvent être extraites et analysées, ouvrant de nouvelles voies pour la recherche en humanités numériques.

— Editorial Team

Advertisement 728x90

Lire ensuite