불용어(stopwords)란?
텍스트에서 의미 전달에 크게 기여하지 않는 단어들을 의미합니다.
예를 들어, 한국어에서는 '그리고', '또는', '에서', '하지만' 같은 단어들이 불용어에 해당할 수 있으며, 영어에서는 'the', 'is', 'in', 'and' 같은 단어들이 있습니다.
불용어 제거의 목적은 텍스트 데이터에서 의미를 효과적으로 분석하기 위해 불필요한 정보를 제거하는 것입니다. 불용어들은 문장에서 자주 등장하지만, 특정 주제나 의미를 분석하는 데 있어 중요한 정보를 담고 있지 않기 때문에, 이를 제거함으로써 모델의 성능을 개선할 수 있습니다. 불용어를 제거하면 데이터의 크기가 줄어들고, 모델이 중요한 특징에 집중하도록 돕는 효과가 있습니다.
불용어 제거 방법은 주로 미리 정의된 불용어 목록을 사용하여 텍스트에서 해당 단어들을 삭제하는 방식으로 이루어집니다. 이러한 불용어 목록은 공개된 데이터나 도메인에 맞게 직접 설정할 수도 있으며, 특정 분석 목적에 따라 다르게 구성할 수 있습니다. 다만, 모든 경우에 불용어 제거가 반드시 필요한 것은 아니며, 문제에 따라 불용어가 중요한 의미를 가질 수도 있으므로 주의가 필요합니다.
불용어 제거는 토큰화, 형태소 분석 등과 함께 텍스트 전처리의 중요한 단계로, 이를 통해 더 정확한 자연어 처리 모델을 구축할 수 있습니다.
NLTK가 정의한 불용어 리스트
NLTK가 정의한 불용어 리스트를 출력해 보겠습니다.
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from konlpy.tag import Okt
stop_words_list = stopwords.words('english')
print('불용어 개수 :', len(stop_words_list))
print('불용어 10개 출력 :',stop_words_list[:10])
> 불용어 개수 : 179
> 불용어 10개 출력 : ['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're"]
결과를 보면 NLTK에서는 i, me, my와 같은 단어들을 불용어로 정의하고 있네요.
영어에서 불용어 제거하기
NLTK 라이브러리를 사용하여 영어 불용어를 제거해 보겠습니다.
토큰화된 단어 목록에서 불용어에 해당하지 않는 단어들만 필터링하여 최종 결과를 출력합니다.
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
# NLTK에서 불용어 목록 다운로드
# nltk.download('stopwords')
# nltk.download('punkt')
# 불용어 목록 설정 (영어)
stop_words = set(stopwords.words('english'))
# 예시 문장
example_sentence = "This is an example showing off stop word filtration."
# 토큰화
words = word_tokenize(example_sentence)
# 불용어 제거
filtered_sentence = [word for word in words if word.lower() not in stop_words]
print("원본 문장:", example_sentence)
print("불용어 제거 후:", " ".join(filtered_sentence))
> 원본 문장: This is an example showing off stop word filtration.
> 불용어 제거 후: example showing stop word filtration .
단어 토큰화를 수행한 후 NLTK가 정의하고 있는 불용어를 제외한 결과를 출력해 보았습니다.
결과적으로 'This', 'is', 'an', 'off'과 같은 단어들이 문장에서 제거되었음을 볼 수 있습니다.
한국어에서 불용어 제거하기
이번에는 직접 한국어 불용어 리스트를 정의하고 이를 기준으로 불용어를 제거합니다.
from konlpy.tag import Okt
# Okt 객체 생성
okt = Okt()
# 예제 문장
text = "오늘은 날씨가 매우 좋고, 내일도 맑을 예정입니다. 정말 기분이 좋네요."
# 한국어 불용어 리스트
korean_stopwords = ["은", "가", "도", "고", "이", "정말", "의"]
# 형태소 분석 후 단어 추출
words = okt.morphs(text)
# 불용어 제거
filtered_korean_words = [word for word in words if word not in korean_stopwords]
print("원본 문장:", text)
print("한국어 불용어 제거 후:", " ".join(filtered_korean_words))
> 원본 문장: 오늘은 날씨가 매우 좋고, 내일도 맑을 예정입니다. 정말 기분이 좋네요.
> 한국어 불용어 제거 후: 오늘 날씨 매우 좋고 , 내일 맑을 예정 입니다 . 기분 좋네요 .
한국어에서 불용어를 제거하는 방법으로는 간단하게는 토큰화 후에 조사, 접속사 등을 제거하는 방법이 있습니다.
하지만 불용어를 제거하려고 하다 보면 조사나 접속사와 같은 단어들뿐만 아니라 명사, 형용사와 같은 단어들 중에서 불용어로서 제거하고 싶은 단어들이 생기기도 합니다.
결국에는 위와 같이 사용자가 직접 불용어 사전을 만들게 되는 경우가 많습니다.