자연어처리(NLP) 5일차 (불용어)

정민수
5 min readJun 7, 2019

--

19.06.07

본 글은 https://wikidocs.net/book/2155을 참고하여 작성되었음을 밝힙니다.

학습키워드

  • 불용어(Stopword)

불용어(Stopword)

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

물론 불용어는 개발자가 직접 정의할 수도 있다. 이 챕터에서는 NLTK를 이용해서 영어 문장으로부터 불용어를 제거하는 실습을 하고, 직접 우리가 정의한 불용어를 통해서 한국어로부터 불용어를 제거해본다.

NLTK 실습에서는 1챕터에서 언급했듯이 각 실습에 필요한 데이터를 다운로드해야 한다. 다운로드 방법은 nltk.download(필요한 데이터)라는 커맨드를 통해 설치할 수 있다.

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

import nltk
from nltk.corpus import stopwords
stopwords.words('english')[:10]
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're"]

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

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
example = "Family is not an important thing. It's everything."
stop_words = set(stopwords.words('english'))
word_tokens = word_tokenize(example)
result = []
for w in word_tokens:
if w not in stop_words:
result.append(w)
print(word_tokens)
'Family', 'is', 'not', 'an', 'important', 'thing', '.', 'It', "'s", 'everything', '.']
print(result)
['Family', 'important', 'thing', '.', 'It', "'s", 'everything', '.']

example 문장을 Tokenization한 다음, 그 안에서 불용어 리스트에 없는 것만 (불용어를 제거) 출력했다.

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

한국어에서 불용어를 제거하는 방법으로는 간단하게는 코엔엘파이로 형태소 분석 후 (토큰화) 조사, 접속사 등을 제거하는 방법이 있다.

하지만 현업에서 불용어를 제거하려고 하다보면 조사나 접속사와 같은 단어들뿐만 아니라 명사, 형용사와 같은 단어들 중에서 불용어로 제거하고 싶은 단어들이 생기기 마련이다. 결국, 사용자가 직접 불용어 사전을 만들게 되는 경우가 많다.

이번에는 직접 불용어를 정의해보고, 주어진 문장으로부터 직접 정의한 불용어 사전을 참고로 불용어를 제거해본다.

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
example = "고기를 아무렇게나 구우려고 하면 안 돼. 고기라고 다 같은 게 아니거든. 예컨대 삼겹살을 구울 때는 중요한 게 있지."stop_words = "아무거나 아무렇게나 어찌하든지 같다 비슷하다 예컨대 이럴정도로 하면 아니거든"stop_words = stop_words.split(' ')
word_tokens = word_tokenize(example)
result = []
for w in word_tokens:
if w not in stop_words:
result.append(w)
print(word_tokens)
['고기를', '아무렇게나', '구우려고', '하면', '안', '돼', '.', '고기라고', '다', '같은', '게', '아니거든', '.', '예컨대', '삼겹살을', '구울', '때는', '중요한', '게', '있지', '.']
print(result)
['고기를', '구우려고', '안', '돼', '.', '고기라고', '다', '같은', '게', '.', '삼겹살을', '구울', '때는', '중요한', '게', '있지', '.']

참고자료

한국어 불용어 리스트 : https://www.ranks.nl/stopwords/korean / https://bab2min.tistory.com/544

--

--

정민수
정민수

No responses yet