본문 바로가기
Python

[python] 자연어 처리를 위한 텍스트 전처리(불용어 제거)

by teamnova 2023. 7. 28.
728x90

오늘은 자연어 처리를 위한 데이터 전처리 과정 중 불용어 제거에 대한 포스팅을 해보겠습니다. 

자연어 전처리는 크게 토큰화, 정제 , 정규화 과정을 거친다고 이전 포스팅에 언급한 바 있습니다. 

 

오늘은 정제 과정 중 하나인 불용어 제거 예제를 작성해 보겠습니다. 

오늘 예제는 다음 문서를 참고 하여 작성하였습니다.

https://wikidocs.net/22530

 

불용어란 자연어 처리를 위한 데이터 분석에 있어서 큰 의미가 없는 단어들을 의미합니다. 

큰 의미가 없다라는 것은 자주 등장하지만 분석을 하는것에 있어서 큰 도움이 되지 않는다는 뜻입니다.

 

예를들면he, a, an, is, I, my  같이 문장을 만드는덴 필수적이지만 문장의 의미를 파악하는데는 큰 도움이 되지 않는 단어들이 대표적입니다.

 

이러한 단어들을 불용어(stopword) 라고 하며 , NLTK 자연어 처리 패키지에서는 이러한 불용어를 패키지에서 미리 정의 하고 있습니다. 

 

영어 문장에서 NLTK 가 정의한 영어 불용어를 확인해 보고 실제로 제거해 보는 예제를 작성해 보겠습니다.

 

우선 필요한 패키지를 임포트 해줍니다.

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

NLTK 불용어 확인

stop_words_list = stopwords.words('english')
print('불용어 개수 :', len(stop_words_list))
print('불용어 10개 출력 :',stop_words_list[:10])

stopwords.words() 함수를 통해 불용어 리스트를 받아오고 'english' 불용어 개수와 상위 10개 리스트를 출력해 확인해 봅니다. 

 

NLTK불용어 확인

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('불용어 제거 전 :',word_tokens) 
print('불용어 제거 후 :',result)

"Family is not an important thing. It's everything." 이라는 문장을 NLTK 의 word_tokenize 를 통해 단어 토큰화를 수행한 뒤 토큰화 된 결과로 부터 stop_words 에 포함되지 않은 단어들만 출력해 줍니다.

 

불용어 제거 전/후 확인

결과적으로 is, not, an 과 같은 단어들이 문장에서 제거되어 있음을 확인할 수 있습니다. 

 

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

 

한국어에서 불용어를 제거하는 방법으로는 간단하게 토큰화 후 조사, 접속사 등을 제거할 수 있지만

불용어를 제거 하려다 보면 명사와 형용사 같은 단어들 중에서 제거하고 싶은 단어들이 생기기도 합니다. 

 

결국 사용자가 직접 불용어를 정의해 제거하는 경우가 많습니다. 

 

이번에는 직접 불용어를 정의해보고 주어진 문장에서 사용자가 정의한 불용어 사전으로 부터 불용어를 제거해 보겠습니다.

 

예제의 불용어는 임의로 선정한 것으로 실제로 의미있는 불용어는 아닙니다.

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('불용어 제거 전 :',word_tokens) 
print('불용어 제거 후 :',result)

임의의 문장과 불용어 를 작성하고 각각 토큰화를 진행해 불용어 사전과 단어 토큰을 준비해였습니다. 

result 는 불용어 사전과 중복되지 않은 단어들에 대해서만 출력을 해주고 있습니다. 

 

불용어 제거 전, 후

이처럼 사용자가 직접 작성한 불용어 또한 제거가 된것을 확인할 수 있습니다.