딥러닝 모델 학습은 컴퓨터 연산으로 이루어지기 때문에 벡터 형태의 텐서만 input 형태로 허용한다.

그래서 특히 불용어, 구두점 등 온갖 기호와 문자가 잡다한 텍스트 데이터를 활용한 전처리는 까다롭게 느껴진다 (to me). 오늘 이왕 시작한 김에 NLP task를 위한 텍스트 데이터 전처리를 깔끔하게 정리해보고자 한다.

참고 교재 :

<김기현의 자연어 처리 딥러닝 캠프: 파이토치 편>

🌟 <딥러닝을 이용한="" 자연어="" 처리="" 입문="">

토큰화

: 한 문장은 여러 단어들로 이루어져있다. 언어의 목적을 정보 전달이라고 본다면 문장 내 어떠한 낱개의 단어들이 의미적,문법적으로 합쳐져 어떠한 의미를 전달할 수 있는 문장을 이루는 것이다. 이 단어들은 각각 담당하는 기능이 다르고 독립적이다. 따라서 딥러닝 모델에 맞는 input 형태를 만들기 위해서는 레고 블록처럼 합쳐진 이 문장을 다시 토큰이라 불리는 단위로 나누는 작업을 하여야한다. 이 각자 하는 일이 다른 각 토큰 하나 하나가 문장의 feature 가 되기 때문이다. 즉 토큰화는 feature 을 결정짓는 일이다. 주의할 점은 토큰화가 단어 토큰화만 있는 것이 아니다. 한국어 같은 교착어의 경우 단어의 어근에 접사가 붙는 경우가 많다. 즉 단일 레고 블록인 줄 알았는데 그 안에서 또 쪼개지는 것이다. 그래서 의미를 가진 최소 단위인 형태소를 기준으로 토큰화를 해준다.

💥 주의 : kaggle 에서 제공하는 csv 형태로 깔끔하게 문장별로 한 행에 담긴 데이터가 아니라 웹 크롤링을 한다면 , 사실 한 줄에 한 문장씩 깔끔하게 크롤링된다는 보장이 없다. 그래서 문장 단위 토큰화 먼저 진행하여야한다.

  • 영어 토큰화 방법 : 단어 토큰화

    • 영어 토큰화 라이브러리 : NLTK, keras 내 자체 Tokenizer,Spacy

      #nltk
      from nltk.tokenize import word_tokenize
          
      sentence="JiYoon is not feeling herself today."
      print(word_tokenize(sentence))
      
      from tensorflow.keras.preprocessing.text import text_to_word_sequence
          
      print(text_to_word_sequence("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop."))
      

      NLTK 에는 word_tokenize 외에도 구두점을 분리해주는 WordPunctTokenizer 도 있다.

    • pytorch 의 경우 torchtext 내에 무슨 라이브러리를 써서 어떻게 토크나이징할 건지 인자로 전달할 수 있다.

      from torchtext.data import Field
          
      TEXT = Field(sequential=True,
                   use_vocab=True,
                   tokenize=str.split,
                   lower=True, 
                   batch_first=True)  
      
  • ​ 한국어 토큰화 방법 : 형태소 단위 토큰화 (;형태소 분석이라고 부르기도 한다)

    • KoNLPy : 여러 한국어 형태소 분석기를 사용할 수 있도록 만들어진 오픈소스 라이브러리이다

      from konlpy.tag import Okt
          
      okt=Okt()
      text="지윤씨는 요새 기분이 좋지 않다"
      print(okt.morphs(text))
      print(okt.morphs(text,stem=True)) # 형태소 단위로 나눈 후 어간을 추출 
      

정제 and 정규화

이 부분은 따로 내가 이해할 필요도 없이 딥러닝을 이용한 자연어 처리 입문 책에 코드와 함께 너무 잘 나와있었다.

  • 정제 (cleaning) : 갖고 있는 코퍼스로부터 노이즈 데이터를 제거한다.

    • 파이썬 re 를 통해 간편하게 cleaning 작업을 할 수 있다.

      • 등장 빈도가 매우 적은 단어 (모델 학습에 핵심 feature 로 작용하지 못하는 노이즈)
      • 길이가 짧은 단어
      • 불용어 ; 한국어 불용어도 구글링하면 리스트를 찾을 수 있고 아마 관련된 라이브러리들이 있을 것이다.
      from nltk.corpus import stopwords
          
      stop_words=set(stopwords.words('english'))
      
  • 정규화 (normalization) : 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어준다.

    • 규칙에 기반한 표기가 다른 단어들의 통합. Ex) US, USA / uh-huh, uhhuh
      • how ? 어간 추출(stemming)표제어 추출(lemmatization)
    • 대, 소문자 통합.

어간 추출 and 표제어 추출

  • 표제어 (Lemma) : ‘기본 사전형 단어’ ex. ‘am’,’are’,’is’ 의 표제어는 ‘be’

    • NLTK 의 WordNetLemmatizer 등등
  • 어간 추출 (Stemming)

    • NLTK 의 PortStemmer 등등

    스크린샷 2021-12-10 오후 11 59 16

서브워드 분절

  • 단어 단위 토크나이징은 희소성 (;한 마디로 단어가 너무 많으면 공간을 너무 많이 차지함) , OOV 문제를 동시에 가지고 있다. 이를 해결하기 위한 방법이 서브워드 단위 분절이다. 실제 Bert 등 모델에서 pretrain 에 활용된 방법이기 때문에 그 효과는 입증된 셈이다 (라고 나는 생각한다)
  • BPE 알고리즘은 기존 블로그들에 너무 잘 설명되어있어서 레퍼런스로 남기는게 더 좋을 듯 하다.
    • https://ratsgo.github.io/nlpbook/docs/preprocess/bpe/
    • https://velog.io/@gwkoo/BPEByte-Pair-Encoding

torchtext 까지 정리하면서 공부하려고 했는데 내용이 생각보다 길어져버렸다. torchtext 는 다음 마크다운에 정리해야겠다. 🤓