B/Deep Learning

[자연어처리] 어떻게 텍스트 데이터를 늘릴 것인가? (Text Data Augmentation)

f_s_t_k 2020. 11. 18. 01:08

보통 Data Augmentation은

1. 학습데이터가 부족해서 데이터를 늘리거나,

2. 불균형데이터의 레이블들의 균형을 잡아주기 위하여

진행하곤 한다.

 

최근 NLP관련 프로젝트를 하면서 크롤링한 데이터를 팀원들과 일일히 라벨을 붙이고 있는데,,

현대판 인형공장이 따로없거니와,

크롤링 한 데이터에서도 쓸만한 데이터를 거르고 나니 1/10 수준으로 줄어들어

Data Augmentation을 고려하지 않을 수 없었다.

그래서 텍스트 데이터에서 Data Augmentation(이하 DA) 방법이 있는지 궁금해 찾아본 구글링 결과를 정리해보았다.

 

 

만약 내가 다루는 데이터가 이미지라면,

위아래, 혹은 좌우로 shift시키거나, 상하좌우를 반전시키거나, 확대, 축소하는 등 쉽고 간단한 방법이 있는데

직관적으로 생각해봤을때 텍스트데이터의 DA는 그 결의 굉장히 다를것 같다는 생각이 들었다.

이미지를 뒤집거나, 방향을 살짝 트는 등의 변형은 라벨 값에 큰 영향을 미치지 않는 비전 분야와 달리..

텍스트에서는 단어 하나를 변화시키는게 문장 전체의 의미를 변화시킬 수 있기 때문이다.

 

그렇게 열심히 논문을 뒤지다가 2019년 EMNLP에서 발표된

"Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks" 

논문에서 꽤 합리적인 아이디어를 얻을 수 있었다.

 


 

1. SR

특정 단어를 유의어로 교체하는 방식.

2. RI, RD

임의의 단어를 삽입(Insertion)하거나 삭제(Deletion)하는 방식

3. RS

문장 내 임의의 두 단어의 위치를 바꾸는 것.

 

 

논문에서는 이러한 테크닉들이 실제로 성능 향상에 유의미한 영향을 미칠 수 있으며,

Augmentation 과정을 통해 생성된 문장들이 원 라벨의 성질을 잘 따른다는 연구 결과를 내놓았다.

DA 기법으로 생성된 데이터들이 어느 정도의 노이즈를 모델에 부여함에 따라 모델의 일반화에 보다 도움을 줄 수 있기 때문이다.

 

특히 "작은 데이터셋에서 DA를 통한 성능 향상의 폭이 더 크게 나타난다"라는 연구결과가 있었다.

데이터셋의 크기 (N_train)에 따라 문장 내 얼마만큼의 단어에 변형을 가할 것인지 (α),

원 문장 당 몇 개의 Augmented Sentence를 만들지 (N_aug) 등의 요소를 하이퍼 파라미터로 설정해

데이터셋 크기에 맞는 적정 하이퍼 파라미터를 명시해주었다.

 

이를 한국어용으로 코드구현을 한 좋은 자료가 있어 아래 깃허브를 함께 올린다 ! 

github.com/catSirup/KorEDA/blob/master/eda.pygithub.com/catSirup/KorEDA/tree/master

이분께서는 RD, RS 두가지 방식을 먼저 추천하는 것 같다.

 


사실 캐글이나 데이콘 같이 준 데이터가 있는 상황에서는 DA를 크게 고려하지 않아도 되겠지만,

실제로 내가 데이터를 얻는 작업부터 시작해야 하는 프로젝트에서는 거의 필수적인거 같고

나중에 내가 현업에 가게 되면 이러한 기법의 필요성은 더욱 부각되지 않을까?

 

 

[ 월간 자연어 처리 ] (www.facebook.com/monthly.nlp/posts/222119705886568)