본문 바로가기

NLP

NLP preprocessing

<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 = 분산된 정도)

Cohesion probability, Branching entroy

 

'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