NLTK

김동준·2025년 9월 18일

LLM

목록 보기
18/50

NLTK는 Natural Language Toolkit의 약자로,
파이썬에서 자연어 처리(NLP, Natural Language Processing)를 배우고 실습할 때 가장 널리 쓰이는 라이브러리 중 하나예요.

주요 특징을 정리하면:
• 토큰화 (Tokenization): 문장을 단어, 문장 등으로 나누기
• 형태소 분석: 어간 추출(Stemming), 표제어 추출(Lemmatization)
• 품사 태깅 (POS Tagging)
• 파싱 (Parsing): 문법 구조 분석
• 코퍼스 제공: 영어 텍스트 데이터셋과 말뭉치(예: Gutenberg Corpus) 내장
• 간단한 텍스트 분류 기능도 제공 (예: 감정 분석 기본 예제)

즉, NLTK는 연구와 교육용에 초점이 맞춰져 있어서 배우기에는 좋지만,
실무에서는 속도가 느리고 한국어 지원이 약하다는 단점이 있어요.
그래서 KoNLPy(한국어), spaCy, Hugging Face Transformers 같은 도구와 함께 비교해서 쓰는 경우가 많습니다.

좋습니다! ✨ NLTK의 기본 예제 몇 가지를 보여드릴게요.

  1. 설치

pip install nltk

  1. 텍스트 토큰화 (단어/문장 분리)

import nltk
nltk.download('punkt')

from nltk.tokenize import word_tokenize, sent_tokenize

text = "NLTK is a leading platform for building Python programs to work with human language data. It's simple to use."

print("문장 토큰화:", sent_tokenize(text))
print("단어 토큰화:", word_tokenize(text))

출력 예시

문장 토큰화: ['NLTK is a leading platform for building Python programs to work with human language data.', "It's simple to use."]
단어 토큰화: ['NLTK', 'is', 'a', 'leading', 'platform', 'for', 'building', 'Python', 'programs', 'to', 'work', 'with', 'human', 'language', 'data', '.', 'It', "'s", 'simple', 'to', 'use', '.']

  1. 품사 태깅 (POS Tagging)

nltk.download('averaged_perceptron_tagger')

tokens = word_tokenize("NLTK is great for text processing")
tags = nltk.pos_tag(tokens)

print(tags)

출력 예시

[('NLTK', 'NNP'), ('is', 'VBZ'), ('great', 'JJ'), ('for', 'IN'), ('text', 'NN'), ('processing', 'NN')]

(여기서 NNP=고유명사, VBZ=동사(3인칭 단수), JJ=형용사 등)

  1. 간단한 어간 추출 (Stemming) vs 표제어 추출 (Lemmatization)

from nltk.stem import PorterStemmer, WordNetLemmatizer

nltk.download('wordnet')

stemmer = PorterStemmer()
lemmatizer = WordNetLemmatizer()

print("Stemming:", stemmer.stem("running"))
print("Lemmatization:", lemmatizer.lemmatize("running", pos="v"))

출력 예시

Stemming: runn
Lemmatization: run

👉 이런 식으로 NLTK는 자연어 처리의 기초 실습에 유용합니다.

좋습니다 👍 영어(NLTK)와 한국어(KoNLPy) 예제를 나란히 보여드릴게요.

🔹 1. 영어 (NLTK)

import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('wordnet')

from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer, WordNetLemmatizer

text = "NLTK is a leading platform for building Python programs to work with human language data."

단어 토큰화

tokens = word_tokenize(text)
print("단어 토큰화:", tokens)

품사 태깅

tags = nltk.pos_tag(tokens)
print("품사 태깅:", tags)

어간 추출 vs 표제어 추출

stemmer = PorterStemmer()
lemmatizer = WordNetLemmatizer()

print("Stemming:", [stemmer.stem(t) for t in tokens])
print("Lemmatization:", [lemmatizer.lemmatize(t) for t in tokens])

출력 예시

단어 토큰화: ['NLTK', 'is', 'a', 'leading', 'platform', 'for', 'building', 'Python', 'programs', 'to', 'work', 'with', 'human', 'language', 'data', '.']
품사 태깅: [('NLTK', 'NNP'), ('is', 'VBZ'), ('a', 'DT'), ...]
Stemming: ['NLTK', 'is', 'a', 'lead', 'platform', 'for', 'build', 'python', 'program', 'to', 'work', 'with', 'human', 'languag', 'data', '.']
Lemmatization: ['NLTK', 'is', 'a', 'leading', 'platform', 'for', 'building', 'Python', 'program', 'to', 'work', 'with', 'human', 'language', 'data', '.']

🔹 2. 한국어 (KoNLPy)

KoNLPy는 한국어 NLP용 파이썬 패키지입니다. 내부적으로 여러 형태소 분석기를 연결할 수 있습니다.
(예: Mecab, Okt, Komoran, Kkma, Hannanum)

from konlpy.tag import Okt

okt = Okt()
text = "자연어 처리는 재미있지만 어려운 분야입니다."

형태소 분석

morphs = okt.morphs(text)
print("형태소:", morphs)

품사 태깅

pos = okt.pos(text)
print("품사 태깅:", pos)

명사 추출

nouns = okt.nouns(text)
print("명사 추출:", nouns)

출력 예시

형태소: ['자연어', '처리', '는', '재미있', '지만', '어려운', '분야', '입니다', '.']
품사 태깅: [('자연어', 'Noun'), ('처리', 'Noun'), ('는', 'Josa'), ('재미있', 'Adjective'), ...]
명사 추출: ['자연어', '처리', '분야']

📌 정리:
• NLTK → 영어 NLP 기초 실습 (토큰화, POS tagging, stemming/lemmatization 등)
• KoNLPy → 한국어 NLP용 라이브러리 (형태소 분석, 품사 태깅, 명사 추출 등)

좋습니다 👍 영어용 NLTK와 한국어용 KoNLPy를 비교하는 표를 만들어드릴게요.

📊 NLTK vs KoNLPy 비교표

항목 NLTK KoNLPy
지원 언어 주로 영어 (다른 언어도 일부 가능하지만 제한적) 한국어 전용
주요 기능 - 토큰화 (문장/단어) - 품사 태깅 (POS tagging) - 어간 추출(Stemming) - 표제어 추출(Lemmatization) - 파싱, 텍스트 분류 - 대규모 영어 코퍼스 제공 - 형태소 분석 - 품사 태깅 - 명사 추출 - 여러 형태소 분석기 지원 (Okt, Mecab, Kkma, Komoran, Hannanum)
학습용/실무용 교육/연구 중심 (속도 느림, 실무 한계) 연구 및 간단한 실무 가능 (형태소 분석 정확도 높음)
장점 - 풍부한 튜토리얼 & 문서 - 다양한 NLP 기능 - 내장 코퍼스 (영어 데이터셋) - 한국어 처리 특화 - 여러 분석기 선택 가능 - 간단한 API
단점 - 한국어 지원 약함 - 속도가 느려 대규모 데이터 처리에 부적합 - 영어 지원 없음 - 형태소 분석기 성능은 라이브러리에 따라 다름 - 대규모 딥러닝 기반 기능 부족
대안/확장 spaCy, Hugging Face Transformers (실무용) Mecab(고속), khaiii, 딥러닝 기반 Transformers(KoBERT, KLUE 등)

📌 핵심 요약:
• NLTK → 영어 NLP 학습용 (토큰화, 품사 태깅, 전통 NLP 기능 연습)
• KoNLPy → 한국어 NLP 학습용 (형태소 분석/품사 태깅/명사 추출에 강점)

좋아요! 😄 영어(NLTK)와 한국어(KoNLPy)를 같은 문장에 적용해서 결과를 비교해보겠습니다.

📌 예제 문장

자연어 처리는 재미있지만 어려운 분야입니다. Natural Language Processing is fun but challenging.

1️⃣ 영어 (NLTK)

import nltk
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer, WordNetLemmatizer

nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('wordnet')

text_en = "Natural Language Processing is fun but challenging."

토큰화

tokens_en = word_tokenize(text_en)

품사 태깅

pos_en = nltk.pos_tag(tokens_en)

Stemming / Lemmatization

stemmer = PorterStemmer()
lemmatizer = WordNetLemmatizer()
stemmed_en = [stemmer.stem(t) for t in tokens_en]
lemmatized_en = [lemmatizer.lemmatize(t) for t in tokens_en]

print("영어 토큰화:", tokens_en)
print("영어 품사 태깅:", pos_en)
print("영어 Stemming:", stemmed_en)
print("영어 Lemmatization:", lemmatized_en)

출력 예시

영어 토큰화: ['Natural', 'Language', 'Processing', 'is', 'fun', 'but', 'challenging', '.']
영어 품사 태깅: [('Natural', 'JJ'), ('Language', 'NNP'), ('Processing', 'NNP'), ('is', 'VBZ'), ('fun', 'NN'), ('but', 'CC'), ('challenging', 'VBG'), ('.', '.')]
영어 Stemming: ['natur', 'languag', 'process', 'is', 'fun', 'but', 'challeng', '.']
영어 Lemmatization: ['Natural', 'Language', 'Processing', 'is', 'fun', 'but', 'challenging', '.']

2️⃣ 한국어 (KoNLPy)

from konlpy.tag import Okt

okt = Okt()
text_ko = "자연어 처리는 재미있지만 어려운 분야입니다."

형태소 분석

morphs_ko = okt.morphs(text_ko)

품사 태깅

pos_ko = okt.pos(text_ko)

명사 추출

nouns_ko = okt.nouns(text_ko)

print("한국어 형태소:", morphs_ko)
print("한국어 품사 태깅:", pos_ko)
print("한국어 명사 추출:", nouns_ko)

출력 예시

한국어 형태소: ['자연어', '처리', '는', '재미있', '지만', '어려운', '분야', '입니다', '.']
한국어 품사 태깅: [('자연어', 'Noun'), ('처리', 'Noun'), ('는', 'Josa'), ('재미있', 'Adjective'), ('지만', 'Josa'), ('어려운', 'Adjective'), ('분야', 'Noun'), ('입니다', 'Adjective'), ('.', 'Punctuation')]
한국어 명사 추출: ['자연어', '처리', '분야']

3️⃣ 비교 요약

기능 영어 (NLTK) 한국어 (KoNLPy)
토큰화/형태소 분석 [‘Natural’, ‘Language’, …][‘자연어’, ‘처리’, ‘는’, …]
품사 태깅 [(‘Natural’, ‘JJ’), (‘Language’, ‘NNP’), …][(‘자연어’, ‘Noun’), (‘처리’, ‘Noun’), …]
어간/표제어 Stemming: [‘natur’, ‘languag’, …] Lemmatization: [‘Natural’, ‘Language’, …] 없음 (한국어는 형태소 단위로 충분)
명사 추출 직접 필터링 필요 okt.nouns() → [‘자연어’, ‘처리’, ‘분야’]

📌 포인트:
• 영어는 토큰화 + POS tagging + Stemming/Lemmatization 순서가 일반적
• 한국어는 형태소 분석 + POS tagging + 명사 추출 순서가 일반적
• 한국어는 어간 추출보다 형태소 분석 자체가 강력하여 명사/동사 단위로 바로 처리 가능

profile
Story Engineer

0개의 댓글