자연어 처리란?

 

자연어의 의미를 컴퓨터로 분석해 특정 작업을 위해 사용할 수 있도록 하는 것

 

  • 응용 분야
    • 기계 번역
    • 감성 분석
    • 문서 분류
    • 질의 응답 시스템
    • 챗봇
    • 언어 생성
    • 음성 인식
    • 추천 시스템

단어 (Word)

 

  • 문장부호를 단어에 포함시켜야 할까?
    • 단어들 사이의 경계를 짓는 역할을 할 경우
    • 문장의 의미에 영향을 주는 경우
  • 구어체 문장의 경우
    • ex) I do uh main-mainly business data processing
    • main- 처럼 말을 더듬어 깨어진 단어가 나타나는 경우(Fragments)
    • uh와 같이 중간에 의미 없는 추임새(filled pauses)
  • 표제어(lemma) : 여러 단어들이 공유하는 뿌리 단어
  • 단어 형태(wordform) : 같은 표제얼르 공유하나 다양한 형태를 가지는 경우

  • 단어 정의
    • Vocabulary : 단어 집합
    • Type : Vocabulary의 한 원소 
    • Token : 문장 내 나타나는 한 단어 (an instance of a type in running text)
    • They picnicked by the pool, then lay back on the grass and looked at the stars.
      • 16 tokens
      • 14 types (the가 반복)

말뭉치(Corpus)

 

  • 하나의 말뭉치(corpus)는 일반적으로 대용량 문서들의 집합이다.
  • 말뭉치 특성은 아래 요소들에 따라 달라지게 된다.
    • 언어 (7097개 언어 존재)
    • 방언
    • 장르(뉴스, 소설, 과학기술문서, 위키피디아, 종교문서 등)
    • 글쓴이 인구 통계적 속성 (나이, 성별, 인종 등)
  • 다양한 말뭉치에 적용할 수 있는 NLP 알고리즘이 바람직.

텍스트 정규화

 

모든 자연어 처리는 텍스트 정규화가 필요하다.

  • 토큰화 (tokenizing words)
  • 단어정규화 (normalizing word formats)
  • 문장분절화 (segmenting sentences)

Unix 명령으로 간단히 토큰화하기

 

  • 텍스트 파일 안에 있는 단어들 토큰화
    • tr -sc 'A-Za-z' '\n' < ooo.txt 
      • 주어진 텍스트파일 안에 있는 모든 단어들에 대해 newline으로 replace를 해준다.
        • ex) Hello I studying nlp now
        • Hello
          I
          studying
          nlp
          now
  • 빈도수로 정렬
    • tr -sc 'A-Za-z' '\n' < ooo.txt | sort | uniq -c | sort -n -r
  • 소문자로 변환해 정렬
    • tr 'A-Z' 'a-z' < ooo.txt | tr -sc 'a-z' '\n' | sort | uniq -c | sort -n -r

 

문제점들

 

  • 문장부호(punctuation)들을 항상 무시할 수 없다
    • 문장부호가 단어 의미를 명확히 하는 경우 제외시키지 않는 것이 좋다.
  • 접어(clitics) : 다른 단어에 붙어 존재하는 형태 ex) I'm -> I am
  • 여러 개 붙어야 의미 있는 경우 ex) rock'n'roll

한국어의 경우에서의 토큰화

 

  • 토큰화가 복잡함
  • 띄어쓰기가 잘 지켜지지 않고 띄어쓰기가 제대로 되어도 한 어절은 하나 이상의 의미 단위들이 있을 수 있다.
  • 형태소(morpheme) : 뜻을 가진 가장 작은 말의 단위
    • 자립형태소 : 명사, 대명사, 부사 등
    • 의존형태소 : 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사 등
  • 단어보다 작은 단위(subword)로 토큰화가 필요하다.

Subword Tokenization

 

  • 만약 학습데이터에서 보지 못한 새로운 단어가 나타나면
    • 학습데이터 : low, new, newer
    • 테스트 데이터 : lower
    • -er, -est 등과 같은 형태소를 분리할 수 있으면 좋을 것
  • Subword tokenization algorithms
    • Byte-Pair Encoding (BPE)
    • WordPiece : 위와 유사한데 좀 더 확률적 개념을 활용해 향상시킨 모델
    • Unigram language modeling : 완전 확률을 기반한 모델
  • 두 가지 구성요소
    • Token learner : 말뭉치에서 vocabulary (token들 집합)을 만들어 냄
    • Token segmenter : 새로운 문장을 토큰화함.

Byte Pair Encoding(BPE)

 

  • 알고리즘 과정
    • Vocabulary를 단일 문자들 집합으로 초기화한다.
    • 다음을 반복
      • 말뭉치에서 연속적으로 가장 많이 발생하는 두 개 기호들(vocabulary 내 원소들)을 찾음
      • 두 기호들을 병합해 새로운 기호로 vocabulary에 추가
      • 말뭉치에서 그 두 기호들을 병합된 기호로 모두 교체
    • 위 과정을 k번 병합이 일어날 때까지 반복
  • 기호병합은 단어 안에서만 이뤄짐. 이것을 위해 단어끝을 나타내는 특수기호 '_'을 단어 뒤에 추가함. 그리고 각 단어를 문자 단위로 쪼갠다.
  • ex corpus )
    low low low low low lowest lowest newer newer newer newer newer newer wider wider wider new new
    • corpus
      5 l o w _
      2 l o w e s t _
      6 n e w e r _
      3 w i d e r _
      2 n e w _

      vocabulary
      _, d, e, i, l, n, o, r, s, t, w
    • e r을 er로 병합
      corpus
      5 l o w _
      2 l o w e s t _
      6 n e w er _
      3 w i d er _
      2 n e w _

      vocabulary
      _, d, e, i, l, n, o, r, s, t, w, er
    • er _을 er_로 병합
      corpus
      5 l o w _
      2 l o w e s t _
      6 n e w er_
      3 w i d er_
      2 n e w _

      vocabulary
      _, d, e, i, l, n, o, r, s, t, w, er, er_
    • n e을 ne로 병합
      corpus
      5 l o w _
      2 l o w e s t _
      6 ne w er_
      3 w i d er_
      2 ne w _

      vocabulary
      _, d, e, i, l, n, o, r, s, t, w, er, er_, ne
    • 다음과 같은 병합들이 일어남
      Merge          Current Vocabulary
      (ne, w)          _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new
      (l, o)             _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo
      (lo, w)           _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo, low
      (new, er_)       _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo, low, newer_
      (low, er_)        _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo, low, newer_, low_

  • Token segmenter
    • 새로운 단어가 주어졌을 때 어떻게 토큰화할 것인지?
    • Greedy한 적용 : 병합 학습한 순서대로 적용 ("e r" => "er")
    • 자주 나타나는 단어는 하나의 토큰으로 병합됨
    • 드문 단어는 subword 토큰들로 분할됨
  • 하나의 단어 "n e w e r _"은 하나의 토큰 "newer_"로 토큰화됨
  • 하나의 단어 "l o w e r _"은 두 개 토큰들 "low er_"로 토큰화됨

WordPiece

 

  • 기호들의 쌍을찾을 때 빈도수(BPE) 대신 likelihood를 최대화시키는 쌍을 찾음
    • ex)
      Corpus C

      5 l o w _
      2 l o w e s t _ 
      6 n e w e r _
      3 w i d e r _
      2 n e w _
    • Corpus C_1

      5 l o w _
      2 l o w e s t _ 
      6 n e w er _
      3 w i d er _
      2 n e w _
    • Corpus C_2

      5 lo w _
      2 lo w e s t _ 
      6 n e w e r _
      3 w i d e r _
      2 n e w _
    • P(C_1) > P(C_2)이면 "er" 생성

Unigram 

 

  • 확률모델(언어모델)을 사용
  • 학습데이터 내 문장을 관측(observed) 확률변수로 정의
  • Tokenization을 잠재(latent) 확률변수로 정의
    • 연속적(Sequential) 변수
  • 데이터 주변 우도(marginal likelihood)를 최대화시키는 tokenization을 구함
    • EM(expectation maximization) 사용
    • Maximization step에서 Viterbi 알고리즘 사용(wordpiece는 greedy하게 likelihood 향상)

단어 정규화

 

  • 단어들을 정규화된 형식으로 표현
    • ex)
      U.S.A. or USA or US (하나로 통일)
      uhhuh or uh-huh
      Fed or fed
      am, is be, are
  • 검색엔진에서 문서들을 추출할 때 유용할 수 있다.
  • Case floding
    • 모든 문자들을 소문자화함
      • 일반화(generalization)를 위해 유용. 학습데이터와 테스트데이터 사이 불일치 문제에 도움
      • 정보검색, 음성인식 등에서 유용
      • 감성 분석 등의 문서 분류 문제에선 오히려 대소문자 구분이 유용할 수 있음.
        (ex) 국가이름 US / 대명사 us)
  • Lemmatization
    • 어근을 사용해 표현
      • ex)
        am, are, is -> be
        car, cars, car's, cars' -> car
  • 최근 단어 정규화 경향 -> 가능하면 하지 않으려고 한다. 
    • 단어 정규화가 필요한 근본적 이유
      • 단어들 사이 유사성을 이해해야하기 때문
      • 단어 정규화 작업을 같은 의미를 가진 여러 형태 단어들을 하나의 단어로 대응시키는 것으로 이해할 수 있음
    • 단어를 Vocabulary로 정의된 공간(고차원 희소 벡터)이 아닌 저차원 밀집 벡터로 대응시킬 수 있다면?
      • ex)
        car => [0.13, 0.52, 0.01]
        cars => [0.15, 0.49, 0.02]
      • 단어임베딩을 사용해 단어를 표현하게 되면 단어정규화 필요성이 줄어들게 됨.

'AI > KDT 인공지능' 카테고리의 다른 글

[07/29] NLP : 문서분류  (0) 2021.07.29
[07/28] NLP : 언어 모델  (0) 2021.07.28
[07/22] Spark 3  (0) 2021.07.22
[07/21] Spark 2  (0) 2021.07.21
[07/20] Spark  (0) 2021.07.20

+ Recent posts