NLP 텍스트 전처리(불용어)

2 minute read

불용어(Stopword)

갖고 있는 데이터에서 유의미한 단어 토큰만을 선별하기 위해서는 큰 의미가 없는 단어 토큰을 제거하는 작업이 필요하다. 여기어 큰 의미가 없다라는 것은 자주 등장하지만 분석을 하는 것에 있어서는 큰 도움이 되지 않는 단어들을 말한다. 예를 들면, i, my, me, over, 조사, 접미사 같은 단어들은 문장에서는 자주 등장하지만 실제 의미를 분석 하는데는 거의 기여하는 바가 없는 경우가 있다. 이러한 단어들을 불용어(stopword)라고 하며, NLTK에서는 위와 같은 100여개 이상의 영어 단어들을 불용어로 패키지 내에서 미리 정의하고 있다.

물론 불용어는 개발자가 직접 정의할 수도 있다.

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from konlpy.tag import Okt

만약, 데이터가 없다는 에러가 발생 시에는 nltk.download(필요한 데이터) 라는 커맨드를 통해 다운로드 할 수 있다.

1. NLTK에서 불용어 확인하기

stop_words_list = stopwords.words('english')
print(f"불용어 개수 = {len(stop_words_list)}")
print(f"불용어 10개 출력 = {stop_words_list[:10]}")
불용어 개수 = 179
불용어 10개 출력 = ['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're"]

stopwords.words(“english”)는 NLTK가 정의한 영어 불용어 리스트를 반환한다.

2. NLTK를 통해서 불용어 제거하기

example = "Family is not an important thing. It's everything."
stop_words = set(stopwords.words("english"))

word_tokens = word_tokenize(example)

result = []
for word in word_tokens:
    if word not in stop_words:
        result.append(word)

print(f"불용어 제거 전 : {word_tokens}")
print(f"불용어 제거 후 : {result}")
불용어 제거 전 : ['Family', 'is', 'not', 'an', 'important', 'thing', '.', 'It', "'s", 'everything', '.']
불용어 제거 후 : ['Family', 'important', 'thing', '.', 'It', "'s", 'everything', '.']

위 코드는 “Family is not an important thing. It’s everything.”라는 임의의 문장을 정의하고, NLTK의 word_tokenize를 통해서 단어 토큰화를 수행한다. 그리고 단어 토큰화 결과로부터 NLTK가 정의하고 있는 불용어를 제외한 결과를 출력하고 있다. 결과적으로 ‘is’, ‘not’, ‘an’과 같은 단어들이 문장에서 제거되었음을 볼 수 있다.

3. 한국어에서 불용어 제거하기

한국어에서 불용어를 제거하는 방법으로는 간단하게는 토큰화 후에 조사, 접속사 등을 제거하는 방법이 있다. 하지만 불용어를 제거하려고 하다보면 조사나 접속사와 같은 단어들뿐만 아니라, 명사, 형용사와 같은 단어들 중에서 불용어로 제거하고 싶은 단어들이 생기기도 한다. 결국에는 사용자가 직접 불용어 사전을 만들게 되는 경우가 많다. 이번에는 직접 불용어를 정의해보고, 주어진 문장으로 부터 사용자가 정의한 불용어 사전으로부터 불용어를 제거해보겠다.

okt = Okt()

example = "고기를 아무렇게나 구우려고 하면 안 돼. 고기라고 다 같은 게 아니거든. 예컨대 삼겹살을 구울 때는 중요한 게 있지."
stop_words = "를 아무렇게나 구 우려 고 안 돼 같은 게 구울 때 는"

stop_words = set(stop_words.split(" "))
word_tokens = okt.morphs(example)

result = [word for word in word_tokens if not word in stop_words]

print(f"불용어 제거 전 : {word_tokens}")
print(f"불용어 제거 후 : {result}")
불용어 제거 전 : ['고기', '를', '아무렇게나', '구', '우려', '고', '하면', '안', '돼', '.', '고기', '라고', '다', '같은', '게', '아니거든', '.', '예컨대', '삼겹살', '을', '구울', '때', '는', '중요한', '게', '있지', '.']
불용어 제거 후 : ['고기', '하면', '.', '고기', '라고', '다', '아니거든', '.', '예컨대', '삼겹살', '을', '중요한', '있지', '.']

아래의 링크는 보편적으로 선택할 수 있는 한국어 불용어 리스트를 보여준다. 하지만 여전히 절대적인 기준은 아니다.

링크 : https://www.ranks.nl/stopwords/korean

불용어가 많은 경우에는 코드 내에서 직접 정의하지 않고 txt 파일이나 csv 파일로 정리해놓고 이를 불러와서 사용하기도 한다.

Comments