데이터 전처리 방법
데이터 전처리 방법에는 여러 가지 방법이 있다. 과연 텍스트 전처리 기법에는 뭐가 있을까?
Data Preprocessing
컴퓨터가 텍스트를 이해할 수 있도록 하는 data Preprocessing 방법은 다음과 같다.
- HTML 태그, 특수문자, 이모티콘
- 정규표현식
- 불용어 (Stopword)
- 의미 없는 단어들
- 어, 그, 저, 아휴 같은
- 어간추출(Stemming)
- 의미를 가진 부분만 추출
- 표제어추출(Lemmatizing)
- 원형 추출
- are, is -> be
Preprocessing Pipeline
문서가 들어오면 토큰화를 하고, 텍스트 전처리를 하게 되고 내가 원하는 데이터 클리닝, bag of words를 만들 수도 있다.
KoNLPy
한국어 자연언어처리를 위한 대표적 python Library다. Twitter, Komoran, Mecab 등 다양한 형태소 분석기들을 제공한다.
https://konlpy-ko.readthedocs.io/ko/v0.4.3/#
NLTK(Natural Language Toolkit)
영어로 된 텍스트의 자연처리를 위한 대표적인 python Library다. Classification, Tokenization 등 50개가 넘는 library를 제공하며 쉬운 interface를 제공한다.
1. 토큰화 (Tokenization)
토큰화 (Tokenization)
주어진 데이터를 토큰(Token)이라 불리는 단위로 나누는 작업이다. 토큰이 되는 기준은 다를 수 있다.(어절, 단어, 형태소, 음절, 자소 등)
Character-based Tokenization , Word-based Tokenization , Subword-based Tokenization 등이 있다.
문장 토큰화 (Sentence Tokenizing)
문장을 분리한다.
단어 토큰화 (Word Tokenizing)
구두점 분리, 단어 분리가 있다.
"Hello, World!" -> "Hello",",","World","!"
왜 토큰화가 중요할까?
딥러닝 관점에서 이 단어의 의미를 밀집 벡터로 표현하기 위해서 단어를 사전화 하는 게 중요하다. 추후에 토큰화를 통해서 단어 임베딩을 만드는데 어떻게 토큰화하는 게 성능과 학습에 큰 영향을 주기 때문이다.
토큰화 시 고려사항
1. 구두점이나 특수 문자를 단순히 제외하면 안 되는 이유
구두점이나 특수 문자는 단순한 기호가 아니라 의미를 담고 있다. 이를 무시하면 데이터의 의미가 왜곡될 수 있다.
- 21/02/06이라는 표현은 날짜를 나타낸다. 단순히 ’/’을 제외하면 날짜의 의미가 사라질 수 있다.
- $100,000에서 $ 기호는 금액임을 나타낸다. 만약 ‘$’ 기호를 삭제하면 ‘100000’이라는 숫자만 남아 금액인지 다른 의미인지 구분하기 어려워진다.
따라서 토큰화 시 구두점이나 특수 문자가 문맥에서 어떤 역할을 하는지 파악하고, 필요에 따라 이를 유지하거나 별도의 처리를 해야 한다.
2. 줄임말과 단어 내 띄어쓰기 처리
줄임말과 띄어쓰기는 원래 형태를 되살려야 정확한 의미가 전달된다.
- “we’re”는 “we are”의 줄임말이다. 줄임말을 제대로 처리하지 않으면 원래 문장을 정확히 이해하지 못할 수 있다.
- “rock n roll”은 하나의 개념(음악 장르)이다. 하지만 띄어쓰기와 줄임 형태 때문에 “rock”과 “roll”을 각각 다른 단어로 인식할 가능성이 있다.
따라서 토큰화 시 줄임말을 풀어쓰거나, 띄어쓰기된 문장을 하나의 단어로 인식하게끔 처리해야 정확한 의미를 유지할 수 있다.
3. 문장 토큰화 시 단순히 마침표만을 기준으로 나누면 안 되는 이유
문장 내의 마침표가 항상 문장의 끝을 의미하지는 않는다.
- “서버에 들어가서 로그 파일 저장하고 메일로 결과 좀 보내줘. 그러고 나서 점심 먹으러 가자.”
- 여기서 “결과 좀 보내줘. “는 하나의 의미 단위이지만, 이 문장을 단순히 마침표를 기준으로 나누면 두 개의 독립적인 문장으로 잘려 의미가 흐려질 수 있다.
문장 끝을 정확히 판단하기 위해서는 마침표가 문장의 끝인지, 다른 의미로 사용된 것인지 문맥을 고려해야 한다.
토큰화는 단순히 자르는 것이 아니라 문장의 의미를 유지하는 방향으로 설계되어야 한다.
한국어 토큰화의 어려움
영어는 New York과 같은 합성어나 he's와 같이 줄임말에 대한 예외처리만 한다면, 띄어쓰기를 기준으로 하는 띄어쓰기 토큰화를 수행해도 단어 토큰화가 잘 작동한다.
그러나 영어와는 달리 한국어에는 조사라는 것이 존재한다.
- ex. '그가', '그에게', '그를', '그와', '그는'과 같이 다양한 조사가 붙음.
그래서 같은 단어임에도 서로 다른 조사가 붙어서 다른 단어로 인식할 수 있다. 그리고 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않는다.
- ex. 띄어쓰기를안해도사람들은이해를합니다
그래서 형태소 단위의 토큰화가 필요하다.
2. Tokenization Tools
KoNLPy
위 코드를 보면 okt, kkma, komoran 등의 다양한 형태소 분석기가 있는데 서로 다른 결과를 도출하는 걸 볼 수 있다. 이처럼 형태소 분석기의 결과에 따라 뒤에 모델의 성능에 직접적인 영향을 끼칠 수 있다.
1) morphs : 형태소 추출
2) pos : 품사 태깅
3) nouns : 명사 추출
SentencePiece
SentencePiece는 구글이 공개한 Tokenization 도구로, 한국어와 영어 모두에서 사용할 수 있다. BPE, unigram 등 다양한 subword 단위를 지원하며, 음절-단어, 형태소-단어 간의 subword 단위로 텍스트를 나누어 처리한다.
음절과 단어사이, 형태소와 단어사이의 subword라는 개념이 있는데 그걸 나눠주는 툴이다.
❓ subword가 왜 필요할까 ❓
딥러닝에서 기계번역을 예시로 들었을 때, 사전의 크기를 약 3만 개에서 5만 개 정도로 설정한다. 사전의 크기는 어떤 단어를 번역을 할때 이 사전에 있는 단어를 기반으로 하나의 가장 최고의 확률값에 있는걸 출력한다. 5만개 중에서 softmat 함수를 씌우고 그 softmax 중에서 가장 max의 값을 출력으로 내보낸다.
근데 영어단어로 쳤을 때 신조어까지 하면 10만 개, 100만 개 될 수 있는데 단어의 사전에 100만 개의 단어를 넣어두면 100만 차원의 softmax를 씌워서 연산 비용이 매우 커진다. 그래서 일정한 크기의 사전(3만 2천 개, 5만 개)을 구축할 수밖에 없다.
이 숫자에 주목해 보면 영어의 단어를 3만 2천 개로 압축하기란 어렵다. 그래서 단어보다 더 잘게 쪼갠 subword가 필요하다. 그래서 보통 subword 3만 2천 개의 단어로 이루어지게 되고 그중에서 출력을 내보내게 된다. 이러한 subword 단위로 모델을 학습시키면 사전 크기를 줄이면서도 다양한 단어 표현을 가능하게 할 수 있으며, 신조어 등 새로운 단어 처리에도 유연성을 제공한다. SentencePiece는 이를 통해 효율적인 텍스트 전처리를 지원한다.
Tokenizers
Huggingface는 자언어처리에서 범용적으로 사용되는 대표적인 라이브러리다. Tokenizers의 경우 사전 학습된 다양한 언어모델들의 tokenization과 어휘사전 등을 지원한다. 이외에도 Models, Dataset, Evaluation 등 다양한 하위 라이브러리들을 제공한다.
3. 정제 (Cleaning)
코퍼스 내에서 토큰화 작업에 방해가 되거나 의미가 없는 부분의 텍스트, 노이즈를 제거하는 작업이다.
토큰화 전에 정제를 하기도 하지만, 이후에도 여전히 남아있는 노이즈들을 제거하기 위해 지속적으로 수행한다. 노이즈는 특수 문자 같은 아무 의미도 갖지 않는 글자들을 의미하기도 하지만, 분석하고자 하는 목적에 맞지 않는 불필요한 단어들을 말한다.
대부분 정규표현식이나, 파이썬 내장함수를 통해 조작하고, 주로 불용어, 특수문자 제거 / 대. 소문자 통합 / 중복 문구 제거 / 다중 공백 통일 등으로 구성된다.
불용어 (Stop Words)
분석에 큰 의미가 없는 단어로 코퍼스 내에 빈번하게 등장하나, 실질적으로 의미를 갖고 있지 않은 용어를 말한다. 전처리 시 불용어로 취급할 대상을 정의하는 작업이 필요한데 NLTK에서는 여러 불용어를 사전에 정의되어 있다.
4. 정규화 (Normalization)
정규화를 다르게 말하면 통일성 부여라고도 한다.
Stemming (어간 추출)
어형이 변형된 단어로부터 접사 등을 제거하고 그 단어의 어간을 분리해 내는 것이다. 대표적으로 포터 스태머 알고리즘이 존재한다.
- 단어를 기존 단어가 아닌 어간으로 줄일 수 있다.
- 문맥을 고려하지 않고 개별 단어를 기준으로 작동한다.
- 단순하고 빠르다.
Lemmatization (표제어 추출/원형 추출)
품사 정보가 보존된 형태의 기본형으로 변환한다.
표제어 추출에 가장 섬세한 방법은 형태학적 파싱이다.
형태소란?
- 의미를 가진 가장 작은 단위
- 어간(stem) : 단어의 의미를 담고 있는 단어의 핵심 부분
- 접사(affix) : 단어에 추가적인 의미를 주는 부분
- 굴절된 단어를 항상 존재하는 형태인 표제어로 줄인다.
- 올바른 표제어를 찾기 위해 문맥을 활용할 수 있다.
- 더 정확하지만 속도가 느리다.
5. 편집 거리 (Edit distance)
Levenshtein distance
한 string s1을 s2로 변환하는 최소 횟수를 두 string 간의 거리라고 한다. 거리가 낮을수록 유사한 문자열로 판단한다.
- cat -> hat: h로 한 글자만 바꾸면 되기 때문에 Edit distance는 1이다.
- 나는 -> 난: 한글자만 바꾸면 되기 때문에 Edit distance는 1이다.
s1 = ‘꿈을꾸는아이’ 에서 s2 = ‘아이오아이’로 바뀌기 위해서는 (꿈을꾸 -> 아이오)로 바뀌고, 네 번째 글자 ‘는’ 이 제거하면 된다. 그럼 편집거리는 4가 된다.
string을 변화하기 위한 edit 방법을 세 가지로 분류된다.
- delete: ‘점심을먹자’
→ ‘점심먹자’ 로 바꾸기 위해서는 ‘을’ 삭제 - insert: ‘점심먹자’
→ ‘점심을먹자’ 로 바꾸기 위해서는 반대로 ‘을’ 삽입 - substitution: ‘점심먹자’
→ ‘점심먹장’ 로 바꾸기 위해서는 ‘자’를 ‘장’으로 치환
6. 정규표현식 (Regex)
특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어다. 복잡한 문자열의 검색과 치환을 위해 사용되며, Python 뿐만 아니라 문자열을 처리하는 모든 곳에서 사용된다.
원하는 규칙에 해당하는 문자만 남기거나 제거, 규칙에 맞는 문자열을 반환한다. 단 시간 내에 텍스트가 갖는 모든 패턴의 형태를 처리하는데 유용하다.
파이썬에서는 re 라이브러리를 이용해 사용이 가능하다.
'Deep Learning' 카테고리의 다른 글
Transformer 모델 디코딩 시 특수 토큰 제거 문제 해결하기 (0) | 2024.11.27 |
---|---|
문서 요약 모델 평가지표: ROUGE 1, ROUGE 2, ROUGE-L, ROUGE-S, ROUGE-W 완벽 이해하기 (1) | 2024.11.18 |
딥러닝 모델 구현에서 PyTorch의 쓰임 (2) | 2024.10.28 |
[Pytorch] tensor shape 변경에서 -1과 1 쓰임 그리고 슬라이싱 (1) | 2024.10.23 |
손실 함수, 활성화 함수, 최적화 함수 등 순서, 쓰임, 역할 (1) | 2024.10.23 |