Tokenization(토큰화) 란?
토큰화는 자연어 처리 과정에서 가장 기본적인 전처리 단계 중 하나로, 텍스트를 더 작고 분석 가능한 단위인 토큰으로 분할하는 과정을 말한다.
문단이나 문장을 토큰으로 변환하는 과정이며, 토큰은 문장이 될 수도 있고 단어가 될 수도 있다.
아래 4가지 개념들을 이해해야 한다.
1. Corpus = (Paragraph), 문단들의 집합
2. Document = (Sentences), 문장들의 집합
3. Vocabulary = (Unique words), 단어들(중복 가능)
4. Words, 단어들(중복 허용)
1. 예를들어 아래 Corpus가 있다고 가정하자.
"My name is overact and i am learning NLP.
I am also learning ML."
2. 두 개의 Sentences로 나뉠 수 있다.
1) My name is overact and I am learning NLP.
2) I am also learning ML.
3. 총 14개의 Words가 있다.
4. I, am, learning 이 중복되므로 11개의 Vocabulary가 존재한다.
Stemming
스테밍(Stemming)은 자연어 처리(NLP)의 텍스트 전처리 과정 중 하나로, 단어의 다양한 형태(굴절 또는 파생)에서 접사(affix) 등을 제거하여 단어의 원형 또는 어간(stem)을 추출하는 기법이다.
즉 의미적으로 유사한 단어들을 하나의 동일한 형태로 통합하여 처리하는 것
스테밍의 목적 및 필요성:
예를 들어 "run", "running", "runner", "runs", "ran" 등은 모두 '달리다'라는 기본적인 의미와 관련이 있다.
기본적인 NLP 시스템은 이러한 형태 변화가 있는 단어들을 모두 다른 단어로 인식하기 때문에, Stemming을 통해 하나의 어간(stem) 으로 통합하여 처리할 수 있다.
1. PorterStemmer
아래와 같이 stemming을 진행해보자.
from nltk.stem import PorterStemmer
stemming = PorterStemmer()
words=["eating","eats","eaten","writing","writes","programming","programs","history","finally","finalized"]
for word in words:
print(word+"---->"+stemming.stem(word))
결과 :
eating---->eat
eats---->eat
eaten---->eaten
writing---->write
writes---->write
programming---->program
programs---->program
history---->histori
finally---->final
finalized---->final
history -> histori와 같이 단어의 의미가 올바르게 변경되지 못할 수 있다는 단점이 존재한다.
어간(stem)이 실제 단어와 상이할 수 있다는 것이다.
2. RegexpStemmer
RegexpStemmer는 정규 표현식(Regular Expression)을 사용하여 단어의 접미사(또는 접두사)를 제거하는 스테머이다.
from nltk.stem import RegexpStemmer
reg_stemmer=RegexpStemmer('$ing|s$|e$|able$', min=4)
reg_stemmer.stem('eating')
결과 :
'eat'
3. snowballStemmer
RegexpStemmer처럼 단순 패턴 매칭이 아니라, 미리 정의된 다단계 규칙 세트를 사용하여 단어의 접미사를 체계적으로 제거한다. 각 단계의 규칙은 특정 조건을 만족할 때만 적용되며, 단어의 형태를 점진적으로 줄여 나간다.
from nltk.stem import SnowballStemmer
snowballStemmer = SnowballStemmer('english')
for word in words:
print(word+"---->"+snowballStemmer.stem(word))
결과:
eating---->eat
eats---->eat
eaten---->eaten
writing---->write
writes---->write
programming---->program
programs---->program
history---->histori
finally---->final
finalized---->final
물론 위 결과에서 보이듯 완벽하지 않지만, 더 나은 성능을 나타낸다.
snowballStemmer.stem("fairly"), snowballStemmer.stem("sportingly")
결과:
('fair', 'sport')
이렇게 단어의 의미가 변경되는 것을 방지하기 위해 Lemmatization(표제어 추출)이 필요하다.
다음 장에서 계속.
'AI LLM' 카테고리의 다른 글
| Word Embedding, Word2Vec (0) | 2025.06.07 |
|---|---|
| [NLP - 벡터 변환 알고리즘] TF-IDF (0) | 2025.05.25 |
| [NLP - 벡터 변환 알고리즘] Bag of Words, N-Gram (0) | 2025.05.22 |
| [NLP - 벡터 변환 알고리즘] One-Hot Encoding (0) | 2025.05.22 |
| [NLP] Lemmatization (표제어 추출), Stopwords(불용어) (2) | 2025.05.20 |