Dev.log

자연어 처리의 Preprocessing 본문

자연어처리

자연어 처리의 Preprocessing

포켓몬빵 2022. 2. 18. 15:12

본 포스팅에서는 인공지능의 한 분야중 자연어 처리에 대해 포스팅을 진행 하겠습니다.

 

기계를 활용하여 데이터 분석을 진행할 경우, 사람이 직접 분석하는 것보다 빠른 속도로 대용량의 자료를 분석하는 것이 가능해집니다. 이러한 환경의 변화에 의해 데이터 집합의 범주가 확장된 빅데이터 분석이 사회적으로 일상화되고 있는데, 숫자형 데이터인 정형데이터 이외에도 사람이 이해할 수 있는 언어인 비정형데이터에 대한 분석도 빠른 속도로 발전하고 있는 추세 입니다. 여기서 비정형데이터는 숫자가 아닌 데이터를 지칭하는데, 대표적으로 언어, 이미지, 혹은 동영상 파일들을 예로 들 수 있습니다.

 

 

이 중 언어 처리하는 기술을 우리는 자연어처리(Natural Language Processing, NLP)라고 합니다. 한국정보통신기술협회의 IT용어사전에 따르면 '자연어처리란 컴퓨터를 이용해서 사람이 사용하는 언어를 이해하고, 생성 및 분석을 다룬 인공지능기술이라고 말하고 있다' 고 하는데, 이는 즉, 자연어처리(NLP)는 인간이 사용하는 언어를 컴퓨터가 이해할 수 있도록 형식을 변경하고, 이를 기반으로 컴퓨터 연산을 통해 비정형데이터의 의미를 파악하고 분석하는 일련의 과정이라고 말할 수 있습니다.

자연어의 전처리

만약, 크롤러(Crawler)제작을 통해 수집된 데이터를 바탕으로 자연어 분석을 진행 하고 싶다면, 해당 데이터에 대한 전처리 작업이 필요합니다. 일반적으로 자연어처리에서 전처리란 데이터를 사용자의 용도에 맞춰 데이터를 정제하는 과정을 말하는데, 하나의 문장을 의미의 최소단위로 분절하거나, 불필 요한 단어들을 삭제하고, 의미가 유사한 단어들을 통합하는 일련의 과정들을 뜻합니다.

 

토큰화 및 형태소 분석

토큰화 및 형태소 분석 데이터를 분석하는 과정에서 데이터 전처리는 매우 중요하고, 일반적으로 데이 터분석을 진행하는 과정에서 절반이상의 시간이 데이터를 정제하는 전처리에 소요됩니다. 분석에 앞서 데이터 전처리가 이뤄지지 않았다면 분석가는 우선 해당 데이터를 사용자의 용도에 맞게 전처리를 진행 해야 합니다. 이중 대표적으로 토큰화(tokenizing)이 있는데, 단어들의 집합인 말뭉치(corpus),에 속한 단어들을 가장 작은 형태로 구분하는 작업을 의미합니다. 예를 들어 "Hello, World. I love NLP" 라는 문장을 NLTK의 word_tokenize를 통해 토크나이징하면, 아래와 같이 확인 할 수 있습니다.

from nltk.tokenize import word_tokenize
word_tokenize("Hello, World. I love NLP")
Out[1]: ['Hello', ',', 'World', '.', 'I', 'love', 'NLP']

하지만, 한국어의 경우 영어에 비해서 문장을 토큰화하는 과정이 어려운데, 이는 한국어의 문법적 특성에서 찾아볼 수 있습니다. 먼저 한국어는 교착어이기 때문에 특정 단어 뒤 에 나타나는 조사 등으로 인해 띄어쓰기 단위로 토크나이징을 진행하기에 어려운 점이 존재하며, 영어와는 다르게 띄어쓰기가 잘 지켜지지 않기 때문입니다. 이에 한국어의 토크나이징의 경우 대부분 형태소단위로 진행 됩니다. 형태소는 언어학에서 일정한 의미가 있는 가장 작은 말의 단위라 정의되는데, 형태소를 쪼갤 경우, 본래 가지고 있던 의미가 사라지는 것을 의미합니다. 이러한 한국어 형태소 분석을 위한 다양한 패키지가 있는데, 이 중 KoNLPy(코엔 엘 파이)는 한국어 정보처리 및 자연어처리를 위한 Python 패키지로 꼬꼬마(Kkma), 코모란(Komoran), 메캅(Mecab), 한나눔(Hannanum), Okt(Open Korea Text) 등 다양한 한국어 형태소 분석기를 지원합니다.

 

품사태깅(POS)

단어에서 단어의 표기는 같지만, 품사에 따라 단어에 부여되는 의미가 바뀌기도 합니다. 품사태깅(POS)란, 형태소의 뜻과 문맥에 맞게 중의성을 해소하여 올바른 품사 를 결정하게 해주는 작업을 의마합니다.

 

특수문자제거

일반적으로 자연어를 전처리 할때, 특수문자와 공백은 데이터 분석에 의미가 없으므로 제거해줍니다. 이때 주로 re.sub( ) 이란 함수를 사용하는데, 이는 문자열에서 매치된 텍스트 를 다른 텍스트로 치환할 때 사용되는 함수입니다. .strip( )은 문자열 양 끝을 제거 하는 함수이며, charset 지정하지 않으면 공백문자를 제거, charset이 지정되어 있을 시에는 charset의 모든 조합을 제거해준다. 간단하게 특수문자를 제거할려면 아래의 코드와 같이 제거시켜주면 됩니다.

def cleanText(readData):
    text = re.sub("[-=+,#/\?:^$.@*\"※~&%ㆍ!』\\‘|\(\)\[\]\<\>`\'…》\’\“\”\·\n\r\t■◇◆▶;]", '', readData).strip()
    return text
cleanText('※Hellow~&World%ㆍ')
Out[2]: 'HellowWorld'

 

불용어처리

토크나이징 이후에 데이터분석에 앞서 큰 의미가 없는 토큰을 지우는 과정인 불용어 (stopword) 처리를 해주어야 합니다. 이는 불용어처리 혹은 Stopwords 라고도 부르며, NLTK에선 영문의 stopwords 사전을 제공해 줍니다.

from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))

 

Comments