파이썬으로 시적 패턴 분석하기: 조사 빈도에서 알고리즘 운 검색까지
디지털 인문학은 자연어 처리 도구를 활용해 예술적 텍스트를 해체할 수 있게 합니다. 기본 Python 메서드를 사용해 시에서 숨겨진 음운적·리듬적 구조를 드러내는 방법을 살펴보죠. 기능어의 빈도와 원운의 메커니즘을 평가하면서 무거운 NLP 프레임워크에 의존하지 않고요.
텍스트 코퍼스 준비와 정규 표현식 작업
어떤 언어 분석의 첫 단계는 입력 데이터를 정규화하는 것입니다. 원본 텍스트를 줄 단위로 나누고, 여분의 공백을 제거하며, 통일된 대소문자로 변환합니다. 여기서는 조사 “b”와 그 완전형 “would”의 빈도를 탐지하는 데 초점을 맞춥니다. 문자열 메서드 .count()로 직접 세면 노이즈가 발생합니다. 왜냐하면 “b” 문자가 콘텐츠 단어에 자주 등장하기 때문이죠. 조사를 정확히 분리하려면 단어 경계가 필수입니다.
lines_with_b = [line for line in lines if 'b' in line or 'would' in line]
count_b_lines = len(lines_with_b)
count_by = sum(line.lower().count('by') for line in lines)
count_b = sum(
len(re.findall(r'\bb\b', line.lower()))
for line in lines
)
리스트 컴프리헨션은 대상 토큰을 포함하는 줄을 필터링합니다. 그 다음 sum()으로 집계합니다. 핵심 요소는 정규 표현식 \bb\b입니다. 메타문자 \b는 단어와 비단어 요소(공백, 구두점, 줄 시작이나 끝) 사이의 경계를 나타냅니다. 이렇게 하면 고립된 조사만 매칭되고, “bokal”이나 “ryba” 같은 어휘소 내 발생은 무시됩니다. 프로덕션 솔루션에서는 표준 re 모듈이 하이픈이나 아포스트로피가 포함된 복잡한 경우에 키릴 문자 단어 경계를 항상 제대로 처리하지 않는다는 점을 염두에 두세요. 따라서 산업용 NLP 파이프라인은 종종 타사 라이브러리나 사전 토큰화에 의존합니다.
운 기반 알고리즘 검색
고전적 운은 강세 모음과 그 뒤 소리를 매칭합니다. 원시 텍스트 데이터에 강세 표시가 없으므로 휴리스틱 접근을 사용합니다: 단어 끝에서 모음 순서를 스캔하는 거죠. 함수는 문자열을 뒤집고, 문자를 순회하며 첫 자음에 도달할 때까지 모음을 누적한 후 원래 순서로 프래그먼트를 반환합니다.
def get_rhyme(word):
vowels = "aeiouy"
reversed_word = word[::-1].lower()
rhyme_part = ''
for char in reversed_word:
if char in vowels:
rhyme_part += char
elif rhyme_part:
break
return rhyme_part[::-1]
rhymes = []
for i in range(0, len(lines), 2):
if i + 1 < len(lines):
line1 = lines[i].strip().rstrip('.,!?').split()[-1]
line2 = lines[i+1].strip().rstrip('.,!?').split()[-1]
rhymes.append((get_rhyme(line1), get_rhyme(line2)))
이 알고리즘은 인접 또는 교차 운 확인을 시뮬레이션하기 위해 줄 쌍을 처리합니다. rstrip() 메서드는 후행 구두점을 제거하고, split()[-1]은 마지막 단어를 가져옵니다. 이 접근은 의도적으로 단순화되었습니다: 강세 위치, 비강세 모음 축소, 유음 자음을 무시하죠. 러시아 시 전통에서 이러한 요소가 종종 운에 기여합니다. 그래도 빠른 프로토타이핑과 원운 패턴 발견에는 이 휴리스틱이 훌륭한 정확도를 제공합니다. 대형 코퍼스에서 문자열 연산은 루프 연결 대신 슬라이싱으로 최적화하면 메모리 할당 오버헤드를 줄일 수 있습니다.
결과 검증과 언어학적 해석
스크립트 실행 시 문학 분석에 직접 연결되는 정량적 지표가 도출됩니다. 통계는 잘린 조사의 우위를 드러냅니다: 18줄 중 대상 마커가 12줄에 등장합니다. 알고리즘은 8개의 고립 “b” 발생과 2개의 “would” 사례를 기록합니다. 이 불균형은 구어체 레지스터의 의도적 사용을 강조하며, 즉흥성을 불러일으키고 책사적 관습을 깨뜨립니다.
운 끝 배열은 다음과 같습니다: [('and', 'e'), ('about', 'about'), ('and', 'and'), ('u', 'and'), ('', 'about'), ...]. 부분 모음 매칭은 모더니스트 시의 전형적인 원운을 가리킵니다. ABAB 교차 방식의 4보와 3보 야묵 교대는 들쭉날쭉한 리듬 흐름을 만듭니다. 두드러진 쌍 “point — bud”는 의미적 대조를 강조합니다: 정적 종결 대 생물학적 재생. 음운적으로 폭발 자음 [b]는 음향적 앵커 역할을 하며, 열리는 창문이나 첫 빗방울 소리를 연상시켜 텍스트를 단순 묘사에서 사운드스케이프로 승화시킵니다.
전체 수집 작품으로 이 분석을 확장할 때는 다음 기술적 측면을 고려하세요:
• 강세 사전 통합으로 운 기반을 정확히 파악하고 오탐지 줄이기.
• 단순 문자열 파싱 대신 구문 분석으로 전위와 줄넘김 제대로 처리.
• Levenshtein 거리나 음운 알고리즘으로 불완전 운 자음성 측정.
• 텍스트 프래그먼트를 임베딩으로 벡터화해 코퍼스의 주제·스타일 변화 클러스터링.
주요 takeaways
• 정규식 \bb\b는 콘텐츠 단어의 오탐지를 배제하며 조사를 엄격히 분리합니다.
• 문자열 뒤집기와 모음 필터링을 통한 휴리스틱 운 탐지는 빠른 프로토타입에 훌륭하지만, 세밀화 위해 강세 처리 필요.
• 잘린 “b” 조사의 수적 우위가 구어체 즉흥성으로의 전환을 수학적으로 뒷받침합니다.
• 운 배열의 원운 불일치는 정밀 고전 운에서 음향적 질감으로의 의도적 이탈을 신호합니다.
• 프로덕션급 시 분석을 위해 문자열 휴리스틱 대신 강세학 사전과 음운 유사도 지표를 배포하세요.
— Editorial Team
아직 댓글이 없습니다.