일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- session 유지
- top_k
- 유튜브 API
- 공분산
- youtube data
- hadoop
- Retry
- integrated gradient
- Counterfactual Explanations
- requests
- subdag
- GCP
- correlation
- grad-cam
- API Gateway
- 상관관계
- TensorFlow
- XAI
- tensorflow text
- BigQuery
- API
- login crawling
- UDF
- spark udf
- airflow subdag
- Airflow
- chatGPT
- gather_nd
- GenericGBQException
- flask
- Today
- Total
데이터과학 삼학년
[Text preprocessing] Cleaning and Normalization, Stopwords 본문
[Text preprocessing] Cleaning and Normalization, Stopwords
Dan-k 2020. 3. 24. 01:45Text를 전처리하는 작업의 일환으로 토큰화가 있다. 토큰화 작업 전 후를 기준으로 데이터를 분석에 맞게 정제(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
출처 : https://wikidocs.net/22530
'Natural Language Processing' 카테고리의 다른 글
[Text preprocessing] 텍스트 데이터의 encoding 형식을 알아내기 (0) | 2020.05.28 |
---|---|
[Text preprocessing] 한국어 문장 splitter (0) | 2020.05.27 |
[Text preprocessing] Lemmatization and Stemming (0) | 2020.03.24 |
[Text preprocessing] Tokenization (0) | 2020.03.19 |
KoNLPy 한국어 분류기 소개 (0) | 2020.02.22 |