返回首页

Python 用于文学分析:Alice Selezneva 的太空路线

了解 Python 和正则表达式如何用于分析 Kir Bulychev 关于 Alice Selezneva 的文本语料库,识别提到的和访问过的行星。为 IT 专家提供的详细案例。

Python 和正则表达式:Alice Selezneva 的行星地图
Advertisement 728x90

Python文学分析:用正则表达式描绘爱丽丝·塞勒兹涅娃的星际之旅

运用编程方法分析文学作品,为理解文本数据开辟了新天地。本文将以爱丽丝·塞勒兹涅娃的冒险故事文学语料库为例,探讨如何使用Python和正则表达式进行深入分析。本研究旨在不仅识别所有被提及的行星,更要通过语境分析技术,确定主角亲自到访了哪些星球。

数据收集与预处理

任何文本分析的基础步骤都是数据收集与准备。在本案例中,关于爱丽丝·塞勒兹涅娃冒险经历的各种故事和中篇小说被整合到一个.txt文件中。鉴于来源的多样性,自动检测文件编码是关键一步,为此我们采用了chardet库。这有效避免了字符显示错误,确保了文本处理的统一性。

随后的分析中,我们使用了以下标准Python库:

Google AdInline article slot
  • re:用于处理正则表达式的内置模块,对于搜索和提取文本模式不可或缺。
  • collections:提供了专门的容器数据类型,例如defaultdict(用于创建带有默认值的字典)和Counter(用于统计元素频率)。

识别行星:从简单搜索到精确提取

识别文本中所有提及的行星的任务,比最初想象的要复杂。最初的方法是搜索“行星”('planet')一词的各种语法变体,然后将紧随其后的单词提取为行星名称。这利用了一个正则表达式,它考虑了俄语单词“planet”(行星)的不同词尾,并捕获了紧随其后的、以大写字母开头的单词。

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

然而,最初使用re.IGNORECASE标志(不区分大小写搜索)应用此模式,导致了大量的误报。例如,形容词(如“another”——“另一个”,“new”——“新的”)或其他名词可能紧随“行星”之后,并被错误地解读为行星名称。识别出的“行星”总数超过600个,这清楚地表明需要对算法进行改进。

为了提高准确性,我们进行了以下调整:

Google AdInline article slot
  • 名称大小写敏感性:将搜索范围限制为仅以大写字母开头的名称。这通过排除形容词和其他功能词,显著减少了误报。
  • 停用词列表:创建并应用了一个停用词列表,其中包括可能跟在“行星”之后但并非行星名称的常见名词(例如,“系统”、“恒星”、“轨道”、“大气层”)。检查单词是否包含在此列表中有助于过滤掉不相关的匹配项。
  • 最小词长:为行星名称引入了最小词长限制,以排除介词和连词。
  • 排除句子开头:增加了一项额外检查,以确定找到的单词是否位于句子开头(标点符号之后),从而避免将普通的大写单词错误地识别为行星名称。

经过一系列迭代和正则表达式优化,识别出的行星列表减少到281个。这是一个更现实的结果,反映了爱丽丝·塞勒兹涅娃系列书籍中提及的各种世界的丰富性。

到访的语境分析:描绘爱丽丝的行程

文本中仅仅提及一个行星,并不意味着主角实际到访过它。为了确定爱丽丝的实际旅行足迹,我们开发了一种语境分析方法。核心假设是,行星到访应该通过在行星名称附近同时提及爱丽丝的名字(以各种语法格位出现)以及表示移动或存在的动词来证实。

为了实现这一方法,我们创建了以下内容:

Google AdInline article slot
  • 爱丽丝名字模式:一个包含“爱丽丝”("Alisa")名字所有语法格位的正则表达式列表(例如,r'\balice\b'r'\balice\b'r'\balice\b')。使用\b(单词边界)确保了精确匹配。
  • 旅行动词:一个广泛的动词列表,表示移动、抵达或存在(例如,“arrived”——“飞抵”,“visited”——“到访”,“turned out”——“置身于”)。每个动词也被格式化为带有单词边界的正则表达式,以提高准确性。

该算法的运行方式如下:对于每个识别出的行星名称,定义一个语境——即单词前后100个字符范围内的文本片段。在此语境中,搜索爱丽丝名字模式和旅行动词的匹配项。如果在这特定语境中同时找到了这两种模式,则该行星被视为已被到访。这种方法能够区分那些仅仅作为背景或顺带提及的行星,与那些爱丽丝实际参与了活跃事件的行星。

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

经过这项分析,我们确定在281个被提及的行星中,爱丽丝·塞勒兹涅娃实际到访了12个。这个数字表明了作者如何有选择性地利用其世界的地理设定,将重点放在主角的关键冒险点上,同时通过大量(尽管并非总是到访)的提及,营造出一个广阔而细致的宇宙印象。对于一个10岁的女孩来说,到访12个行星代表着相当多的旅行,尤其考虑到她还需要兼顾学业。

数据可视化与结论

研究的最后阶段涉及收集到的数据可视化。我们使用plotly库创建了交互式图表和旅行地图。可视化清晰地呈现了:

  • 所有被提及行星的分布。
  • 爱丽丝实际旅行的地图,显示了她真正到访的行星。
  • 每个行星的到访频率,提供了对其冒险中最重要地点的洞察。

数据的图形化表示使得分析结果更易于理解和直观,能够快速评估主角的宇宙漫游。例如,很明显有些行星被多次到访,成为关键的行动地点,而另一些行星则只被提及一次,以营造氛围或扩展世界观。

所获得的数据和方法可用于文学作品的进一步分析,包括研究作者风格、情节发展,甚至可以用于创建虚构宇宙的交互式百科全书。本案例研究展示了文本分析在人文学科中的潜力,能够将大量非结构化文本转化为有价值的量化洞察。

核心洞察

  • 应用Python和正则表达式能够对大量文本进行深入的文学分析,提取结构化数据。
  • 实体识别(例如行星)需要迭代的模式优化,以消除误报并考虑语境。
  • 语境分析对于区分单纯的提及与实际的行动或事件至关重要,这对于准确的数据解释至关重要。
  • recollectionschardetplotly库是文本分析和结果可视化的强大工具。
  • 即使在虚构作品中,也可以提取和分析量化数据,为数字人文研究开辟新途径。

— Editorial Team

Advertisement 728x90

继续阅读