DoITgrow

[텍스트 전처리] 문장에서 영어만 남기고, 한글은 제거하는 방법 (feat. 파이썬) 본문

딥러닝 & 머신러닝/자연어 처리 (Natural Language Processing)

[텍스트 전처리] 문장에서 영어만 남기고, 한글은 제거하는 방법 (feat. 파이썬)

김수성 (Kim SuSung) 2021. 11. 18. 09:25
반응형

분석의 결과는 데이터 품질에 따라 크게 좌우되므로 분석에 앞서 전처리하는 과정이 매우 중요합니다. 아마도 분석을 하고 계시는 분들은 실제 분석보다도 분석을 위한 준비 시간이 약 70% 이상을 차지하신다는 것을 잘 아실 것 같습니다.

 

분석을 위해 수집하는 데이터에는 엄청나게 많은 노이즈들이 포함될 수 있습니다. 예를들어 영어 데이터를 분석하려고 하는데 기타 언어들이 포함되어 있는 경우가 있을 수 있는데 이때 인코딩/디코딩 기법을 사용하여 쉽게 처리하는 방법에 대해 소개드리려고 합니다.

인코딩/디코딩

우리가 코딩할 때 타이핑하는 글자들은 사람이 이해할 수 있는 방식으로 표현된 것일 뿐, 실제로 컴퓨터는 다르게 받아들여서 이해를 합니다. 우리는 코딩을 하며 이러한 과정을 보통 볼 수 없는데, 컴퓨가 알아서 입력받은 데이터를 특별히 정의된 사전에 따라 변환하여 이해하기 때문이죠. 여기서 "특별히 정의된 사전"이란 "ASCII", "UTF-8", "EUC-KR" 등 각자 사전의 규칙에 따라 문자를 컴퓨터가 이해할 수 있는 언어로 각각 정의한 매핑 테이블이라고 생각하시면 될 것 같아요. "ASCII (아스키)" 코드는 영화 마션에서 주인공이 지구와 소통하기 위해 사용했던 방법이기도 하죠. 

인코딩/디코딩의 차이는 컴퓨터 입장에서 생각하면 이해하기 쉽습니다. 사람이 타이핑한 글을 컴퓨터가 이해할 수 있도록 변환하는 것이 인코딩이며, 다시 사람이 이해할 수 있는 글자로 변환하는 것을 디코딩이라고 합니다. 즉, 위에서 잠깐 말씀드렸던 영화 마션에서 주인공이 지구와 정보를 주고 받을 때에는 인코딩한 값을 사용한 것이고, 각자 수신한 정보를 디코딩하여 해독하여 의사소통을 했던 것이죠.

ASCII vs UTF-8

파이썬을 사용하며 가장 많이 볼 수 있는 인코딩 방법은 "UTF-8"입니다. 둘의 차이는 대표적으로 만들어진 시점이라고 생각할 수 있을 것 같아요. 이러한 인코딩 방식들은 많은 시간을 거쳐 점차 발전되었고, 결국 사람이 만드는 방식이다 보니 처음 만들때 고려하지 못했던 문자가 나올 수 있어요. 이럴 경우 컴퓨터가 이해할 수 없는 문자가 발생하게 되죠. 이런 관점에서 보면 ASCII 는 영어와 일부 특수 문자에 관한 내용만 담고 있어요. 그래서 한글과 같은 것을 처리하기 위해선 ASCII 를 사용할 수가 없죠. 이후 이러한 문제들을 개선하여 UTF-8, UTF-16 등 여러가지의 인코딩 방식들이 나오게 됩니다. 

인코딩/디코딩 방식을 활용한 영어 문장에서 한글 제거

그럼 본론으로 들어가 인코딩/디코딩 방식을 사용하여 문장에서 영어만 남기고, 기타 언어들은 모두 제거하는 방법을 소개해 드리겠습니다. 이 방법 외에도 정규식을 작성해서 처리해도 되지만 느낌 상 이 방법이 속도가 가장 빠르지 않을까 생각이 드네요. 

text = "Where there is a will there is a way의 의미는 뜻이 있는 곳엔 길이 있다이다"
text = text.encode('utf-8').decode('ascii', 'ignore')
text = text.strip()
print(text)

>>> Where there is a will there is a way

위 코드에 대해 설명드리자면 한글/영어가 같이 있는 문장을 먼저 UTF-8 인코딩 방식에 따라 인코딩을 합니다. UTF-8은 영어, 한글을 모두 인코딩할 수 있는 방법이므로 정상적으로 작동하여 텍스트를 UTF-8로 인코딩한 문자 객체를 리턴합니다. 그리고 UTF-8로 인코딩한 문자 객체를 다시 디코딩하는데 여기서 ASCII 방식을 사용합니다. ASCII 에는 한글은 다루지 않기 때문에 처리하지 못하고 오류를 리턴하게 됩니다. 그래서 뒤에 "ignore" 인자를 추가하여 "오류가 발생하면 무시하고 정상적인 값만 리턴해라"라는 명령을 할 수 있습니다.

추가 응용 (구두점까지 제거)

추가로 한글뿐만 아니라 구두점까지 제거할 수 있는 방법은 아래와 같습니다. punctuation 패키지를 사용하여 구두점 정보를 가져올 수 있으므로 이를 응용하여 구두점까지 제거해볼 수 있습니다.

from string import punctuation

def remove_punctuation(text):
    text = text.encode('utf-8').decode('ascii', 'ignore')
    result = ""
    for t in text:
    	if t not in punctuation:
        	result += t
    return result.strip()
    
text = "'Where there is a will there is a way!'의 '의미는 뜻이 있는 곳엔 길이 있다이다.'"
print(remove_punctuation(text))
>>> here there is a will there is a way
반응형
Comments