어간 추출(Stemming)

애늙은이·2023년 8월 11일
0

NLP 여행기

목록 보기
5/13
post-thumbnail

🤔 어간 추출이란?

어간 추출은 단어에서 접사를 제거하여 어간을 추출하는 기능을 수행합니다. 이를 통해서 코퍼스에 있는 다른 형태의 여러 단어들을 정리할 수 있죠.

만약, 코퍼스에 connection, connected, connecting이라는 단어가 들어있다고 한다면 형태가 다르기 때문에 이를 모두 다르게 인식할 수 있습니다. 하지만 세 단어의 뜻은 connect에서 파생된 의미를 가지고 있죠. 때문에 어간 추출을 통해서 connect라는 하나의 단어로 만드는 것입니다.

이렇게 표현이 다른 여러 단어들을 하나의 단어로 만드는 과정을 정규화(Normalization)라고 합니다. 이번 시간에 배울 어간 추출과 다음 시간에 배울 표제어 추출이 대표적인 정규화 방법에 속합니다.

NLTK에서 어간 추출은 다음과 같이 이루어집니다.

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
word = "walked"

print(stemmer.stem(word))


# 결과
# walk

위의 코드를 보면, NLTK 내 PorterStemmer라는 어간 추출기를 활용하여 walk에서 -ed라는 접사를 제거한 것을 알 수 있습니다.

💡 어간 추출의 특징

어간 추출은 규칙 기반의 알고리즘을 가지고 있습니다. 예시로 앞서 살펴보았던 NLTK의 PorterStemmer의 경우, 접사 ANCE가 오면 이를 제거하는 규칙을 가지고 있죠. 때문에 어간 추출은 사전 상에 등록되지 않은 신조어나 오타같은 단어들도 쉽게 처리가 가능합니다.

어간 추출에서 사용되는 규칙들은 어떤 어간 추출기를 선택하냐에 따라 다르기에, 그에 따른 결과가 다를 수 있습니다. 일례로, 아까 사용했던 PorterStemmer와 NLTK의 다른 어간 추출기인 SnowballStemmer를 비교하면 다음과 같습니다.

from nltk.stem import PorterStemmer
from nltk.stem.snowball import SnowballStemmer

stemmer1 = PorterStemmer()
stemmer2 = SnowballStemmer('english')


print(stemmer1.stem('has')) # 결과: ha
print(stemmer2.stem('has')) # 결과: has

⚠ 어간 추출의 한계

어간 추출은 결국 규칙에 기반하기 때문에 단어를 완벽하게 일반화할 수 없다는 한계점을 가지고 있습니다. 불규칙으로 변형하는 것들에 대해서는 잘 처리하지 못하는 경우가 있으며, 전혀 다른 단어가 되는 경우 또한 있을 수 있죠.

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()

print(stemmer.stem('went')) # 결과: went
print(stemmer.stem('studied')) # 결과: studi

went의 경우는 go의 과거형이지만 규칙 기반의 어간 추출이기에 go로 처리하지 못하는 모습을 보이며, studied의 경우에도 접사 -ed만을 제거하여 studi라는 없는 단어가 등장한 것을 확인할 수 있습니다.

profile
글쓰는 개발자입니다.

0개의 댓글