Zpět na domů

Python pro literární analýzu: Vesmírné trasy Alisy Selezňovové

Prozkoumejte, jak se Python a regulární výrazy používají k analýze korpusu textů Kira Bułyčova o Alise Selezňovové, odhalující zmíněné a navštívené planety. Podrobný případ pro IT specialisty.

Python a regulární výrazy: Kartografie planet Alisy Selezňovové
Advertisement 728x90

Literární analýza s Pythonem: Jak regulární výrazy pomohly zmapovat vesmírné cesty Alisy Selezňovové

Použití softwarových metod pro analýzu literárních děl otevírá nové obzory v porozumění textovým datům. Tento článek představuje případovou studii využití Pythonu a regulárních výrazů pro hloubkovou analýzu souboru textů o dobrodružstvích Alisy Selezňovové. Cílem výzkumu nebylo pouze identifikovat všechny zmíněné planety, ale také určit, které z nich hlavní hrdinka osobně navštívila, a to pomocí metod kontextové analýzy.

Sběr a předzpracování textových dat

Počáteční fází jakékoli textové analýzy je sběr a příprava dat. V tomto případě byly roztroušené povídky a novely o dobrodružstvích Alisy Selezňovové agregovány do jednoho textového souboru ve formátu .txt. Vzhledem k různorodosti zdrojů se kritickým krokem stalo automatické určení kódování souboru, k čemuž byla použita knihovna chardet. To pomohlo předejít problémům s nesprávným zobrazením znaků a zajistit jednotné zpracování textu.

Pro následnou analýzu byly použity standardní knihovny Pythonu:

Google AdInline article slot
  • re: Vestavěný modul pro práci s regulárními výrazy, nepostradatelný pro vyhledávání a extrakci textových vzorů.
  • collections: Poskytuje specializované typy kontejnerů, jako je defaultdict, který byl použit pro vytváření slovníků s výchozími hodnotami, a Counter pro počítání frekvence prvků.

Identifikace planet: od jednoduchého hledání k přesné extrakci

Úkol identifikovat všechny planety zmíněné v textu se ukázal být složitější, než se na první pohled zdá. Původní přístup spočíval v hledání slova „planeta“ v různých pádech a následné extrakci slova, které za ním následovalo, jako názvu. K tomu byl použit regulární výraz, který zohledňoval varianty koncovek slova „planeta“ a zachytával následující slovo začínající velkým písmenem.

def find_planets_after_word(text):
    if text is None:
        return [], []
    pattern_planet_name = r'''
        (?<![\.\!\?\n])          
        (planets[aeuy]?|planets)   
        \s+                        
        ([A-Z][a-z]+)           
    '''
    # pattern_sentence_start = r'[\.\!\?][\s]+([A-Z][a-z]+)' # Původně použito pro vyloučení začátku vět
    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)
        # Dodatečná logika pro filtrování a kontextovou analýzu byla přidána později

První použití takového vzoru s příznakem re.IGNORECASE (hledání nerozlišující velikost písmen) však vedlo k četným falešným pozitivům. Například po slově „planeta“ mohla následovat přídavná jména („jiná“, „nová“) nebo jiná podstatná jména, která byla chybně interpretována jako názvy planet. Celkový počet „planet“ přesáhl 600, což jasně naznačovalo potřebu vylepšení algoritmu.

Pro zvýšení přesnosti byly provedeny následující úpravy:

Google AdInline article slot
  • Rozlišování velikosti písmen pro názvy: Omezení hledání na názvy začínající pouze velkým písmenem. To výrazně snížilo počet falešných pozitiv, vyloučilo přídavná jména a další pomocná slova.
  • Seznam stop-slov: Vytvoření a použití seznamu stop-slov, zahrnujícího obecná podstatná jména (například „systém“, „hvězda“, „oběžná dráha“, „atmosféra“), která mohou následovat po slově „planeta“, ale nejsou jejím jménem. Kontrola, zda se slovo nachází v tomto seznamu, umožnila odfiltrovat irelevantní shody.
  • Minimální délka slova: Zavedení omezení na minimální délku slova pro názvy planet, aby se vyloučily předložky a spojky.
  • Vyloučení začátku vět: Dodatečná kontrola, zda nalezené slovo je začátkem věty (po interpunkčním znaménku), aby se předešlo chybné identifikaci běžných slov začínajících velkým písmenem jako názvů planet.

Po sérii iterací a upřesnění regulárních výrazů se seznam nalezených planet zmenšil na 281, což je realističtější výsledek, odrážející rozmanitost zmíněných světů v knihách o Alise Selezňovové.

Kontextová analýza návštěv: určení Alisiných tras

Pouhá zmínka planety v textu neznamená, že ji hlavní hrdinka navštívila. Pro určení skutečných cest Alisy byla vyvinuta metoda kontextové analýzy. Hlavní hypotéza spočívala v tom, že návštěva planety by měla být potvrzena současnou zmínkou Alisina jména (v různých pádech) a sloves označujících pohyb nebo pobyt, v bezprostřední blízkosti názvu planety.

Pro realizaci tohoto přístupu byly vytvořeny:

Google AdInline article slot
  • Vzory jména Alisy: Seznam regulárních výrazů pokrývajících všechny pádové tvary jména „Alisa“ (například r'\balice\b', r'\balice\b', r'\balice\b'). Použití \b (hranice slova) zajišťovalo přesnou shodu.
  • Slovesa cestování: Rozsáhlý seznam sloves označujících pohyb, příjezd nebo pobyt (například „přiletěla“, „pobyla“, „ocitla se“). Každé sloveso bylo rovněž formulováno jako regulární výraz s hranicemi slova pro zvýšení přesnosti.

Algoritmus fungoval následovně: pro každý nalezený název planety byl určen kontext – úsek textu v rozsahu 100 znaků před a po slově. V tomto kontextu se hledaly shody s vzory Alisina jména a slovesy cestování. Pokud se oba typy vzorů nacházely v daném kontextu, planeta byla považována za navštívenou. Tento přístup umožnil odlišit planety, které sloužily pouze jako pozadí nebo byly zmíněny jen okrajově, od těch, kde se odehrávaly aktivní události s účastí Alisy.

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 = []
    # Simulace planet_pattern z předchozí fáze
    # Pro demonstraci předpokládáme, že planets_list obsahuje již filtrované názvy planet
    # a pro každý z nich hledáme kontext
    for planet_name_entry in planets_list:
        planet_name = planet_name_entry # Předpokládáme, že je to jen řetězec s názvem planety
        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

V důsledku této analýzy bylo zjištěno, že z 281 zmíněných planet Alisa Selezňovová navštívila 12. Toto číslo ukazuje, jak selektivně autor využíval geografii svého světa, zaměřoval se na klíčové body dobrodružství hrdinky, přičemž vytvářel dojem rozsáhlého a detailního vesmíru díky četným, ale ne vždy navštíveným zmínkám. Pro 10letou dívku je 12 navštívených planet značný objem cestování, vzhledem k nutnosti skloubit je se studiem.

Vizualizace dat a závěry

Závěrečnou fází výzkumu byla vizualizace získaných dat. Pro vytvoření interaktivních grafů a map cest byla použita knihovna plotly. Vizualizace umožnila názorně představit:

  • Rozložení všech zmíněných planet.
  • Mapu skutečných Alisiných cest, ukazující, které planety skutečně navštívila.
  • Frekvenci návštěv každé planety, což poskytlo představu o nejvýznamnějších místech v jejích dobrodružstvích.

Grafické znázornění dat činí výsledky analýzy přístupnějšími a intuitivnějšími, což umožňuje rychle posoudit rozsah vesmírných putování hrdinky. Například je zřejmé, že některé planety byly navštíveny opakovaně a staly se klíčovými místy děje, zatímco jiné byly zmíněny pouze jednou pro vytvoření atmosféry nebo rozšíření světa.

Získaná data a metody lze využít pro další analýzu literárních děl, včetně studia autorského stylu, vývoje zápletky a dokonce i pro vytváření interaktivních encyklopedií fiktivních vesmírů. Tato případová studie demonstruje potenciál textové analytiky v humanitních vědách, přeměňující velké objemy nestrukturovaného textu na cenné kvantitativní poznatky.

Co je důležité

  • Použití Pythonu a regulárních výrazů umožňuje provádět hloubkovou literární analýzu velkých objemů textu a extrahovat strukturovaná data.
  • Identifikace entit (například planet) vyžaduje iterativní úpravy vzorů pro vyloučení falešných pozitiv a zohlednění kontextu.
  • Kontextová analýza je nezbytná pro rozlišení pouhé zmínky od skutečné akce nebo události, což je kriticky důležité pro přesnou interpretaci dat.
  • Knihovny re, collections, chardet a plotly jsou výkonnými nástroji pro textovou analytiku a vizualizaci výsledků.
  • I v krásné literatuře lze extrahovat a analyzovat kvantitativní data, což otevírá nové perspektivy pro výzkum v oblasti digitálních humanitních věd.

— Editorial Team

Advertisement 728x90

Číst dál