기타/AI

[딥 러닝을 이용한 자연어 처리 입문] 2. 텍스트 전처리(3)

s-bot 2022. 9. 25. 12:54

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)

 

 

 


 

 

원-핫 인코딩 (One-Hot Encoding)

 

배경

- 원-핫 인코딩을 위해서 가장 먼저 해야할 일은 단어 집합을 만드는 일

@ 단어 집합 (vocabulary) : 서로 다른 단어들의 집합, book과 books도 다른 단어로 간주

- 텍스트의 모든 단어를 중복을 허용하지 않고 모아놓으면 이를 단어 집합이라고 함

- 이 단어 집합에 고유한 정수를 부여하는 정수 인코딩 진행

 

 개요

- 단어 집합의 크기를 벡터의 차원으로 함, 원-핫 인코딩은 단어의 벡터 표현 방식

- 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여

- Okt (KoNLPy) 형태소 분석기 통해서 문장 토큰화 수행 후 각 토큰에 대해서 고유한 정수 부여

@ 단어 집합 : {'나' : 0, '는' : 1, '자연어' : 2, '처리' : 3, '를' : 4, '배운다' : 5}

@ '자연어'라는 단어의 원-핫 벡터 : {0, 0, 1, 0, 0, 0}

- 케라스(Keras)에서는 이를 지원하는 to_categorical() 도구 존재

 

 원-핫 인코딩 (One-Hot Encoding)의 한계

- 단어의 개수가 늘어날 수록, 벡터를 저장하기 위해 필요한 공간(차원)이 계속 늘어남

@ 예시 : 단어가 1000개인 코퍼스의 경우, 1의 값 1개와 0의 값 999개

- 단어의 유사도를 표현하지 못함, 검색 시스템 등에서는 문제가 될 소지가 있음

- 이러한 단점을 해결하기 위해 단어의 잠재 의미를 반영하여 다차원 공간에 벡터화 하는 기법 2가지

@ 첫째 : LSA, HAL 등 카운트 기반으로 벡터화

@ 둘째 : NNLM, RNNLM, Word2Vec 등 예측 기반으로 벡터화

- 두 가지 방법을 모두 사용하는 GloVe 방법도 있음

 

 

 

 

⑨ 데이터의 분리 (Splitting Data)

 

 지도 학습 (Supervised Learning)

- 정답이 무엇인지 맞춰야 하는 '문제' 데이터와 레이블이라고 부르는 '정답' 데이터 존재

- 기계는 정답이 적혀져 있는 문제지를 문제와 정답을 함께 보면서 열심히 공부

- 향후에 정답이 없는 문제에 대해서도 정답을 잘 예측해야 함

 

 x와 y 분리하기

- x는 문제 데이터, y는 문제에 대한 정답 데이터

- zip 함수, 데이터프레임, Numpy를 이용하여 분리 가능 

 

 테스트 데이터 분리하기

- 훈련 목적 데이터와 테스트 목적 데이터로 분리

- 사이킷 런(train_test_split())을 이용하거나 수동으로 분리 가능

 

 

 

 

⑩ 한국어 전처리 패키지 (Text Preprocessing Tools for Korean Text)

 

PyKoSpacing

- 띄어쓰기가 되어있지 않은 문장을 띄어쓰기를 한 문장으로 변환해주는 패키지

- 대용량 코퍼스를 학습하여 만들어진 띄어쓰기 딥 러닝 모델로 준수한 성능

- https://github.com/haven-jeon/PyKoSpacing

 

Py-Hansepll

- 네이버 한글 맞춤법 검사기를 바탕으로 만들어진 패키지

- PyKoSpacing과 비슷하지만 결과가 조금은 다름

- https://github.com/ssut/py-hanspell

 

 SOYNLP를 이용한 단어 토큰화

- 품사 태깅, 단어 토큰화 등을 지원하는 단어 토크나이저

- 비지도 학습으로 단어 토큰화를 진행, 데이터에 자주 등장하는 단어 분석

- 토크나이저 내부적으로 단어 점수 표 동작

- 응집 확률(cohesion probability)과 브랜칭 엔트로피(branching entropy) 활용

@ 응집 확률 : 내부 문자열이 얼마나 응집하여 자주 등장하는지를 판단하는 척도

ㄴ 하나의 단어에 가까울수록 값은 커짐 (반포한강공원 >> 반포한강공)

@ 브랜칭 엔트로피 : 주어진 문자열에서 얼마나 다음 문자가 등장할 수 있는지를 판단하는 척도

ㄴ 나올 단어가 다양하다면 값이 커짐 (디스 >> 디스플)

- 기존에는 신조어, 형태소 분석기에 등록되지 않은 단어는 제대로 구분하지 못하는 단점 존재

@ L tokenizer : 띄어쓰기 단위로 나눈 어절 토큰과 같이 L 토큰 + R 토큰 형식을 가지는 토크나이저

ㄴ 공원에 -> 공원(L토큰) + 에(R토큰), 공부하는 -> 공부(L토큰), 하는(R토큰)

@ 최대 점수 토크나이저 : 띄어쓰기가 되지 않는 문장에서 점수가 높은 글자 시퀀스를 순차적으로 찾아냄

 

 SOYNLP를 이용한 반복되는 문자 정제

- ㅋㅋ, ㅎㅎ 등의 이모티콘의 경우 불필요하게 연속되는 경우가 많음

- 모두 서로 다른 단어로 처리하는 것은 불필요하므로, 반복되는 것은 하나로 정규화

 

 Customized KoNLPy 

- 사용자 사전을 추가하는 방법은 형태소 분석기마다 다른데, 생각보다 복잡한 경우들이 많음

- cutomized_konlpy 형태소 분석기를 활용하여 특정 단어를 사전에 추가

ㄴ add_dictonary('특정단어', 'Noun') -> 하나의 토큰으로 인식