데이터과학 삼학년

[Text preprocessing] Cleaning and Normalization, Stopwords 본문

Natural Language Processing

[Text preprocessing] Cleaning and Normalization, Stopwords

Dan-k 2020. 3. 24. 01:45
반응형

Text를 전처리하는 작업의 일환으로 토큰화가 있다. 토큰화 작업 전 후를 기준으로 데이터를 분석에 맞게 정제(cleaning) 및 정규화(Normalization)하는 것에 대해 알아본다.

 

  • 정제(cleaning) : 갖고 있는 코퍼스로부터 노이즈 데이터를 제거한다.

  • 정규화(normalization) : 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어준다.

 

정제 및 정규화 기법

1. 규칙에 기반하여 표기가 다르지만 의미가 같은 단어들을 통합하는 것이다.

- 예를 들면, USA 나 US 나 같은 의미를 가지므로 하나의 단어로 정규화할 수 있다.

 

2. 대소문자 통합

- 영어에서는 첫글자를 제외한 나머지 글자는 주로 소문자로 작성하기 때문에 모든 단어를 소문자 혹은 대문자로 변환하여 단어 처리하는 것이 좋다.

 

3. 불필요한 단어 제거 (Removing Unnecessary Words)

- 정제 작업에서 제거해야하는 노이즈 데이터(예, 자연어가 아니면서 아무 의미가 없는 글자)를 제거할 수 있다.

- 불필요한 단어 제거를 위해, 빈도가 적거나 길이가 매우 짧은 단어들을 제거하는 방법이 있다.

이 단계에서 Stopwords (불용어)를 말할 수 있는데,

분석에서 필요없는 단어들은 모아놓은 주머니라고 생각하면 된다. 한글로 따지면 (은,는,이가, ㅋㅋㅋ 등) 이 있을 수 있고, 영어의 경우 (a, an, the, is, and 등) 이 있을 수 있다.

 

(1) 등장빈도가 적은 단어

 텍스트 데이터에서 너무 적게 등장해서 자연어 처리에 도움이 되지 않는 단어들이 존재합니다. 예를 들어 입력된 메일이 정상 메일인지 스팸 메일인지를 분류하는 스팸 메일 분류기를 설계한다고 가정해보겠습니다. 총 100,000개의 메일을 가지고 정상 메일에서는 어떤 단어들이 주로 등장하고, 스팸 메일에서는 어떤 단어들이 주로 등장하는지를 가지고 설계하고자 합니다. 그런데 이때 100,000개의 메일 데이터에서 총 합 5번 밖에 등장하지 않은 단어가 있다면 이 단어는 직관적으로 분류에 거의 도움이 되지 않을 것임을 알 수 있습니다.

 

(2) 길이가 짧은 단어

영어권에서는 영어 단어의 평균 길이가 6~7 정도이고, 한국어는 2~3정도이다.

이를 미루어 보았을때, 영어 단어의 경우, 길이가 2~3이하인 단어를 제거하는 것 만으로도 크게 의미를 갖지 못하는 단어를 제거할 수 있는 효과가 있다.

# 길이가 1~2인 단어들을 정규 표현식을 이용하여 삭제
import re
text = "I was wondering if anyone out there could enlighten me on this car."
shortword = re.compile(r'\W*\b\w{1,2}\b')
print(shortword.sub('', text))

was wondering anyone out there could enlighten this car.

 

 

Stop words (불용어)

데이터에서 유의미한 단어 토큰만을 선별하기 위해서는 큰 의미가 없는 단어 토큰을 제거하는 작업이 필요하다.

즉, 자주 등장하지만, 큰 도움이 안되는 데이터를 말하는데, 영어로 따지면 i, my, me, mine, over, and 등 정도로 볼 수 있다.

영어의 경우 NLTK에서 영어 Stopwords 를 미리 패키지로 정의하고 있어서 가져다 쓰면된다.

또한 Stopwords의 경우, 분석가가 직접 지정하는 것도 가능하다.

 

NLTK 불용어 확인

from nltk.corpus import stopwords  
stopwords.words('english')[:10]  

['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your']  

 

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) 
print(result) 


['Family', 'is', 'not', 'an', 'important', 'thing', '.', 'It', "'s", 'everything', '.']
['Family', 'important', 'thing', '.', 'It', "'s", 'everything', '.']

 

한국어에서 Stopwords

한국어의 경우, stopwords로 주로 조사, 접속사 등을 제거하는 방법이 있다. 또한 명사, 형용사 중에서도 불용어로 제거하고 싶은 것이 있으면 stopwords 사전을 만들어 적용할 수 있다.

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) 
# 위의 4줄은 아래의 한 줄로 대체 가능
# result=[word for word in word_tokens if not word in stop_words]

print(word_tokens) 
print(result)


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

한국어 또한 보편적으로 선택할 수 있는 불용어 리스트를 얻을 수는 있다.

 

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

 

Korean Stopwords

 

www.ranks.nl

 

 

출처 : https://wikidocs.net/22530

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

728x90
반응형
LIST
Comments