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)
- 기계번역(machine translation)
- 언어모델(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 |