카테고리 없음

[딥러닝] 자연어처리 (토큰화, 차원의저주, 불용어, 어간추출, 표제어추출, 벡터화, TF - IDF, bag of words)

simplecode 2021. 8. 17. 02:58

NLP(Natural Language Processing)

자연어는 세부분야로 나누면 자연어 이해(NLU)와 자연어 생성(NLG) 두가지로 나눌수 있다

 

 

자연어처리 관련 용어

  • 말뭉치(Corpus) : 특정한 목적을 가지고 수집한 텍스트 데이터
  • 문서(Document) : 문장(Sentence)들의 집합
  • 문장(Sentence) : 여러 토큰(단어, 형태소 등)으로 구성된 문자열. 마침표, 느낌표 등의 기호로 구분
  • 어휘집합(Vocabulary) : 코퍼스에 있는 모든 문서, 문장을 토큰화한 후 중복을 제거한 토큰의 집합 (1,apple),(2,mango)
  •  

 

    • 토큰화(Tokenization) - 문장을 토큰(의미를 가진 가장 작은 단위)로 나눔. 한국어는 형태소로 나눈다.
    • 차원의 저주(Curse of Dimensionality) - Feature(단어의 종류/차원)가 늘어나면 instance 수도 늘어나는데 이로 인한 데이터셋의 차원이 늘어날수록 설명력이 떨어지게 된다. 같은의미끼리 묶어줘서 차원을 줄여줘야한다.
    • 불용어(Stop words) -  'I', 'and', 'of' 등 자주쓰이지만 의미가 없는 단어들. 차원의 저주를 줄이고 성능향상을 위하여 사용. 대부분의 NLP 라이브러리는 접속사, 관사, 부사, 대명사, 일반동사 등을 포함한 일반적인 불용어를 내장하고 있다. 
    • 어간 추출(Stemming) - 단어의 의미가 포함된 부분으로 접사등이 제거된 형태. 단어의 앞이나 끝부분을 자르는 역할을 하는 알고리즘으로 구성.  'ing', 'ed', 's' 등과 같은 부분을 제거하게 된다
    • 표제어 추출(Lemmatization) - 사전에 등재된 원형으로 추출. 표제어 추출(Lemmatization)은 복수형 -> 단수형, 동사 -> 타동사 등, 단어를 조금 더 정교하게 바꾸는 알고리즘으로 구성. 표제어 추출보다는 어간 추출의 속도가 더 빠르다(Stemming 보다 많은 연산이 필요)

.

벡터화(Vectorize)

: 자연어를 컴퓨터가 이해하는 언어로 변환

  • 등장 횟수 기반의 단어 표현(Count-based Representation) : 단어가 문서(혹은 문장)에 등장하는 횟수를 기반으로 벡터화하는 방법
    • Bag-of-Words (CounterVectorizer)
    • TF-IDF (TfidfVectorizer)
  • 분포 기반의 단어 표현(Distributed Representation) : 타겟 단어 주변에 있는 단어를 기반으로 벡터화하는 방법
    • Word2Vec
    • GloVe
    • fastText

문서-단어 행렬(Document-Term Matrix, DTM)

벡터화 된 문서는 문서-단어 행렬의 형태(각 행에는 문서((Document)가, 각 열에는 단어(Term)가 있는 행렬)로 구성.

1) Bag-of-Words(BoW) : TF(Term Frequency)

Bag-of-Words(BoW)는 가장 단순한 벡터화 방법 중 하나
문법이나 단어의 순서 등을 무시하고 단순히 단어들의 빈도만 고려

단점 : 문장의 의미가 살지 않는다

 

CountVectorizer() - Bag-of-words . 단어가 몇번 들어갔는지 세는 것 int

TF-idf -> 단어의 빈도수(TF) * 패널티(IDF). 연산결과에 의해 소수점으로 나옴. float

2)TF - IDF

문장이 주어졌을때 각 단어별로 그 문장의 연관성을 수치로 나타낸 값

 

TF (Term Frequency)

문서에 특정 단어가 출현한 횟수만큼 연관성이 높을 것으로 가정

단점 : a, the등 연관성이 없는데 출현하는 단어때문에 문서의 연관성을 약화시킬 수 있음

 

IDF (inverse document frequency)

문서와 관련성이 없는데도 자주 출현하는 단어에 패널티 부여

log(총문장의 갯수/단어가 출현한 문장의 갯수 + 1)

 

1을 더하는 이유는 smoothing. 또 0으로 나뉘는 것을 피하기 위하여

 

 

 


KoNLPy 는 한국어 형태소 분석 라이브러리

SpaCy 는 영어 표제어 추출 기능만 제공. Stemming을 제공하지 않고 Lemmatization만 제공

 

TfidfVectorizer(stop_words='english'
                                            ,ngram_range=(1,3)
                                            ,max_df=.8
                                            ,min_df=5
                                            ,max_feature=800
                                            )

 

위와 같이 파라미터를 설정하고 토큰화 하여 DTM을 만들 경우, 각 단어 하나하나 뿐만 아니라 연속된 n-gram 개 단어까지를 하나의 토큰으로 생성합니다. 모든 문서에 등장하는 단어가 토큰화 되는 것을 피하기 위해 전체 문서의 max_df % 이상에 등장하는 단어는 토큰화에서 제외합니다. 반대로 특정 문서에만 등장하는 단어가 토큰화 되는 것을 피하기 위해 min-df 개 문서에 등장하는 단어 역시 토큰화에서 제외합니다. 이렇게 각 토큰의 등장 횟수를 구한 뒤에 가장 많이 등장하는 max_feature 개 토큰만을 DTM의 열로 생성합니다.

 

n-gram : 단어의 묶음. ngram_range = (1, 2)라고 한다면, 단어의 묶음을 1개부터 2개까지 설정하라는 뜻
'play tennis', 'very good'과 같은 2개 짜리 묶음도 인덱스를 받는다

ngram_range를 사용하는 이유 : 묶여야 의미가 살아나는 단어 묶음이 있기 때문이다.

 

max_feature: 최대 feature를 설정해주는 파라미터. 벡터의 shape을 출력했을때 (2,8)이 나오면 \

8이 feature에 해당. 특정 데이터의 단어종류가 너무 길다면 이에따라 feature 수가 늘어나고, 모델성능이 저하된다