본문 바로가기
NLP

[NLP] 파이토치(Pytorch)를 이용한 텍스트 데이터 증강

by 단깅수 2024. 2. 29.
728x90

텍스트 데이터

https://neptune.ai/blog/data-augmentation-nlp

텍스트 데이터 증강은 문서 분류 및 요약, 문장 번역 등과 같은 자연어 처리 모델을 구성할 때 데이터세트의 크기를 쉽게 늘리기 위해서 사용되고, 텍스트 데이터 증강 방법은 크게 삽입, 삭제, 교체, 대체, 생성, 반의어, 맞춤법 교정, 역번역 등이 있습니다.

 

이번 포스팅에서는 자연어처리 데이터 증강(NLPAUG) 라이브러리를 활용해 텍스트 데이터 증강을 구현해볼 생각입니다.

 

자연어 처리 데이터 증강 라이브러리는 간단한 코드 구성으로도 데이터 증강을 적용할 수 있고, 문자, 단어, 문장삽입, 삭제, 대체 등 다양한 기능을 제공합니다. 또한 텍스트 데이터 외에 음성 데이터 증강도 지원합니다.

 

자연어 처리 데이터 증강 라이브러리는 다음과 같이 설치할 수 있습니다.

!pip install numpy requests nlpaug transformers sacremoses nltk

1. 삽입 및 삭제

삽입은 의미 없는 문자나 단어, 문맥에 영향을 끼치지 않는 수식어 등을 추가하는 방법입니다. 입의의 단어나 문자를 기존 텍스트에 덧붙여 보통 사용하고 삭제는 삽입과 반대로 임의의 단어나 문자를 삭제해 데이터의 특징을 유지하는 방법입니다.

 

삽입과 삭제는 문장의 의미는 유지하면서 시퀀스를 변경하기 때문에 간단하고 강력한 증강 기법이지만 너무 적은 양을 삽입하거나 삭제한다면 과적합 문제를 발생시킬 수 있고 너무 많은 양을 삽입하거나 삭제하면 데이터 품질 저하로 이어질 수 있기 때문에 주의가 필요합니다.

 

import nlpaug.augmenter.word as naw

texts = [
    'Those who can imagine anything, can create the impossible',
    'We can only see a short distance ahead, but we can see plenty there that needs to be done.',
    'If a machine is expected to be infallible, it cannot also be intelligent.',
]

# insert / substitute 기능 지원
aug = naw.ContextualWordEmbsAug(model_path = 'bert-base-uncased', action = 'insert')
augmented_texts = aug.augment(texts)

for text, augmented in zip(texts, augmented_texts):
    print(f'src : {text}')
    print(f'dst : {augmented}')
    print('----------------')
  • ContextualWordEmbsAug 클래스를 활용한 데이터 삽입
    • ContextualWordEmbsAug 클래스는 BERT 모델을 활용해 단어를 삽입
    • bert-base-uncased 경로를 지정해 허깅페이스에서 모델을 자동으로 다운로드
    • insert 뿐만 아니라 substitute 기능도 지원

 

import nlpaug.augmenter.char as nac

texts = [
    'Those who can imagine anything, can create the impossible',
    'We can only see a short distance ahead, but we can see plenty there that needs to be done.',
    'If a machine is expected to be infallible, it cannot also be intelligent.',
]

# insert / substitute / swap / delete 기능 지원
aug = nac.RandomCharAug(action = 'delete')
augmented_texts = aug.augment(texts)

for text, augmented in zip(texts, augmented_texts):
    print(f'src : {text}')
    print(f'dst : {augmented}')
    print('----------------')
  • RandomCharAug 클래스를 활용한 데이터 삭제
    • RandomCharAug 클래스를 통해 무작위로 문자를 삭제할 수 있음
    • insert / substitute / swap / delete 기능도 지원

2. 교체

교체는 단어나 문자의 위치를 교환하는 방법입니다. '문제점을 찾지 말고 해결책을 찾아라.'라는 문장에서 교체를 적용한다면 '해결책을 찾아라, 문제점을 찾지 말고' 로 변경될 수 있습니다.

 

하지만 단어를 교체할 때 본래의 의미나 맥락을 보존하지 못하게 되는 경우가 있고 무의미하거나 의미상 잘못된 문장을 생성할 수도 있으므로 데이터의 특성에 따라 주의해서 사용해야 합니다.

 

import nlpaug.augmenter.word as naw

texts = [
    'Those who can imagine anything, can create the impossible',
    'We can only see a short distance ahead, but we can see plenty there that needs to be done.',
    'If a machine is expected to be infallible, it cannot also be intelligent.',
]

# insert / substitute / swap / delete / crop 기능 지원
aug = naw.RandomWordAug(action = 'swap')
augmented_texts = aug.augment(texts)

for text, augmented in zip(texts, augmented_texts):
    print(f'src : {text}')
    print(f'dst_rwa : {augmented}')
    print('----------------')
  • RandomWordAug 클래스를 활용한 데이터 교체
    • RandomWordAug 클래스로 무작위로 단어를 교체 가능
    • 무작위 교체의 경우 문맥을 파악하지 않고 교체해 출력 결과의 the.와 같이 교체될 수 있으므로 주의

3. 대체

대체는 단어나 문자를 임의의 단어나 문자로 바꾸거나 동의어로 바꾸는 방법을 의미합니다. '사과'라는 단어를 '바나나'와 같이 유사한 단어로 변경하거나 '해'를 '태양'으로 바꿔 뜻이 같은 말로 변경하는 작업이라고 할 수 있습니다. 단어나 문장을 대체하면 다른 증강 방법보다 비교적 데이터의 *정합성이 어긋나지 않아 효율적으로 데이터를 증강할 수 있습니다.

 

# 데이터 정합성이란? 어떤 데이터들이 값이 서로 일치하는 경우를 뜻함.

 

하지만 교체와 마찬가지로 의미가 달라지거나 해석이 이상해지거나 조사가 어색해지는 경우가 있어 주의해서 사용해야 합니다.

import nlpaug.augmenter.word as naw

texts = [
    'Those who can imagine anything, can create the impossible',
    'We can only see a short distance ahead, but we can see plenty there that needs to be done.',
    'If a machine is expected to be infallible, it cannot also be intelligent.',
]

# wordnet / ppdb 지원
aug = naw.SynonymAug(aug_src = 'wordnet')
augmented_texts = aug.augment(texts)

for text, augmented in zip(texts, augmented_texts):
    print(f'src : {text}')
    print(f'dst_rwa : {augmented}')
    print('----------------')
  • SynonymAug 클래스를 활용한 데이터 대체
    • SynonymAug 클래스는 워드넷 데이터베이스나 의역 데이터베이스를 활용해 단어를 대체해 데이터를 증강
    • wordnet / ppdb를 인수로 활용해 문장의 의미 변경 가능

 

import nlpaug.augmenter.word as naw

texts = [
    'Those who can imagine anything, can create the impossible',
    'We can only see a short distance ahead, but we can see plenty there that needs to be done.',
    'If a machine is expected to be infallible, it cannot also be intelligent.',
]

reserved_tokens = [
    ["can", "can't", "cannot", "could"],
]

reserved_aug = naw.ReservedAug(reserved_tokens = reserved_tokens)
augmented_texts = reserved_aug.augment(texts)

for text, augmented in zip(texts, augmented_texts):
    print(f'src : {text}')
    print(f'dst_rwa : {augmented}')
    print('----------------')
  • ReservedAug 클래스를 활용한 데이터 대체
    • ReservedAug 클래스는 입력 데이터에 포함된 단어를 특정한 단어로 대체하는 기능을 제공
    • 가능한 모든 조합을 생성하거나 특정 글자나 문자를 reserved_tokens에서 선언한 데이터로 변경

4. 역번역

역번역(Back-translation)이란 입력 텍스트를 특정 언어로 번역한 다음 다시 본래의 언어로 번역하는 방법을 의미합니다. 예를 들어 영어를 한국어로 번역한 다음 번역된 텍스트를 다시 영어로 번역하는 과정이라고 할 수 있겠네요. 본래의 언어로 번역하는 과정에서 원래 텍스트와 유사한 텍스트가 새로 생성되기 때문에 패러프레이징(Paraphrasing) 효과를 얻을 수 있습니다.

 

역번역은 번역 모델의 성능에 크게 좌우됩니다. 번역이 정확하지 않거나 입력된 텍스트가 너무 복잡하고 어려운 구조를 가지고 있다면 성능이 크게 떨어지는 문제가 있습니다. 그래서 역번역은 기계 번역의 품질을 평가하는데 사용되기도 합니다.

 

import nlpaug.augmenter.word as naw

texts = [
    'Those who can imagine anything, can create the impossible',
    'We can only see a short distance ahead, but we can see plenty there that needs to be done.',
    'If a machine is expected to be infallible, it cannot also be intelligent.',
]

back_translation = naw.BackTranslationAug(
    from_model_name = "facebook/wmt19-en-de",
    to_model_name = "facebook/wmt19-de-en"
)

augmented_texts = back_translation.augment(texts)

for text, augmented in zip(texts, augmented_texts):
    print(f'src : {text}')
    print(f'dst_rwa : {augmented}')
    print('----------------')
  • BackTranslationAug 클래스를 활용한 역번역
    • BackTranslationAug 클래스는 입력 모델(from_model_name)과 출력 모델(to_model_name)을 설정해 역번역을 수행할 수 있음
    • 입력 모델은 영어를 독일어로 / 출력 모델은 독일어를 영어로 변경하도록 설정
    • 역번역은 모델 성능에 따라 결과가 크게 달라질 수 있고 두 개의 모델을 활용해 데이터를 증강하기 때문에 데이터 증강 방법 중 가장 많은 리소스를 소모함

5. 정리

방법 클래스 지원 기능
오타 오류 증강 nac.KeyboardAug() substitute
무작위 문자 증강 nac.RandomCharAug(action = "") insert / substitute / swap / delete
무작위 단어 증강 naw.RandomWordAug(action = "") substitute / swap / delete / crop
동의어 증강 nac.RandomCharAug(action = "") wordnet / ppdb
예약어 증강 naw.SynonymAug(aug_src = "") substitute
철자 오류 증강 naw.ReservedAug(reserved_tokens = ) substitute
상황별 단어 임베딩 증강 naw.SpellingAug() insert / substitute
역번역 증강 naw.BackTranslationAug(
    from_model_name,
    to_model_name,
)
Back translation
문장 요약 증강 nas.AbstSummAug(
    model_path = "t5-base"
)
Text Summarization

 

대부분의 내용은 <파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습> 도서를 참고했습니다.

728x90