새소식

딥러닝/자연어 처리

NLP_Preprocessing : 1)코퍼스 수집 & 2)정제

  • -

Task를 해결하기 위해 보통 SOTA 모델을 적용하기 때문에 모델이나 알고리즘은 대동소이하다.

따라서 성능의 차별점은 데이터의 양과 품질이 될 수 있다. 따라서 전처리 과정은 아주 중요하다.

Preprocessing Workflow

1. 코퍼스 수집 : 구입,외주,크롤링

2. 정제 : Task에 따른 노이즈 제거, 인코딩 변환

(3. 레이블링 : Task에 따른 문장 or 단어마다 labeling 수행)

4. Tokenization : 형태소 분석기 활용하여 분절 수행

(5.  Subword Segmentation : 단어보다 더 작은 의미 추가 분절 수행)

6. Batchify : 사전 생성 및 word2index 맵핑 수행, 효율화를 위한 전/후처리

 

Service Pipeline

1. 정제 : 학습 데이터와 같은 방식의 정제 수행

2. Tokenization : 학습 데이터와 같은 방식의 분절 수행

3. Subword Segmentation : 학습 데이터로부터 얻은 모델을 활용하여 똑같은 분절 수행

4. Batchify : 학습 데이터로부터 얻은 사전에 따른 word2index 맵핑 수행

5. Prediction : 모델에 넣고 inference 수행

6. Detokenization : 사람이 읽을 수 있는 형태로 변환(index2word), 분절 복원

 


 코퍼스 수집 

데이터 공개 사이트

크롤링

  • 무한한 양의 코퍼스를 도메인 별로 수집이 가능하다.
  • 품질이 천차만별이며, 정제 과정에 많은 노력이 필요하다.
  • " http://도메인.com/robots.txt "로 크롤링 여부 확인

 

 코퍼스 정제 

 노이즈 제거의 Two steps

풀고자 하는 문제의 특성, 언어/도메인/코퍼스의 특성에 따른 다른 형태의 전처리 전략이 필요하다. 

  • 기계적인 노이즈 제거
    - 전각문자 변환
    - Task에 따른 전형적인 노이즈 제거
  • Interactive 노이즈 제거
    - 코퍼스 특성에 따른 노이즈 제거

    - 작업자가 상황을 확인하며 작업 수행

 

▮ 기계적인 노이즈 제거

전각문자 제거

전각문자란 하나의 글자가 정사각형을 이루는 경우를 말한다.

https://angelplayer.tistory.com/95

반각문자는 전각문자의 가로폭을 반으로 줄인 문자를 말한다.

 

왼쪽이 전각, 오른쪽이 반각

유니코드 상에서 숫자 또는 문자가 전각일 경우에는 제대로 인식을 못할 가능성이 크다.

'1'이라는 숫자가 전각일 경우에는 숫자가 아닌 일반 문자로 인식할 수 있기 때문이다.

그렇기 때문에 반각/전각 문자로 혼용되는 특수문자 또는 영문, 숫자 등은 반각문자로 바꾸어주는 작업이 필요하다. 

 

▮ Interactive 노이즈 제거

직접 노이즈를 확인하고 규칙을 찾아서 RegEX를 구현하고 RegEx를 적용하는 끝이 없는 과정이다. 

또한 규칙에 의해 노이즈를 제거하기 때문에 노이즈를 전부 제거하기는 어렵다.

 

정규식(Regular expression)을 활용한 정제

  • 복잡한 규칙의 노이즈도 제거/치환 가능
  • 코딩 없이 단순한 텍스트 에디터도 가능 : Sublime Text3, VSCode 등

 

정규 표현식의 기초, 메타 문자

•  [ ] : "[ ] 사이의 문자들과 매치"

[ ] : [2345cde] → 2,3,4,5,c,d,e 중의 character

[-] : [2-4c-e] → 2,3,4와 cde 중의 character

[^] : [^2-5c-e] → 2,3,4,5와 c,d,e를 제외한 모든 character

 

 

•  ( )

(x)(yz) → x를 첫번째 변수"\1"로 지정, yz를 두번째 변수"\2"에 지정

활용 예시) 양 끝에 알파벳으로 둘러싸인 'bc'를 제거

([a-z])bc([a-z]) → \1\2

abcd → ad

0bc1 →  0bc1

 

•  

(x|y) : x 또는 y가 나타남. 그리고 " \1"에 지정

 

•  ?

x? : x가 0번 또는 1번 나타남

 

•  +

x+ : x가 한번 이상 나타남

 

•  *

x* : x가 나타나지 않을 수도, 반복될 수도 있음

 

•  {n}

x*{n} : n번 반복

[0-9]{4} : 숫자가 4번 반복

[0-9]{4}\-[0-9]{4} : 전화번호

 

•  {n, }

x{n, } : n번 이상 반복

 

•  {n, m}

x{n, m} : n번 부터 m번까지 반복

 

•  .

.{9} : any character가 9개

.+ : 어떤 character가 한번 이상 나타남

 

•  ^$ : "문장의 시작과 끝을 표시"

^[0-9]{4}\-[0-9]{4}\-[0-9]{4}\-[0-9]{4}$ : 딱 카드번호로만 구성되어 있는 것을 확인

 

•  \s : "공백문자"
•  \S : "공백문자를 제외한 모든 문자"
•  \w : "알파벳 + 숫자 + _"  ([A-Za-z0-9_])와 동일
•  \w : "알파벳 + 숫자 + _ 제외한 문자"  ([^A-Za-z0-9_])와 동일
•  \d: "숫자" ([0-9])와 동일
•  \D: "숫자를 제외한 모든 문자" ([^0-9])와 동일

 


VS Code상에서 ctrl+f4로 interactive하게 정규표현식을 사용하여 데이터를 정제할 수 있다.

^(positive|negative)\t[0-9a-zA-Z\-=|]+$

replace all을 하니 빈 line이 생겨버린다.

빈 줄을 없애기 위해서 왼쪽과 같이 정제를 한다.

 

 

 

728x90

'딥러닝 > 자연어 처리' 카테고리의 다른 글

NLP_Preprocessing : 4)Tokenization  (0) 2022.06.27
NLP_Preprocessing : 3)Labeling  (0) 2022.06.26
RNN & LSTM  (0) 2022.06.25
How to generate text: decoding methods  (0) 2022.06.15
[LM metric] BLEU(Bilingual Evaluation Understudy)  (0) 2022.06.08
Contents