Upstage AI Lab/AI 심화학습 : NLP

자연언어처리의 시작 : 텍스트 전처리

Visioneer 2024. 3. 5. 15:16

텍스트 전처리란? 

  • 데이터 분석 단계
    데이터 사이언스 관점, NLP 관점, CV 관점 모두에서 "전처리"는 중요함

  • 전처리 : 데이터 사이언스 관점 가장 재미없는 파트
    출처 : https://adtmag.com/articles/2016/03/25/data-science-report.aspx
  • 전처리 : 데이터 분석에 있어서 가장 오랜 시간이 걸리 일
    출처 : https://adtmag.com/articles/2016/03/25/data-science-report.aspx

    즉, 가장 오래 걸리면서 가장 재미없지만 중요한 일 "전처리"

  • 데이터 전처리 방법

    출처 : https://bdataanalytics.biomedcentral.com/articles/10.1186/s41044-016-0014-0
  • 초거대 인공지능 시대에도 여전히 유요한 데이터 전처리
    논문에 의하면 모델 학습 전 시작 후 4단계에서 전처리가 필요함을 확인할 수 있음.
    출처 : https://arxiv.org/abs/2303.18223
  • 컴퓨터가 텍스트를 이해할 수 있도록 하는 Data Preprocessing 방법 
    • HTML 태그, 특수문자, 이모티콘
    • 정규표현식
    • 불용어 (Stopword)
    • 어간추출(Stemming)
    • 표제어추출(Lemmatizing)

  • Preprocessing Pipeline
    출처 : 자연어처리 바이블(임희석 외, 고려대학교 NLP&AI 연구실)
  • 전처리 툴
    KoNLPy
    NLTK (Natural Language Toolkit)

토큰화 (Tokenization)

  • 토큰화 (Tokenization)
    주어진 데이터를 토큰 (Token)이라 불리는 단위로 나누는 작업
    토큰이 되는 기준은 다를 수 있음 (어절, 단어, 형태소, 음절, 자소 등)
    Character-based Tokenization / Word-based Tokenization / Subword-based Tokenization

  • 문장 토큰화 (Sentence Tokenizing)
    문장 분리

  • 단어 토큰화 (Word Tokenizing)
    구두점 분리, 단어 분리
    Ex)
    "아버지가 가방에 들어가신다." -> "아버지" "가" "가방" "에" "들어가" 신다" "."
    "Hello, World!" -> "Hello" "," " World" "!"

  • 토큰화가 왜 중요한가?
    단어 의미를 밀집 벡터로 표현하기 위해 단어들을 사전화 
    ※ 실제로 토크나이징의 방식에 따라 모델의 성능이 많이 달라진다.
    출처: 딥러닝을 이용한 자연어처리
  • 토큰화시 고려사항
    아래와 같은 예외 사항들이 많이 존재
    • 구두점이나 특수 문자를 단순 제외
      21/02/06 -> 날짜 / $100,000 -> 돈

    • 줄임말과 단어 내 띄어쓰기
      we're -> we are 의 줄임말 
      rock n roll -> 하나의 단어지만 띄어쓰기가 존재 

    • 문장 토큰화 : 단순 마침표를 기준으로 자를 수 없음
      서버에 들어가서 로그 파일 저장하고 메일로 결과 좀 보내줘. 그러고나서 점심 먹으러 가자.

  • 한국어 토큰화의 어려움
    영어는 New York과 같은 합성어나 he's 와 같이 줄임말에 대한 예외처리만 한다면, 
    띄어쓰기를 기준으로 하는 띄어쓰기 토큰화를 수행해도 단어 토큰화가 잘 작동

    • 영어와 달리 한국어에는 조사 가 존재. 
      ※ 형태소 단위의 토큰화가 필요.

      ex) '그가' '그에게' '그를' '그와' '그는' 과 같은 다양한 조사가 붙음. 
      같은 단어임에도 서로 다른 조사가 붙어서 다른 단어로 인식.
    • 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않음. 
      ex) 띄어쓰기를안해도사람들은이해를합니다.

  • Tokenization Tools

    • KoNLPy
      morphs : 형태소 추출
      pos : 품사 태깅
      nouns : 명사 추출 

    • SentencePiece 
      Google이 공개한 Tokenization 도구
      BPE, unigram 방식 등 다양한 subword units 지원 

    • Tokenizers
      Huggingface는 자연어처리에서 범용적으로 사용되는 대표적인 라이브러리
      Tokenizers의 경우 사전 학습된 다양한 언어모델들의 tokenization과 어휘 사전등을 지원
      이외에도 Models, Dataset, Evaluation등 다양한 하위 라이브러리들을 제공 

정제 (Cleaning)

  • 텍스트 정제
    • 코퍼스(말뭉치) 내에서 토큰화 작업에 방해가 되거나 의미가 없는 부분의 텍스트, 노이즈를 제거하는 작업
      토큰화 전에 정제를 하기도 하지만, 이후에도 여전히 남아있는 노이즈들을 제거하기 위해 지속적으로 수행
      노이즈는 특수 문자 같은 아무 의미도 갖지 않는 글자들을 의미하기도 하지만, 분석하고자 하는 목적에 맞지 않는 불필요한 단어들을 말함
      대부분 정규표현식이나, 파이썬 내장함수를 통해 제작
      주로 불용어, 특수 문자 제거 / 대,소문자 통합 / 중복 문구 제거 / 다중 공백 통일 등으로 구성 

    • 불용어 (Stop Words)
      분석에 큰 의미가 없는 단어로 코퍼스 내에 빈번하게 등장하나, 실질적 의미를 갖고 있지 않은 용어
      전처리 시 불용어로 취급할 대상을 정의하는 작업이 필요
      NLTK에서는 여러 불용어를 사전에 정의 

정규화 (Normalization)

출처 : https://www.nlplanet.org/course-practical-nlp/01-intro-to-nlp/05-tokenization-stemming-lemmatization.html

  • Stemming (어간 추출)
    어형이 변형된 단어로부터 접사 등을 제거하고 그 단어의 어간을 분리해내는 것
    대표적으로 포터 스태머 알고리즘이 존재
    ex) 먹었다, 먹을 -> 먹다

  • Lemmatization (표제어 추출)
    품사 정보가 보존된 형태의 기본형으로 변환
    표제어 추출에 가장 섬세한 방법은 => 형태학적 파싱

    • 형태소란?
      의미를 가진 가장 작은 단위
      어간 (stem) : 단어의 의미를 담고 있는 단어의 핵심 부분
      접사 (affix) : 단어에 추가적인 의미를 주는 부분
      ex) Cats -> cat(어간) + s(접사)
      Dies -> die

편집 거리 (Edit distance)

  • Levenshtein distance 
    한 string s1을 s2로 변환하는 최소 횟수를 두 string 간의 거리. 거리가 낮을수록 유사한 문자열로 판단함.
    s1 = '꿈을 꾸는 아이' 에서 s2 = '아이오아이' 로 바뀌기 위해서는 (꿈을꾸 - > 아이오) 로 바뀌고, 네번째 글자 '는' 이 제거
    string을 변화하기 위한 edit 방법을 세가지로 분류 

  • 연산 개수 판별 근거 
    • delete: '점심을먹자'
      '점심먹자'로 바꾸기 위해서는 '을' 삭제

    • insert : '점심먹자' 
      '점심을먹자'로 바꾸기 위해서는 반대로 '을' 삽입

    • substitution : '점심먹자'
      '점심먹장'로 바꾸기 위해서는 '자'를 '장'으로 치환 

정규표현식 (Regex)

  • 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어
  • 복잡한 문자열의 검색과 치환을 위해 사용되며, Python 뿐만 아니라 문자열을 처리하는 모든 곳에서 사용됨
    • 원하는 규칙에 해당하는 문자만 남기거나 제거, 규칙에 맞는 문자열 변환 등
  • 단 시간 내에 텍스트가 갖는 모든 패턴의 형태를 처리
  • 파이썬에서는 RE 라이브러리를 이용해 사용이 가능