Zurück zur Startseite

Python für Literarische Analyse: Alice Seleznevas Raumrouten

Lernen Sie, wie Python und reguläre Ausdrücke verwendet werden, um das Korpus der Texte von Kir Bulychev über Alice Selezneva zu analysieren, erwähnte und besuchte Planeten zu identifizieren. Detaillierter Anwendungsfall für IT-Spezialisten.

Python und Reguläre Ausdrücke: Kartographie der Planeten von Alice Selezneva
Advertisement 728x90

Literarische Analyse mit Python: Kartierung von Alisa Seleznjowas kosmischen Reisen mittels regulärer Ausdrücke

Die Anwendung programmatischer Methoden zur Analyse literarischer Werke eröffnet neue Möglichkeiten im Verständnis textueller Daten. Dieser Artikel stellt eine Fallstudie zur Verwendung von Python und regulären Ausdrücken für eine tiefgehende Analyse des literarischen Korpus rund um Alisa Seleznjowas Abenteuer vor. Ziel der Untersuchung war es, nicht nur alle erwähnten Planeten zu identifizieren, sondern auch mittels kontextueller Analysetechniken zu ermitteln, welche davon die Protagonistin persönlich besucht hat.

Datenerfassung und Vorverarbeitung

Der grundlegende Schritt jeder Textanalyse ist die Datenerfassung und -aufbereitung. In diesem speziellen Fall wurden die verschiedenen Geschichten und Novellen über Alisa Seleznjowas Abenteuer in einer einzigen .txt-Datei zusammengeführt. Angesichts der unterschiedlichen Quellen war die automatische Erkennung der Dateikodierung ein entscheidender Schritt, für den die chardet-Bibliothek eingesetzt wurde. Dies verhinderte Probleme mit der falschen Zeichenanzeige und gewährleistete eine einheitliche Textverarbeitung.

Für die anschließende Analyse wurden Standard-Python-Bibliotheken verwendet:

Google AdInline article slot
  • re: Das integrierte Modul für die Arbeit mit regulären Ausdrücken, unverzichtbar für das Suchen und Extrahieren von Textmustern.
  • collections: Bietet spezialisierte Container-Datentypen, wie defaultdict, das zur Erstellung von Dictionaries mit Standardwerten verwendet wurde, und Counter zum Zählen von Elementhäufigkeiten.

Planeten identifizieren: Vom einfachen Suchen zur präzisen Extraktion

Die Aufgabe, alle im Text erwähnten Planeten zu identifizieren, erwies sich als komplexer als zunächst angenommen. Der anfängliche Ansatz bestand darin, nach dem Wort 'Planet' in seinen verschiedenen grammatischen Fällen zu suchen und dann das nachfolgende Wort als Namen des Planeten zu extrahieren. Hierfür wurde ein regulärer Ausdruck verwendet, der verschiedene Endungen von 'planet' (Planet) berücksichtigte und das folgende Wort erfasste, sofern es mit einem Großbuchstaben begann.

def find_planets_after_word(text):
    if text is None:
        return [], []
    pattern_planet_name = r'''
        (?<![.\!\?\n])          
        (planets[aeuy]?|planets)   
        \s+                        
        ([A-Z][a-z]+)           
    '''
    # Ursprünglich verwendet, um Satzanfänge auszuschließen
    # 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)
        # Zusätzliche Logik zur Filterung und Kontextanalyse wurde später hinzugefügt

Die anfängliche Anwendung dieses Musters mit dem re.IGNORECASE-Flag (nicht-groß-/kleinschreibungsabhängige Suche) führte jedoch zu zahlreichen Fehlalarmen. Beispielsweise könnten Adjektive ('another' – 'eine andere', 'new' – 'eine neue') oder andere Substantive auf 'Planet' folgen und fälschlicherweise als Planetennamen interpretiert werden. Die Gesamtzahl der 'Planeten' überstieg 600, was deutlich auf die Notwendigkeit einer Algorithmusverfeinerung hinwies.

Um die Genauigkeit zu verbessern, wurden folgende Anpassungen vorgenommen:

Google AdInline article slot
  • Groß-/Kleinschreibung für Namen: Die Suche wurde auf Namen beschränkt, die ausschließlich mit einem Großbuchstaben beginnen. Dies reduzierte Fehlalarme erheblich, indem Adjektive und andere Funktionswörter ausgeschlossen wurden.
  • Stoppwortliste: Erstellung und Anwendung einer Stoppwortliste, die gängige Substantive (z.B. "System", "Stern", "Orbit", "Atmosphäre") enthielt, die auf "Planet" folgen könnten, aber nicht dessen Name sind. Die Überprüfung auf Wortaufnahme in dieser Liste half, irrelevante Treffer herauszufiltern.
  • Mindestwortlänge: Einführung einer Mindestwortlängenbeschränkung für Planetennamen, um Präpositionen und Konjunktionen auszuschließen.
  • Ausschluss von Satzanfängen: Eine zusätzliche Überprüfung, um festzustellen, ob das gefundene Wort am Satzanfang (nach einem Satzzeichen) stand, um zu vermeiden, dass gewöhnliche großgeschriebene Wörter fälschlicherweise als Planetennamen identifiziert wurden.

Nach einer Reihe von Iterationen und Verfeinerungen der regulären Ausdrücke wurde die Liste der identifizierten Planeten auf 281 reduziert. Dies ist ein realistischeres Ergebnis, das die Vielfalt der in den Alisa-Seleznjowa-Büchern erwähnten Welten widerspiegelt.

Kontextanalyse der Besuche: Alisas Reiseroute kartieren

Eine bloße Erwähnung eines Planeten im Text bedeutet nicht, dass die Protagonistin ihn tatsächlich besucht hat. Um Alisas tatsächliche Reisen zu ermitteln, wurde eine kontextuelle Analysemethode entwickelt. Die Kernhypothese war, dass ein Planetenbesuch durch die gleichzeitige Erwähnung von Alisas Namen (in verschiedenen grammatischen Fällen) und Verben, die Bewegung oder Anwesenheit anzeigen, in unmittelbarer Nähe des Planetennamens untermauert werden sollte.

Zur Implementierung dieses Ansatzes wurden folgende Elemente erstellt:

Google AdInline article slot
  • Alisas Namensmuster: Eine Liste regulärer Ausdrücke, die alle grammatischen Fälle des Namens "Alisa" abdeckt (z.B. r'\balice\b', r'\balice\b', r'\balice\b'). Die Verwendung von \b (Wortgrenzen) gewährleistete eine präzise Übereinstimmung.
  • Reiseverben: Eine umfassende Liste von Verben, die Bewegung, Ankunft oder Anwesenheit anzeigen (z.B. "arrived" – 'flog an', "visited" – 'besuchte', "turned out" – 'fand sich wieder'). Jedes Verb wurde ebenfalls als regulärer Ausdruck mit Wortgrenzen formatiert, um die Genauigkeit zu erhöhen.

Der Algorithmus funktionierte wie folgt: Für jeden identifizierten Planetennamen wurde ein Kontext definiert – ein Textfragment innerhalb von 100 Zeichen vor und nach dem Wort. Innerhalb dieses Kontextes wurden Übereinstimmungen für Alisas Namensmuster und Reiseverben gesucht. Wenn beide Arten von Mustern innerhalb des angegebenen Kontextes gefunden wurden, galt der Planet als besucht. Dieser Ansatz ermöglichte es, Planeten, die lediglich als Hintergrund dienten oder beiläufig erwähnt wurden, von jenen zu unterscheiden, auf denen aktive Ereignisse mit Alisa stattfanden.

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 = []
    # Simulation des Planetenmusters aus der vorherigen Phase
    # Zur Demonstration gehen wir davon aus, dass planets_list bereits gefilterte Planetennamen enthält
    # und für jeden von ihnen suchen wir nach Kontext
    for planet_name_entry in planets_list:
        planet_name = planet_name_entry # Wir gehen davon aus, dass dies nur ein String mit dem Planetennamen ist
        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

Als Ergebnis dieser Analyse wurde festgestellt, dass Alisa Seleznjowa von 281 erwähnten Planeten 12 besucht hat. Diese Zahl zeigt, wie selektiv der Autor die Geografie seiner Welt nutzte, indem er sich auf wichtige Abenteuerpunkte für die Protagonistin konzentrierte und gleichzeitig den Eindruck eines riesigen und detaillierten Universums durch zahlreiche, wenn auch nicht immer besuchte, Erwähnungen erweckte. Für ein 10-jähriges Mädchen stellen 12 besuchte Planeten eine beträchtliche Reiseleistung dar, insbesondere wenn man bedenkt, dass dies mit ihren Studien in Einklang gebracht werden musste.

Datenvisualisierung und Schlussfolgerungen

Die letzte Phase der Untersuchung umfasste die Visualisierung der gesammelten Daten. Die plotly-Bibliothek wurde verwendet, um interaktive Diagramme und Reisekarten zu erstellen. Die Visualisierung stellte klar dar:

  • Die Verteilung aller erwähnten Planeten.
  • Eine Karte von Alisas tatsächlichen Reisen, die zeigt, welche Planeten sie wirklich besucht hat.
  • Die Häufigkeit der Besuche auf jedem Planeten, was Einblicke in die wichtigsten Orte ihrer Abenteuer gibt.

Die grafische Darstellung der Daten macht die Analyseergebnisse zugänglicher und intuitiver und ermöglicht eine schnelle Einschätzung der kosmischen Wanderungen der Protagonistin. So wird beispielsweise deutlich, dass einige Planeten mehrfach besucht wurden und zu zentralen Handlungsorten avancierten, während andere nur einmal erwähnt wurden, um Atmosphäre zu schaffen oder die Hintergrundgeschichte zu erweitern.

Die gewonnenen Daten und Methoden können für weitere Analysen literarischer Werke genutzt werden, einschließlich der Untersuchung des Autorenstils, der Plotentwicklung und sogar für die Erstellung interaktiver Enzyklopädien fiktiver Universen. Diese Fallstudie demonstriert das Potenzial der Textanalyse in den Geisteswissenschaften, indem sie große Mengen unstrukturierter Texte in wertvolle quantitative Erkenntnisse umwandelt.

Wichtige Erkenntnisse

  • Die Anwendung von Python und regulären Ausdrücken ermöglicht eine tiefgehende literarische Analyse großer Textmengen und die Extraktion strukturierter Daten.
  • Die Entitätserkennung (z.B. Planeten) erfordert eine iterative Musterverfeinerung, um Fehlalarme zu eliminieren und den Kontext zu berücksichtigen.
  • Kontextanalyse ist entscheidend, um eine bloße Erwähnung von einer tatsächlichen Handlung oder einem Ereignis zu unterscheiden, was für eine genaue Dateninterpretation unerlässlich ist.
  • Die Bibliotheken re, collections, chardet und plotly sind leistungsstarke Werkzeuge für die Textanalyse und Ergebnisvisualisierung.
  • Selbst in der Fiktion können quantitative Daten extrahiert und analysiert werden, was neue Forschungswege in den Digital Humanities eröffnet.

— Editorial Team

Advertisement 728x90

Weiterlesen