<NLP preprocessing>
1. Tokenization Pipeline
2. Normalization
3. Pre-tokenization
Tokenization Pipeline
Normalization
Raw string 제거 (e.g., 여백 제거, 대·소문자 통일, stopwords 제거 ···)
Pre-Tokenization
Tokenization 전에 text를 smaller object로 변환
Tokenization
Pre-Tokenization된 word를 model에 적용할 수 있는 형태로 변환
Normalization
Normalization
- Cleaning: corpus로부터 noise data 제거
- Normalization: word의 representation을 normalize
- Stemming, Lemmatization e.g., 간다, 가는, 감, 갔는데 ··· → 가 (어근)
- Cased / Uncased e.g., The, the → the, the
- Removing unnecessary words: Rare words (e.g., 특수문자), short length word (e.g., I, a, an, it, at, on, ···) → train에 도움 안 됨
- Regular Expression: pattern을 파악해 noise 제거
Regular Expression

- 특정 pattern으로 noise data 제거
- re package, NLTK
| 특수 문자 | 설명 | |
| . | 한 개의 임의의 문자 (\n 제외) | |
| Pattern 반복 횟수 | ? | ? 앞 문자가 0개 또는 1개 |
| * | * 앞 문자가 0개 이상 | |
| + | + 앞 문자가 1개 이상 | |
| 문장위치 시작과 끝 지정 | ^ | ^ 뒤 문자로 문자열 시작 |
| $ | $ 앞 문자로 문자열 끝 | |
| 반복횟수 지정 | {숫자} | 숫자 만큼 반복 |
| {숫자1, 숫자2} | 숫자1 이상 숫자2 이하만큼 반복 (?, *, +로 대체 가능) |
|
| {숫자,} | 숫자 이상만큼 반복 | |
| [ ] | [ ] 안의 문자들 중 한 개의 문자와 매치 [a-z] 와 같이 범위 지정 가능 [a-zA-Z]: 알파벳 전체를 의미 |
|
| [^문자] | 해당 문자를 제외한 문자 매치 | |
| | | A|B와 같이 쓰이며 A 또는 B를 의미 |
| 문자 규칙 | 설명 | 동일한 표현 |
| \ | \ 자체를 의미 | |
| \d | 모든 숫자 | [0-9] |
| \D | 숫자를 제외한 모든 문자 | [^0-9] |
| \s | 공백 | [\t\n\r\f\v] |
| \S | 공백을 제외한 문자 | [^ \t\n\r\f\v] |
| \w | 문자 또는 숫자 | [a-zA-Z0-9] |
| \W | 문자 도는 숫자가 아닌 문자 | [^a-zA-Z0-9] |
Functions in re module
| 모듈 함수 | 설명 |
| re.compile() | 정규 표현식을 compile 찾고자 하는 pattern이 빈번한 경우 미리 compile하면 수월 |
| re.search() | 문자열 전체에 대해 정규 표현식과 매치되는지 검색 |
| re.match() | 문자열의 처음이 정규 표현식과 매치되는지 검색 |
| re.split() | 정규 표현식을 기준으로 문자열 분리하여 list로 리턴 |
| re.findall() | 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열을 찾아서 list로 리턴 |
| re.finditer() | 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열에 대한 iterater 객체를 리턴 |
| re.sub() | 문자열에서 정규 표현식과 일치하는 부분을 다른 문자열로 대체 |
re.compile
- Regular expression을 자주 reuse해야할 때 사용
- Regular expression object의 결과를 program이 saving
prog = re.compile(pattern)
result = prog.math(string)
=
result = re.match(pattern, string)
e.g., ^[\w*]$
^: 뒤의 [\w*]의 pattern으로 문장이 시작
$: 앞의 [\w*]의 pattern으로 문장 끝
\w: 문자 또는 숫자
[*]: 대괄호 안의 *는 * 그 자체를 의미()
→ Result: !, o, +, a ···
ex1 = re.compile('^[\w*]$')
for x in ['I', 'my', 'mine']:
print(f'\'{x}\' mathcs \t {exl.match(x)}')

vs.
ex2 = re.compile('^[\w]*$')
for x in ['I', 'my', 'mine']:
print(f'\'{x}\' mathcs \t {exl.match(x)}')

→ [\w]가 0번 이상 반복되면 매치
NLTK
Raw text를 normalization

Pre-tokenization
Pre-tokenization
- Basic approach: revmove speical characters(,.!?) → split by whitespace
- 의미적으로 중요한 special character가 제외될 수 있음 e.g., apostrophe - aren`t, don`t ,···
Korean text data
- Agglutinating lagunage (교착어) 를 고려해야 함 → 단순히 whitespace로 split 할 수 없음
- Morpheme (형태소) 단위로 split
Korean text preprocessing tools
- Supvervised learning based: KoNLPy, Khaiii
- Unsupervised learning based: soynlp
| 구분 | 정의 | 예시 |
| 문장 sentence | 뜻을 가진 하나의 단위 | '춘향은 몽룡이 노래를 부르는 소리에 잠에서 퍼뜩 깼다.' |
| 절 clause | '주어-서술어' | '춘향은 소리에 잠에서 퍼뜩 깼다.' / '몽룡이 노래를 부르는' |
| 구 phrase | 띄어쓰기를 하는 어절들의 집합 (어절과 같을 수 있음) |
'춘향은' / ''소리에 잠에서 퍼뜩 깼다.' / '몽룡이' / '노래를 부르는' |
| 어절 | 띄어쓰기가 되어 잇는 것 | 춘향은 / 몽룡이 / 노래를 / 부르는 / 소리에 / 잠에서 / 퍼뜩 / 깼다 |
| 단어 word | 문법상의 일정한 뜻을 가지는 말의 최소 단위 | 춘향 / 은 / 몽룡 / 이 / 노래 / 를 / 부르는 / 소리 / 에 / 잠 / 에서 / 퍼뜩 / 깼다 |
| 형태소 morpheme | 뜻을 가지고 있는 가장 작은 단위 (문법적인 정보도 일종의 뜻에 속함) |
· 춘향, 은, 몽룡, 이, 노래, 를, 소리, 에, 에서, 퍼뜩 · 부르는 = 부르 + 는 · 잠 = 자 + ㅁ · 깼다 = 깨(어근) + 었 + 다 |
KoNLPy → 규칙 기반
- Korean NLP in python - open source morpheme analyzers (tokenizer)
- Hannanum, Kkma, Komoran, Mecab, Okt(twitter) classes
- tokenizer.morphs(text): Parse phrase to morphemes
- tokenizer.nouns(text): Noun extractors
- tokenizer.pos(text): POS tagger e.g., [('동영', NNG), ('하', 'XSV'), ('ㅂ니다', 'EFN'), ('은', 'JX')]
Khaiii → data 기반
- Kakao Hangul Analyzer Ⅲ
- trained data: 세종코퍼스
- Model: CNN (RNN, LSTM, Seq2seq는 속도↓)

PyKoSpacing
띄어쓰기가 되어 있지 않은 문장을 띄어쓰기가 되어 있는 문장으로 변환
Py-Hanspell
네이버 한글 맞춤법 검사기를 바탕으로 만들어진 패키지
soynlp
- Unsupervised learning에 의해 주어진 data pattern으로부터 tokenizer가 train
- Word score unsing data statistics: score가 크면 soynlp는 word를 morpheme로 고려
- Cohesion probability: 주어진 문자열이 함께 등장할 경우, cohesion probability가 높음
- Branching entropy : 단어 앞뒤로 다양한 다른 단어가 등장할 경우, branching entroy가 높음
(entropy = 분산된 정도)

'NLP' 카테고리의 다른 글
| Tokenization (0) | 2022.06.28 |
|---|---|
| Basic Regular expression 연습 (0) | 2022.06.27 |
| RNNs with Attention (0) | 2022.06.24 |
| Language Model & AWD techniques (0) | 2022.06.22 |
| Character-level Language Model (0) | 2022.06.21 |