파이썬을 활용한 문학 분석: 정규 표현식으로 알리사 셀레즈네바의 우주 여정 매핑하기
문학 작품 분석에 프로그래밍 방식을 적용하면 텍스트 데이터를 이해하는 새로운 지평을 열 수 있습니다. 이 글에서는 알리사 셀레즈네바의 모험을 다룬 문학 작품들을 파이썬과 정규 표현식을 활용하여 심층 분석한 사례 연구를 소개합니다. 이 연구는 언급된 모든 행성을 식별하는 것뿐만 아니라, 주인공이 직접 방문한 행성이 무엇인지 문맥 분석 기법을 사용하여 파악하는 것을 목표로 했습니다.
데이터 수집 및 전처리
모든 텍스트 분석의 기본 단계는 데이터 수집 및 준비입니다. 이 특정 사례에서는 알리사 셀레즈네바의 모험에 대한 여러 이야기와 단편 소설들을 하나의 .txt 파일로 통합했습니다. 출처의 다양성을 고려할 때, 파일 인코딩을 자동으로 감지하는 것이 중요한 단계였으며, 이를 위해 chardet 라이브러리가 사용되었습니다. 이는 잘못된 문자 표시 문제를 방지하고 통일된 텍스트 처리를 보장했습니다.
후속 분석을 위해 표준 파이썬 라이브러리가 활용되었습니다:
re: 정규 표현식 작업을 위한 내장 모듈로, 텍스트 패턴 검색 및 추출에 필수적입니다.collections: 기본값을 가진 딕셔너리를 생성하는 데 사용된defaultdict와 요소 빈도를 계산하는Counter와 같은 특수 컨테이너 데이터 유형을 제공합니다.
행성 식별: 단순 검색에서 정밀 추출까지
텍스트에 언급된 모든 행성을 식별하는 작업은 처음 예상했던 것보다 더 복잡하다는 것이 밝혀졌습니다. 초기 접근 방식은 '행성'이라는 단어를 다양한 문법적 형태로 검색한 다음, 그 뒤에 오는 단어를 행성 이름으로 추출하는 것이었습니다. 이는 '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개를 초과하여, 알고리즘 개선의 필요성을 명확히 보여주었습니다.
정확도를 높이기 위해 다음과 같은 조정이 이루어졌습니다:
- 이름의 대소문자 구분: 대문자로만 시작하는 이름으로 검색을 제한했습니다. 이는 형용사 및 기타 기능어를 제외하여 오탐을 크게 줄였습니다.
- 불용어 목록: '행성' 뒤에 올 수 있지만 행성 이름이 아닌 일반 명사(예: "시스템", "별", "궤도", "대기")를 포함하는 불용어 목록을 생성하고 적용했습니다. 이 목록에 단어가 포함되어 있는지 확인하여 관련 없는 일치를 필터링하는 데 도움이 되었습니다.
- 최소 단어 길이: 전치사 및 접속사를 제외하기 위해 행성 이름에 대한 최소 단어 길이 제약을 도입했습니다.
- 문장 시작 제외: 발견된 단어가 문장 시작(구두점 뒤)에 있는지 확인하는 추가 검사를 통해 일반적인 대문자 단어를 행성 이름으로 오인하는 것을 방지했습니다.
일련의 반복과 정규 표현식 개선을 거쳐 식별된 행성 목록은 281개로 줄었습니다. 이는 알리사 셀레즈네바 책에 언급된 세계의 다양성을 반영하는 보다 현실적인 결과입니다.
방문 문맥 분석: 알리사의 여정 매핑하기
텍스트에 행성이 단순히 언급되었다고 해서 주인공이 실제로 그곳을 방문했다는 의미는 아닙니다. 알리사의 실제 여행을 파악하기 위해 문맥 분석 방법이 개발되었습니다. 핵심 가설은 행성 방문이 행성 이름과 가까운 곳에서 알리사의 이름(다양한 문법적 형태로)과 이동 또는 존재를 나타내는 동사가 동시에 언급됨으로써 입증되어야 한다는 것이었습니다.
이 접근 방식을 구현하기 위해 다음이 생성되었습니다:
- 알리사 이름 패턴: "알리사"라는 이름의 모든 문법적 형태를 포함하는 정규 표현식 목록(예:
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 라이브러리는 대화형 차트와 여행 지도를 만드는 데 사용되었습니다. 시각화는 다음을 명확하게 보여주었습니다:
- 언급된 모든 행성의 분포.
- 알리사의 실제 여행 지도, 그녀가 실제로 방문한 행성을 보여줍니다.
- 각 행성 방문 빈도, 그녀의 모험에서 가장 중요한 장소에 대한 통찰력을 제공합니다.
데이터의 그래픽 표현은 분석 결과를 더 접근하기 쉽고 직관적으로 만들어, 주인공의 우주 방랑을 빠르게 평가할 수 있게 합니다. 예를 들어, 일부 행성은 여러 번 방문되어 주요 활동 장소가 되었고, 다른 행성들은 분위기를 조성하거나 세계관을 확장하기 위해 한 번만 언급되었다는 것이 분명해집니다.
얻어진 데이터와 방법은 작가의 문체, 줄거리 전개 연구, 심지어 가상 세계의 대화형 백과사전 제작을 포함하여 문학 작품의 추가 분석에 사용될 수 있습니다. 이 사례 연구는 인문학 분야에서 텍스트 분석의 잠재력을 보여주며, 방대한 양의 비정형 텍스트를 가치 있는 정량적 통찰력으로 전환합니다.
주요 통찰
- 파이썬과 정규 표현식을 적용하면 방대한 텍스트의 심층 문학 분석이 가능하며, 구조화된 데이터를 추출할 수 있습니다.
- 개체 식별(예: 행성)은 오탐을 제거하고 문맥을 고려하기 위해 반복적인 패턴 개선이 필요합니다.
- 문맥 분석은 단순한 언급과 실제 행동 또는 사건을 구별하는 데 중요하며, 이는 정확한 데이터 해석에 필수적입니다.
re,collections,chardet,plotly라이브러리는 텍스트 분석 및 결과 시각화를 위한 강력한 도구입니다.- 소설에서도 정량적 데이터를 추출하고 분석할 수 있어 디지털 인문학 연구의 새로운 길을 열어줍니다.
— Editorial Team
아직 댓글이 없습니다.