본문 바로가기

AI LLM

[NLP] Tokenization(토큰화), Stemming(스테밍)

728x90

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(표제어 추출)이 필요하다.

다음 장에서 계속.

728x90