초거대 인공지능 시대에도 여전히 유요한 데이터 전처리 논문에 의하면 모델 학습 전 시작 후 4단계에서 전처리가 필요함을 확인할 수 있음. 출처 : https://arxiv.org/abs/2303.18223
컴퓨터가 텍스트를 이해할 수 있도록 하는 Data Preprocessing 방법 • HTML 태그, 특수문자, 이모티콘 • 정규표현식 • 불용어 (Stopword) • 어간추출(Stemming) • 표제어추출(Lemmatizing)
Preprocessing Pipeline 출처 : 자연어처리 바이블(임희석 외, 고려대학교 NLP&AI 연구실)
전처리 툴 KoNLPy NLTK (Natural Language Toolkit)
토큰화 (Tokenization)
토큰화 (Tokenization) 주어진 데이터를 토큰 (Token)이라 불리는 단위로 나누는 작업 토큰이 되는 기준은 다를 수 있음 (어절, 단어, 형태소, 음절, 자소 등) Character-based Tokenization / Word-based Tokenization / Subword-based Tokenization
문장 토큰화 (Sentence Tokenizing) 문장 분리
단어 토큰화 (Word Tokenizing) 구두점 분리, 단어 분리 Ex) "아버지가 가방에 들어가신다." -> "아버지" "가" "가방" "에" "들어가" 신다" "." "Hello, World!" -> "Hello" "," " World" "!"
토큰화가 왜 중요한가? 단어 의미를 밀집 벡터로 표현하기 위해 단어들을 사전화 ※ 실제로 토크나이징의 방식에 따라 모델의 성능이 많이 달라진다. 출처: 딥러닝을 이용한 자연어처리
토큰화시 고려사항 아래와 같은 예외 사항들이 많이 존재
구두점이나 특수 문자를 단순 제외 21/02/06 -> 날짜 / $100,000 -> 돈
줄임말과 단어 내 띄어쓰기 we're -> we are 의 줄임말 rock n roll -> 하나의 단어지만 띄어쓰기가 존재
문장 토큰화 : 단순 마침표를 기준으로 자를 수 없음 서버에 들어가서 로그 파일 저장하고 메일로 결과 좀 보내줘. 그러고나서 점심 먹으러 가자.
한국어 토큰화의 어려움 영어는 New York과 같은 합성어나 he's 와 같이 줄임말에 대한 예외처리만 한다면, 띄어쓰기를 기준으로 하는 띄어쓰기 토큰화를 수행해도 단어 토큰화가 잘 작동
영어와 달리 한국어에는 조사 가 존재. ※ 형태소 단위의 토큰화가 필요.
ex) '그가' '그에게' '그를' '그와' '그는' 과 같은 다양한 조사가 붙음. 같은 단어임에도 서로 다른 조사가 붙어서 다른 단어로 인식.
한국어는 띄어쓰기가 영어보다 잘 지켜지지 않음. ex) 띄어쓰기를안해도사람들은이해를합니다.
Tokenization Tools
KoNLPy morphs : 형태소 추출 pos : 품사 태깅 nouns : 명사 추출
SentencePiece Google이 공개한 Tokenization 도구 BPE, unigram 방식 등 다양한 subword units 지원
Tokenizers Huggingface는 자연어처리에서 범용적으로 사용되는 대표적인 라이브러리 Tokenizers의 경우 사전 학습된 다양한 언어모델들의 tokenization과 어휘 사전등을 지원 이외에도 Models, Dataset, Evaluation등 다양한 하위 라이브러리들을 제공
정제 (Cleaning)
텍스트 정제
코퍼스(말뭉치) 내에서 토큰화 작업에 방해가 되거나 의미가 없는 부분의 텍스트, 노이즈를 제거하는 작업 토큰화 전에 정제를 하기도 하지만, 이후에도 여전히 남아있는 노이즈들을 제거하기 위해 지속적으로 수행 노이즈는 특수 문자 같은 아무 의미도 갖지 않는 글자들을 의미하기도 하지만, 분석하고자 하는 목적에 맞지 않는 불필요한 단어들을 말함 대부분 정규표현식이나, 파이썬 내장함수를 통해 제작 주로 불용어, 특수 문자 제거 / 대,소문자 통합 / 중복 문구 제거 / 다중 공백 통일 등으로 구성
불용어 (Stop Words) 분석에 큰 의미가 없는 단어로 코퍼스 내에 빈번하게 등장하나, 실질적 의미를 갖고 있지 않은 용어 전처리 시 불용어로 취급할 대상을 정의하는 작업이 필요 NLTK에서는 여러 불용어를 사전에 정의
Stemming (어간 추출) 어형이 변형된 단어로부터 접사 등을 제거하고 그 단어의 어간을 분리해내는 것 대표적으로 포터 스태머 알고리즘이 존재 ex) 먹었다, 먹을 -> 먹다
Lemmatization (표제어 추출) 품사 정보가 보존된 형태의 기본형으로 변환 표제어 추출에 가장 섬세한 방법은 => 형태학적 파싱
형태소란? 의미를 가진 가장 작은 단위 어간 (stem) : 단어의 의미를 담고 있는 단어의 핵심 부분 접사 (affix) : 단어에 추가적인 의미를 주는 부분 ex) Cats -> cat(어간) + s(접사) Dies -> die
편집 거리 (Edit distance)
Levenshtein distance 한 string s1을 s2로 변환하는 최소 횟수를 두 string 간의 거리. 거리가 낮을수록 유사한 문자열로 판단함. s1 = '꿈을 꾸는 아이' 에서 s2 = '아이오아이' 로 바뀌기 위해서는 (꿈을꾸 - > 아이오) 로 바뀌고, 네번째 글자 '는' 이 제거 string을 변화하기 위한 edit 방법을 세가지로 분류
연산 개수 판별 근거
delete: '점심을먹자' '점심먹자'로 바꾸기 위해서는 '을' 삭제
insert : '점심먹자' '점심을먹자'로 바꾸기 위해서는 반대로 '을' 삽입
substitution : '점심먹자' '점심먹장'로 바꾸기 위해서는 '자'를 '장'으로 치환