1. NLTK 시작하기: 자연어 처리의 다용도 도구상자
자연어 처리(NLP)를 처음 접하는 분들이 텍스트 데이터 앞에서 어디서부터 시작해야 할지 막막해하는 경우가 많습니다. 그런 경우 NLTK라는 오랜 친구부터 시작해보시길 강력히 추천합니다. NLTK는 Natural Language Toolkit의 약자로, 파이썬에서 오랜 역사를 가진 강력한 NLP 라이브러리입니다. 이것은 기능이 풍부한 "스위스 칼"과 같다고 생각할 수 있으며, 여기에는 토큰화, 품사 태깅과 같은 다양한 텍스트 처리 도구뿐만 아니라, 풍부한 내장 말뭉집 컬렉션이 포함되어 있습니다. 이것은 고급 주방 도구를 구매했을 때, 판매자가 다양한 품질 좋은 재료를 친절하게 함께 제공해주는 것과 같습니다. 즉, 바로 사용할 수 있는 재료를 손에 넣어 즉시 요리 연습을 시작할 수 있으며, 전 세계에서 원자재를 찾아 헤매는 수고를 덜어줍니다.
많은 초보자들이 바로 최신 사전 학습 대형 모델을 사용하고 싶어 합니다. 이것이 틀린 것은 아니지만, 저의 경험상 데이터 자체의 구조와 특성을 먼저 이해하지 않고 복잡한 모델을 바로 사용하면 쉽게 "함정"에 빠지게 됩니다. NLTK의 내장 말뭉집은 텍스트 데이터를 이해하는 최고의 "연습 재료"입니다. 이들은 청소와 정리가 완료된 고전 데이터셋으로, 형식이 통일되어 있어 바로 사용할 수 있습니다. 예를 들어, 소설의 언어 스타일을 연구하고 싶다면 gutenberg 말뭉집의 《백경》을 직접 호출할 수 있고, 뉴스 분류 작은 프로젝트를 만들고 싶다면 reuters 말뭉집이 이미 수만 개의 뉴스를 분류해두었습니다. 이러한 "박스 개봉 즉시 사용" 경험은 NLP 작업에 대한 직관적인 감각을 빠르게 형성하게 해주어, 알고리즘과 응용 로직에 집중할 수 있게 하며, 번거로운 데이터 수집 및 정리에 시간을 낭비하지 않게 해줍니다.
그렇다면 어떻게 시작해야 할까요? 먼저 파이썬과 NLTK가 설치되어 있는지 확인하세요. NLTK를 설치하는 것은 한 줄의 명령어만 필요합니다: pip install nltk. 설치가 완료되면 데이터 패키지도 다운로드해야 합니다. 이것이 NLTK의 큰 특징 중 하나입니다 - 도구와 데이터셋은 분리되어 있습니다. 파이썬 대화형 환경에서 다음 코드를 입력하면 일반적으로 사용되는 말뭉집과 모델을 로컬에 다운로드할 수 있습니다:
import nltk
nltk.download('popular')
이 명령은 나중에 설명할 고텐프로젝트, 브라운 말뭉집, 로이터 뉴스 등을 포함한 비교적 포괄적인 데이터 패키지를 다운로드합니다. 다운로드는 인터넷 속도에 따라 시간이 다소 걸릴 수 있습니다. 완료되면 nltk.corpus 모듈을 통해 이러한 보물 데이터에 쉽게 접근할 수 있습니다. 다음으로 이 다용도 도구상자를 열어서 내부에 어떤 좋은 것들이 있으며, 어떻게 사용하여 흥미로운 분석을 만들 수 있는지 함께 살펴보겠습니다.
2. 텍스트 말뭉집 실전: 고전 문학에서 현대 뉴스까지
NLTK의 내장 텍스트 말뭉집은 고전 문학에서 뉴스 보도에 이르기까지 다양한 장르를 아우릅니다. 이러한 말뭉집은 단순히 정적인 텍스트 파일이 아니라, 구조화된 데이터로 정교하게 조직되어 있습니다. 간단한 메소드 호출을 통해 원시 텍스트, 단어 목록, 문장 목록, 심지어 문단 목록까지 직접 얻을 수 있습니다. 이러한 설계는 가장 어려운 데이터 파싱 단계를 건너뛰고 바로 분석 단계로 진입할 수 있게 해줍니다.
2.1 고텐프로젝트: 시공간을 초월하는 문학 분석
gutenberg 말뭉집은 제가 가장 좋아하는 말뭉집으로, 18권의 공용 도메인에 진입한 고전 영문 문학 작품을 수록하고 있습니다. 제인 오스틴의 《엠마》, 멜빌의 《백경》, 그리고 《성경》 영어 개정판 등이 포함됩니다. 이러한 텍스트는 역사적 언어 변화, 작가의 글쓰기 스타일, 심지어 문화적 관념을 연구하기 위한 훌륭한 자료입니다.
말뭉집을 얻으면 먼저 내부에 무엇이 있는지 확인하는 것이 습관입니다. fileids() 메소드를 사용하여 사용 가능한 모든 텍스트 파일을 나열할 수 있습니다:
from nltk.corpus import gutenberg
print(gutenberg.fileids())
18개의 파일명이 포함된 목록을 볼 수 있으며, 각각은 작품 하나에 해당합니다. 《성경》을 분석하고 싶다고 가정해봅시다. 파일명은 'bible-kjv.txt'입니다. NLTK는 여러 가지 다른 수준의 데이터 가져오기 방법을 제공합니다:
raw(): 원시 전체 텍스트 문자열을 가져옵니다.words(): 공백과 구두점으로 분할된 단어 목록을 가져옵니다.sents(): 문장 목록을 가져오며, 각 문장 자체는 다시 단어 목록입니다.
이제 《성경》의 데이터 규모와 몇 가지 기본 통계를 실제로 살펴보겠습니다:
# 성경 단어 목록 가져오기
bible_tokens = gutenberg.words('bible-kjv.txt')
print(f"총 토큰 수(구두점 포함): {len(bible_tokens)}")
# 어휘량 계산(고유 단어 수)
vocabulary = set(w.lower() for w in bible_tokens if w.isalpha()) # 소문자로 변환 및 알파벳 단어만 필터링
print(f"어휘량(중복 제거 후): {len(vocabulary)}")
# FreqDist를 사용한 단어 빈도 분석
from nltk import FreqDist
token_distribution = FreqDist(w.lower() for w in bible_tokens if w.isalpha())
print("가장 흔한 10개 실단어:", token_distribution.most_common(10))
이 코드를 실행하면 《성경》의 총 단어 수가 백만을 초과하지만 어휘량은 만 개도 채 되지 않는다는 것을 알 수 있습니다. 이것은 "the", "and", "of"와 같은 고빈도 기능 단어가 상당 부분을 차지하고 있음을 의미합니다. 이것이 바로 우리가 텍스트 분석할 때 자주 언급하는 "지프의 법칙"을 보여줍니다: 소수의 단어가 텍스트의 대부분 출현 횟수를 차지합니다.
더 흥미로운 것은 문맥 분석을 하는 것입니다. NLTK의 Text 객체는 "리더"와 유사한 기능을 제공합니다. 이를 사용하여 특정 단어의 용법을 탐색할 수 있습니다:
from nltk.text import Text
bible_reader = Text(gutenberg.words('bible-kjv.txt'))
# "God"라는 단어의 문맨 보기(키워드 색인)
bible_reader.concordance("God", width=50, lines=5)
# "God"와 유사한 문맥에서 나타나는 단어 찾기
bible_reader.similar("God")
# 텍스트에서 흔한 콜로케이션(예: "the Lord") 찾기
bible_reader.collocations(num=20)
concordance 기능은 읽기 소프트웨어에서 단어를 검색하는 것과 같으며, 이 단어가 나타날 때마다 그 문맥을 표시하여 용법을 직관적으로 느끼게 해줍니다. similar 기능은 "God"가 나타나는 문장 구조에서 자주 나타나는 다른 단어를 찾아내어 의미적 연관성을 이해하는 데 도움이 됩니다. collocations는 "United States", "New York"처럼 자주 함께 고정적으로 나타나는 단어 그룹을 자동으로 찾아내어 구문 추출에 매우 유용합니다.