[15주차] NLP

2023. 6. 28. 18:00BOOTCAMP/프로그래머스 인공지능 데브코스

NLP: 텍스트 전처리

 

자연어 처리

텍스트 전처리

자연어 처리 소개

  • 자연어의 의미를 컴퓨터로 분석해서 특정 작업을 위해 사용할 수 있도록 하는 것
  • 응용분야
    • 기계번역
    • 감성분석
    • 문서분류
    • 질의응답시스템
    • 챗봇
    • 언어생성
    • 음성인식
    • 추천시스템

다른 분야처럼 보이는 것도 다 이어져 있는 것을 알 수 있음

 

단어(Word)

  • 다음 문장은 몇 개의 단어를 가지고 있나?
    • He stepped out into the hall, was delighted to encounter a water brother.
    • 문장부호를 단어에 포함시켜야 할까?
  • 구어체 문장의 경우
    • I do uh main - mainly business data processing
    • Fragments(깨어진 단어), filled pauses(uh, um)
  • “Seuss”s cat in the hat is different from other cats!”
    • 표제어(lemma): 여러 단어들이 공유하는 뿌리단어
    • 단어형태(wordform): 같은 표제어를 공유하지만 다양한 형태를 가질 수 있음
    • cat과 cats: 두 가지의 형태를 가지고 있지만 동일한 표제어 cat을 공유함
  • 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’ < hamlet.txt

Hamlet

By

William

Shakespeare

Edited

By

Barbara

A

Mowat

And

Paul

Werstine

문서에 나타나있는 모든 단어들을 빈도수에 맞춰서 나열하는 것이 중요.

Sort 명령으로 가장 자주 쓰이는 단어를 확인할 수 있고, 대문자를 소문자로 정렬할 수 있음.

  • 소문자로 변환해서 정렬
    • tr’A-Z’’a-z’<hamlet.txt | tr -sc’a-z’’\n’ | sort | uniq -c | sort -n -r

1090 the

974 and

760 to

679 of

623 I

558 you

553 a

520 my

480 hamlet

441 in

문제점들

  • 문장부호(punctuation)들을 항상 무시할 수는 없다
    • 단어 안에 나타나는 문장부호들: m.p.h., AT&T, Ph.D.
    • 화폐단위($12.50), 날짜(01/02/2021), URLs(http://www.yahoo.com), hashtags(#ml), 이메일주소(john@yahoo.com)
    • 문장부호가 단어의 의미를 명확하게 하는 경우는 제외시키지 않는 것이 좋다.
  • 접어(clitics): 다른 단어에 붙어서 존재하는 형태
    • We’re -> we are
  • 여러 개의 단어가 붙어야 의미가 있는 경우
    • New York, 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: 새로운 문장을 토큰화함

Subword Tokenization - Byte Pair Encoding (BPE)

  • Vocabulary를 단일 문자들의 집합으로 초기화한다
  • 다음을 반복한다
    • 말뭉치에서 연속적으로 가장 많이 발생하는 두 개의 기호를(vocabulary 내의 원소들)을 찾는다
    • 두 기호들을 병합하고, 새로운 기호로 vocabulary에 추가한다
    • 말뭉치에서 그 두 기호들을 병합된 기호로 모두 교체한다
  • 기호병합은 단어 안에서만 이루어진다. 이것을 위해서 단어 끝을 나타내는 특수기호 ‘_’을 단어 뒤에 추가한다. 그리고 각 단어를 문자단위로 쪼갠다.
  • Token segmenter
    • 새로운 단어가 주어졌을 때 어떻게 토큰화할 것인지?
    • Greedy 한 적용: 병합을 학습한 순서대로 적용 (“e r” => “er”)
    • 자주 나타나는 단어는 하나의 토큰으로 병합됨
    • 드문 단어는 subword 토큰들로 분할됨
  • 하나의 단어 “n e w e r ”은 하나의 토큰 “newer”로 토큰화됨
  • 하나의 단어 “l o w e r ”은 두 개의 토큰들 “low er”로 토큰화됨

Subword Tokenization - Unigram

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

단어정규화

  • 단어들을 정규화된 형식으로 표현
    • U.S.A or USA or US
    • uhhuh or uh-huh
    • Fed or fed
    • am, is be, are
  • 검색엔진에서 문서들을 추출할 때 유용할 수 있다
    • 검색어: “USA”, 문서: 단어 “us”만을 포함

Case folding

  • 모든 문자들을 소문자화함
    • 일반화(generalization)를 위해서 유용: 학습데이터와 테스트데이터 사이의 불일치 문제에 도움
    • 정보 검색, 음성인식 등에서 유용
    • 감성분석 등의 문서분류 문제에서는 오히려 대소문자 구분이 유용할 수 있음 (국가이름 “US” vs 대명사 “us”)

Lemmatization

  • 어근을 사용해서 표현
    • am , are, is -> be
    • car, cars, car’s, car’s -> car
  • He is reading detective stories -> He be read detective story

 

NLP: 언어모델

 

언어모델

  • 다음 문장 다음에 이어질 단어는?
    • “in” or “the”?
  • 다음 두 문장 중 나타날 확률이 더 높은 것은?
    • all of a sudden I notice three guys standing on the sidewalk
    • on guys all I of notice sidewalk three a sudden standing the
  • 목표: 문장이 일어날 확률을 구하는 것
  • 왜 필요한가?
    • 기계번역(machine translation)
      • P(high winds tonight) > P(large winds tonight)
    • 맞춤법 검사(spell correction)
      • The office is about fifteen minuets from my house
      • P(about fifteen minutes from) > P(about fifteen minuets from)
    • 음성인식(speech recognition)
      • P(I saw a van) >> P(eyes awe of an)
  • 언어모델(Language Model): 연속적인 단어들(sequence of words)에 확률을 부여하는 모델

P(W) = P(w1, w2, w3, w4, w5…wn)

  • 관련된 일: 연속적인 단어들이 주어졌을 때 그다음 단어의 확률을 구하는 것

P(wn|w1, w2…wn-1)

 

P(W) 구하기

  • 결합확률(joint probability) 구하기

P(its, water, is, so, transparent, that)

  • Chain rule을 사용해 보자

Chain Rule

  • 조건부확률

P(B|A) = P(A, B)/P(A)

P(A, B) = P(A) P(B|A)

  • 두 개 이상의 확률변수들의 경우

P(A, B, C, D) = P(A) P(B|A) P(C|A, B) P(D|A, B, C)

  • 일반적인 경우

P(x1, x2, x3,…, xn) = P(x1) P(x2|x1) P(x3|x1, x2)…P(xn|x1,…, xn-1)

  • 문제는?
    • 가능한 문장의 개수가 너무 많음
    • 이것을 계산할 수 있는 충분한 양의 데이터를 가지지 못할 것임

Markov Assumption

  • “한 단어의 확률은 그 단어 앞에 나타나는 몇 개의 단어들에만 의존한다”라는 가정 (Markov assumption)

Unigram 모델

 

  • 이 모델로 생성된 문장예제들
    • fifth, an, of, futures, the, an, incorporated, a, the, inflation, most, dollars, quarter, in, is, mass
    • thrift, did, eighty, said, hard, ‘m, july, bullish
    • that, or, limited, the

Bigram 모델

  • 이 모델로 생성된 문장예제들
    • texaco, rose, one, in, this, issue, is, pursuing, growth, in, a, boller, house, said, mr., gurria, mexico, ‘s, motion, control, proposal, without, permission, from, five, hundred, fifty, five, yen
    • outside, new, car, parking, lot, of, the, agreement, reached
    • this, would, be, a, record, november

N-gram 모델

 

  • 이것을 trigrams, 4-grams, 5-grams로 확장할 수 있다.
  • 멀리 떨어진 단어들 간의 관계(long-distance dependencies)를 완벽하게 모델링하진 못한다.
  • 하지만 많은 경우 n-gram만으로도 좋은 결과를 얻을 수 있다.

모델평가

 

  • 외재적 평가 (extrinsic evaluation)
    • 언어모델은 일반적으로 그 자체가 목표이기보다 특정 과제(맞춤법 검사 등)를 위한 부분으로서 쓰이게 된다.
    • 따라서 언어모델이 좋은지 판단하기 위해선 그 과제의 평가지표를 사용하는 경우가 많다.
  • 예를 들어, 맞춤법 검사를 위해서 두 개의 언어모델 A, B를 사용한다고 할 때
    • 각 모델을 사용해서 얼마나 정확하게 맞춤법 오류를 수정할 수 있는지 계산한다.
    • 정확도가 높은 언어모델을 최종적으로 사용한다.
  • 내재적 평가 (intrinsic evaluation)
    • 외재적 평가는 시간이 많이 걸리는 단점이 있다.
    • 언어모델이 학습하는 확률자체를 평가할 수 있다: Perplexity
    • 이 기준으로 최적의 언어모델이 최종 과제를 위해서는 최적이 아닐 수도 있다.
    • 하지만 언어모델의 학습과정에 버그가 있었는지 빨리 확인하는 용도로 사용할 수 있다.

문서 분류 (Text Classification)

  • 문서 분류란?
    • 텍스트를 입력으로 받아, 텍스트가 어떤 종류의 범주에 속하는지를 구분하는 작업
  • 다양한 문서 분류 문제들
    • 문서의 범주, 주제 분류
    • 이메일 스팸 분류
    • 감성 분류
    • 언어 분류

감성 분류

  • 영화 리뷰

  • 어디에 쓰일 수 있을까?
    • 영화: 리뷰가 긍정적인가 부정적인가?
    • 제품: 새로운 아이폰에 대한 대중의 반응은?
    • 정치: 이 정치인에 대한 사람들의 생각은?
    • 예측: 감성 분류를 기반으로 선거 결과를 예측
  • 감성의 여러 측면이 있을 수 있지만 여기선 간단한 작업에 집중
    • 감정적, 태도적, 성격적 측면
    • 이 텍스트는 긍정적인 태도를 보이고 있나? 아니면 부정적 태도를 보이고 있나?

문서 분류 방법들 - 규칙 기반 모델

  • 단어들의 조합을 사용한 규칙들을 사용
    • spam: blackk-list-address OR (”dollars” AND “you have been selected”)
  • Precision은 높지만 recall이 낮음
  • Snorkel
    • 각각의 규칙을 “labeling function”으로 간주
    • Graphical model의 일종인 factor graph를 사용해서 확률적 목푯값을 생성하는 generative model
    • 프로젝트 초기 labeled data가 부족하거나 클래스 정의 자체가 애매한 경우(하지만 규칙을 생성하는 것은 쉽다고 가정)에 매우 유용한 방법
    • 확률적 목푯값이 생성된 후엔 딥모델 등 다양한 모델을 사용가능

문서 분류 방법들 - 지도학습

  • 다양한 모델 사용 가능
    • Naive Bayes
    • Logistic regression
    • Neural networks
    • k-Nearest Neighbors

'BOOTCAMP > 프로그래머스 인공지능 데브코스' 카테고리의 다른 글

[17주차] GAN  (0) 2023.07.21
[16주차] NLP II와 Visual Recognition  (0) 2023.07.21
[14주차] Spark  (0) 2023.06.28
[13주차] monthly project3  (0) 2023.06.28
[12주차] SQL과 데이터분석  (0) 2023.06.27