본문 바로가기
Python

[Python] - 불용어 제거 (자연어 처리)

by nam_ji 2024. 9. 22.

한국어 / 영어 불용어 제거 (자연어 처리)

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

nltk 시작하기

'''
pip install nltk
pip install konlpy
위 두 명령어로 각 라이브러리 다운받아야 합니다.

nltk.download('punkt')      # 토큰화
nltk.download('stopwords')  # 불용어 목록
nltk.download('wordnet')    # WordNet 사전

상위 두개 명령어는 터미널에 입력하고
하위 세개 명령어는 코드 작성 부분에 작성 후 실행하면 다운받아집니다.
필요한 것만 다운받으시면 됩니다.
'''

nltk에서 불용어 확인하기

  • 아래 코드로 확인해보면 nltk가 정의한 영어 불용어 리스트를 리턴합니다.
  • 총 179개의 불용어가 정의 되어 있다는 것을 확인할 수 있고 어떤 불용어가 있는지 확인할 수 있습니다.
from nltk.corpus import stopwords, words
from nltk.tokenize import word_tokenize
from konlpy.tag import Okt
import nltk
'''
pip install nltk
pip install konlpy
위 두 명령어로 각 라이브러리 다운받아야 합니다.

nltk.download('punkt')      # 토큰화
nltk.download('stopwords')  # 불용어 목록
nltk.download('wordnet')    # WordNet 사전
'''

stop_words_list = stopwords.words('english')
print('영어 불용어 개수 : ', len(stop_words_list))
words = dict()
for word in stop_words_list:
    words[word] = words.get(word, 0) + 1
    
print('영어 불용어 종류 : ', words)

'''
출력
영어 불용어 개수 :  179
영어 불용어 종류 :  {'i': 1, 'me': 1, 'my': 1, 'myself': 1, 'we': 1, 'our': 1, 'ours': 1, 'ourselves': 1, 'you': 1, "you're": 1, "you've": 1, "you'll": 1, "you'd": 1, 'your': 1, 'yours': 1, 'yourself': 1, 'yourselves': 1, 'he': 1, 'him': 1, 'his': 1, 'himself': 1, 'she': 1, "she's": 1, 'her': 1, 'hers': 1, 'herself': 1, 'it': 1, "it's": 1, 'its': 1, 'itself': 1, 'they': 1, 'them': 1, 'their': 1, 'theirs': 1, 'themselves': 1, 'what': 1, 'which': 1, 'who': 1, 'whom': 1, 'this': 1, 'that': 1, "that'll": 1, 'these': 1, 'those': 1, 'am': 1, 'is': 1, 'are': 1, 'was': 1, 'were': 1, 'be': 1, 'been': 1, 'being': 1, 'have': 1, 'has': 1, 'had': 1, 'having': 1, 'do': 1, 'does': 1, 'did': 1, 'doing': 1, 'a': 1, 'an': 1, 'the': 1, 'and': 1, 'but': 1, 'if': 1, 'or': 1, 'because': 1, 'as': 1, 'until': 1, 'while': 1, 'of': 1, 'at': 1, 'by': 1, 'for': 1, 'with': 1, 'about': 1, 'against': 1, 'between': 1, 'into': 1, 'through': 1, 'during': 1, 'before': 1, 'after': 1, 'above': 1, 'below': 1, 'to': 1, 'from': 1, 'up': 1, 'down': 1, 'in': 1, 'out': 1, 'on': 1, 'off': 1, 'over': 1, 'under': 1, 'again': 1, 'further': 1, 'then': 1, 'once': 1, 'here': 1, 'there': 1, 'when': 1, 'where': 1, 'why': 1, 'how': 1, 'all': 1, 'any': 1, 'both': 1, 'each': 1, 'few': 1, 'more': 1, 'most': 1, 'other': 1, 'some': 1, 'such': 1, 'no': 1, 'nor': 1, 'not': 1, 'only': 1, 'own': 1, 'same': 1, 'so': 1, 'than': 1, 'too': 1, 'very': 1, 's': 1, 't': 1, 'can': 1, 'will': 1, 'just': 1, 'don': 1, "don't": 1, 'should': 1, "should've": 1, 'now': 1, 'd': 1, 'll': 1, 'm': 1, 'o': 1, 're': 1, 've': 1, 'y': 1, 'ain': 1, 'aren': 1, "aren't": 1, 'couldn': 1, "couldn't": 1, 'didn': 1, "didn't": 1, 'doesn': 1, "doesn't": 1, 'hadn': 1, "hadn't": 1, 'hasn': 1, "hasn't": 1, 'haven': 1, "haven't": 1, 'isn': 1, "isn't": 1, 'ma': 1, 'mightn': 1, "mightn't": 1, 'mustn': 1, "mustn't": 1, 'needn': 1, "needn't": 1, 'shan': 1, "shan't": 1, 'shouldn': 1, "shouldn't": 1, 'wasn': 1, "wasn't": 1, 'weren': 1, "weren't": 1, 'won': 1, "won't": 1, 'wouldn': 1, "wouldn't": 1}
'''

nltk를 통해 불용어 제거하기

  • 아래 코드에서 example에 임의의 문장을 정의하고, nltk의 word_tokenize를 통해 단어 토큰화를 수행합니다.
  • 단어 토큰화 결과로부터 nltk가 정의하고 있는 불용어를 제외한 결과를 출력하고 있습니다.
from nltk.corpus import stopwords, words
from nltk.tokenize import word_tokenize
from konlpy.tag import Okt
import nltk
'''
pip install nltk
pip install konlpy
위 두 명령어로 각 라이브러리 다운받아야 합니다.

nltk.download('punkt')      # 토큰화
nltk.download('punkt_tab')
nltk.download('stopwords')  # 불용어 목록
nltk.download('wordnet')    # WordNet 사전

'''

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', '.']
불용어 제거 후 :  ['Family', 'important', 'thing', '.', 'It', "'s", 'everything', '.']
'''

한국어 불용어 제거하기

  • 한국어에서 불용어를 제거하는 방법으로는 간단하게 토큰화 후에 조사, 접속사 등을 제거하는 방법이 있습니다.
  • 하지만 불용어를 제거하려고 하다보면 조사나 접속사와 같은 단어들뿐만 아니라 명사, 형용사와 같은 단어들 중에서 불용어로서 제거하고 싶은 단어들이 생기기도 합니다.
  • 결국 사용자가 직접 불용어 사전을 만들게 되는 경우가 많다고 합니다.
from konlpy.tag import Okt
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

'''
pip install nltk
pip install konlpy
위 두 명령어로 각 라이브러리 다운받아야 합니다.

nltk.download('punkt')      # 토큰화
nltk.download('punkt_tab')
nltk.download('stopwords')  # 불용어 목록
nltk.download('wordnet')    # WordNet 사전

'''

stop_words_list = stopwords.words('english')
print('영어 불용어 개수 : ', len(stop_words_list))
words = dict()
for word in stop_words_list:
    words[word] = words.get(word, 0) + 1

print('영어 불용어 종류 : ', words)

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)

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)

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

전체 코드

더보기
from konlpy.tag import Okt
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

'''
pip install nltk
pip install konlpy
위 두 명령어로 각 라이브러리 다운받아야 합니다.

nltk.download('punkt')      # 토큰화
nltk.download('punkt_tab')
nltk.download('stopwords')  # 불용어 목록
nltk.download('wordnet')    # WordNet 사전

'''

stop_words_list = stopwords.words('english')
print('영어 불용어 개수 : ', len(stop_words_list))
words = dict()
for word in stop_words_list:
    words[word] = words.get(word, 0) + 1

print('영어 불용어 종류 : ', words)

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)

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)