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:
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 jedefaultdict, který byl použit pro vytváření slovníků s výchozími hodnotami, aCounterpro 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:
- 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:
- 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,chardetaplotlyjsou 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
Zatím žádné komentáře.