[딥 러닝을 이용한 자연어 처리 입문] 2. 텍스트 전처리(1)
https://wikidocs.net/book/2155
딥 러닝을 이용한 자연어 처리 입문
많은 분들의 피드백으로 수년간 보완되어 온 딥 러닝 자연어 처리 무료 eBook입니다. 기본적인 텍스트 전처리부터 BERT와 같은 PLM의 다양한 다운스트림 태스크를 ...
wikidocs.net
해당 포스팅은 "딥 러닝을 이용한 자연어 처리 입문" 서적을 제 생각대로 요약한 내용입니다.
목차 2. 텍스트 전처리 (Text Preprocessing)
① 토큰화 (Tokenization)
② 정제 (Cleaning) and 정규화 (Normalization)
③ 어간 추출 (Stemming) and 표제어 추출 (Lemmatization)
④ 불용어 (Stopword)
⑤ 정규 표현식 (Regular Expression)
⑥ 정수 인코딩 (Integer Encoding)
⑦ 패딩 (Padding)
⑧ 원-핫 인코딩 (One-Hot Encoding)
⑨ 데이터의 분리 (Splitting Data)
⑩ 한국어 전처리 패키지 (Text Preprocessing Tools for Korean Text)
① 토큰화 (Tokenization)
▶ 단어 토큰화 (Word Tokenization)
- 토큰의 기준을 단어(word)로 하는 경우
- 구두점을 지운 뒤에 띄어쓰기를 기준으로 잘라내는 간단한 예시
@ 입력 : Time is an illusion. Lunchtime double so!
@ 출력 : Time , is , an , illusion , Lunchtime , double , so
▶ 토큰화에서 고려해야할 사항
- 구두점이나 특수 문자를 단순 제외해서는 안 됨
- 줄임말과 단어 내에 띄어쓰기가 있는 경우 하나로 인식할 수 있는 능력 필요
▶ 문장 토큰화 (Sentence Tokenization)
- 문장 단위로 구분하는 작업으로 때로는 문장 분류라고도 부름
- NLTK에서 영어 문장의 토큰화를 수행하는 sent_tokenize 존재
- 한국어 문장의 토큰화를 수행하는 KSS(Korean Sentence Splitter) 존재
▶ 한국어에서의 토큰화의 어려움
- 교착어의 특성
@ 자립 형태소 : 접사, 어미, 조사와 상관없이 자립하여 사용할 수 있는 형태소 (명사, 관형사, 부사, 감탄사 등)
@ 의존 형태소 : 다른 형태소와 결합하여 사용되는 형태소 (접사, 어미, 조사, 어간 등)
- 영어의 단어 토큰화와 유사한 형태를 얻으려면 어절이 아닌 형태소 토큰화 수행 필요
@ 입력 : 에디가 책을 읽었다
@ 어절 토큰화 : 에디가, 책을, 읽었다.
@ 형태소 토큰화 : 자립 형태소 - 에디, 책 / 의존 형태소 - ~가, ~을, 읽~, ~었, ~다
- 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않는다.
▶ 품사 태깅 (Part-of-speech tagging)
- 표기는 같지만 품사에 따라서 단어의 의미가 달라지기도 함
@ fly : 날다 의미, 파리 의미
@ 못 : 망치를 사용해 고정하는 물건 의미, 부사로서 동사를 할 수 없다는 의미
- 영어 문장에서 NLTK에서는 Penn Treebank POS Tags라는 기준을 사용하여 품사 태깅 진행
- 한국어 자연어 처리를 위해서는 KoNLPy 파이썬 패키지 사용
② 정제 (Cleaning) and 정규화 (Normalization)
▶ 개요
@ 정제(cleaning) : 갖고 있는 코퍼스로부터 노이즈 데이터 제거
@ 정규화(normalization) : 표현 방법이 다른 단어들을 통합시켜 같은 단어로 만듦
- 완벽한 정제 작업은 어려운 편이라서 일종의 합의점을 찾기도 함
▶ 규칙에 기반한 표기가 다른 단어들의 통합
- USA와 US, uh-huh와 uhhuh는 같은 의미를 가지므로 하나의 단어로 정규화 가능
▶ 대, 소문자 통합
- 영어권 언어에서 대,소문자를 통합하는 것은 단어의 개수를 줄일 수 있는 또 다른 정규화 방법
- 대부분 대문자를 소문자로 변환하는 소문자 변환작업으로 이루어짐
- 대문자와 소문자를 무작정 통합해서는 안 됨 (미국을 뜻 하는 US와 우리를 뜻하는 us)
▶ 불필요한 단어의 제거
- 정제 작업에서 제거해야하는 노이즈 데이터(noise data)
- 자연어가 아니면서 아무 의미도 갖지 않는 글자들(특수 문자 등)과 분석 목적에 맞지 않는 불필요 단어들
- 등장 빈도가 적은 단어와 길이가 짧은 단어
- 영어 단어의 평균 길이는 6~7, 한국어 단어의 평균 길이는 2~3이라 길이가 짧은 단어 제거는 영어에서 효과적
▶ 정규 표현식 (Regular Expression)
- 정규 표현식은 계속해서 등장하는 글자들을 규칙에 기반하여 한 번에 제거하는 방식으로 유용
- 예를 들어 길이가 짧은 단어를 제거할 때도 유용하게 사용
③ 어간 추출 (Stemming) and 표제어 추출 (Lemmatization)
▶ 표제어 추출 (Lemmatization)
@ 표제어 (Lemmatization) : '기본 사전형 단어'
- 단어들로부터 표제어를 찾아가는 과정으로 뿌리 단어를 찾아가서 단어의 개수를 줄일 수 있는지 판단
- 표제어 추출을 위해 형태학적 파싱을 진행
@ 형태학 (morphology)이란 형태소로부터 단어들을 만들어가는 학문, 형태소 종류에 어간과 접사가 존재
@ 어간 (stem) : 단어의 의미를 담고 있는 단어의 핵심 부분
@ 접사 (affix) : 단어에 추가적인 의미를 주는 부분
- NTLK에서는 표제어 추출을 위한 도구인 WordNetLemmatizer 지원
@ 예시 : am -> be , the going -> the going, having -> have
▶ 어간 추출 (Stemming)
- 형태학적 분석을 단순화한 버전, 정해진 규칙만 보고 단어의 어미를 자르는 어림짐작의 작업
- 어간 추출 후에 나오는 결과 단어는 사전에 존재하지 않는 단어일 확률 존재
- 어간 추출 알고리즘 중 하나인 포터 알고리즘(Porter Algorithm)
@ 예시 : am -> am , the going -> the go , having -> hav
▶ 한국어에서의 어간 추출
- 위의 표와 같이 5언 9품사의 구조를 가지고 있음
- 용언에 해당되는 '동사'와 '형용사'는 어간(stem)과 어미(ending)의 결합으로 구성
@ 어간 (stem) : 용언을 활용할 때, 원칙적으로 모양이 변하지 않는 부분
@ 어미 (ending) : 용언의 어간 뒤에 붙어서 활용하면서 변하는 부분
@ 활용 (conjugation) : 언어적 특징 중 하나를 말하는 통칭적인 개념, 용언의 어간(stem)이 어미(ending)를 가짐
- 어간이 어미를 취할 때 어간의 모습이 일정하다면 규칙 활용, 변한다면 불규칙 활용으로 나뉨
④ 불용어(Stopword)
▶ 개요
- 유의미한 단어 토큰만을 선별하기 위해서는 큰 의미가 없는 단어 토큰 제거 작업 필요
- 자주 등장하지만 분석을 하는 것에 있어서는 큰 도움이 되지 않는 단어들
@ 예시 : I, my, me, over, 조사, 접미사
- NLTK에서는 위와 같은 100여개 이상의 영어 단어들을 불용어 패키지 내에서 미리 정의
▶ 한국어에서 불용어 제거하기
- 간단하게는 토큰화 후에 조사, 접속사 등을 제거하는 방법이 있음
- 사용자가 직접 불용어 사전을 만들게 되는 경우가 많음
- 보편적으로 선택할 수 있는 한국어 불용어 리스트 링크 참고 (https://www.ranks.nl/stopwords/korean)
- 불용어가 많은 경우에는 코드 내에서 직접 정의하지 않고 txt, csv 파일로 정리하여 불러와서 사용