[TIL]Day 78

이재희·2021년 2월 15일
0

TIL

목록 보기
78/312

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

문장은 몇개의 단어를 가지고 있나?

문장부호를 단어에 포함시켜야할까?

  • 문장부호는 문장의 경계를 의미. 이런 구분이 필요한 경우 포함시킨다.
  • 문장부호 자체가 의미를 가지고 있는 경우도 있음(?,! 등)

구어체 문장의 경우
Fragments 깨어진 단어 -> 더듬어서
filled pauses -> uh, um
uh나 um 같은 뒤에는 생각을 정리해서 이야기하는 경우가 많아서 예측도 가능...

표제어(lemma): 여러 단어들이 공유하는 뿌리단어
단어형태(wordform): 같은 표제어를 공유하지만 다양한 형태를 가질 수 있음
cat, cats

Vocabulary: 단어의 집합
Type: Vocabulary의 한 원소(Unique한 단어)
Token: 문장 내에 나타나는 한 단어(중복 포함 ' '로 끊는 느낌?)

말뭉치(corpus)란 대용량의 문서의 집합

말뭉치의 특성은 아래의 요소들에 따라 달라지게 된다.

  • 언어
  • 방언
  • 장르
  • 글쓴이의 인구통계학적 속성

다양한 말뭉치에 적용할 수 있는 NLP 알고리즘이 바람직하다.

텍스트 정규화
모든 자연어 처리는 텍스트 정규화를 필요로 한다.

  • 토큰화
  • 단어정규화
  • 문장분절화

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

tr -sc 'A-Za-z' '\n' < hamlet.txt
tr은 리플레이스 의미
c 옵션의 의미는 뒤에나오는 패턴을 제외한 나머지 패턴을 뒤에나오는 패턴으로 대채하겠다는 의미.
s 옵션은 중복되는 단어를 하나로 묶음.
스퀴즈

tr -sc 'A-Za-z' '\n' < hamlet.txt | sort | uniq -c | sort -n -r

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

문장부호(punctuation)들은 항상 무시할 수 없다.

  • 단어안에 나타나는 문장부호들: m.p.h.,AT&T,Ph.D
  • 화폐단위, 날짜, url, hashtag, 이메 일주소
  • 문장부호가 단어의 의미를 명확하게 하는 경우는 제외시키지 않는 것이 좋다.

접어(clitics) : 다른 단어에 붙어서 존재하는 형태
we're -> we are

여러개의 단어가 붙어야 의미가 있는 경우
New York, rock'n'roll

토큰화

한국어의 경우 토큰화가 복잡함
띄어쓰기가 잘 지켜지지 않고 띄어쓰기가 제대로 되었더라도 한 어절은 하나 이상의 의미 단위들이 있을 수 있다.
형태소(morpheme): 뜻을 가진 가장 작은 말의 단위

  • 자립형태소 : 명사,대명사,부사
  • 의존형태소 : 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사
    예) 열심히 코딩한 당신 연휴에는 여행을 가봐요
    '열심히''코딩''한''당신''연휴''에는''여행''을''가봐요'
    단어보다 작은단위(subword)로 토큰화가 필요함을 알 수 있다.

Subword Tokenizartion

만약 학습데이터에서 보지 못했던 새로운 단어가 나타난다면?

  • 학습데이터 : low, new, newer
  • 테스트데이터 : lower
  • -er,-est 등과 같은 형태소를 분리할 수 있으면 좋을 것이다.

Subword tokenization algorithms

  • Byte-Pair Encoding
  • WordPiece
  • Unigram language modeling(확률모델에 기반)

두가지 구성요소

  • token learner : 말뭉치에서 vocabulary(token들의 집합)을 만들어 냄
  • Token segmenter: 새로운 문장을 토큰화 함.

Byte-Pair Encoding
vocabulary를 단일 문자들의 집합으로 초기화한다.
다음을 반복한다.

  • 말뭉치에서 연속적으로 가장 많이 발생하는 두 개의 기호들(vocabulary 내의 원소들)을 찾는다.
  • 두 기호들을 병합하고 새로운 기호로 vocabulary에 추가한다.
  • 말뭉치에서 그 두 기호들을 병합된 기호로 모두 교체한다.

위 과정을 k번의 병합이 일어날때까지 반복한다.

입력 C는 여러개의 문자열을 가지고 있는 말뭉치
입력 K은 얼마나 많은 새로운 subword token을 추가할 것인가.

기호병합은 단어안에서만 이루어진다. 이것을 위해서 단어끝을 나타내는 특수기호 '_'를 단어 뒤에 추가한다. 그리고 각 단어를 문자 단위로 쪼갠다.

예제 말뭉치

low low low low low lowest lowest newer newer newer newer newer newer wider wider wider new new

corpus
5 low
2 lowest

6 newer
3 wider

2 new_

vocabulary
_ , d, e, i, l, n, o, r, s, t, w

이 vocabulary에서 가장 빈번하게 함께 일어나는 두개의 심볼을 찾는다.

e r 이 가장 빈번하게 나타나므로 er로 합치고
er이라는 심볼을 vocabulary에 추가한다.

그 다음은 er과 _가 가장 빈번하게 일어나므로
er_가 추가된다.

이런 과정을 계속 반복한다.
8번(k) 과정을 반복하면 다음과 같은 추가적인 vocabulary를 갖게 된다.
er,er,ne,new,lo,low,newer,low_

이제까지는 주어진 set을 가지고 시행하는 것이였고,
새로운 단어가 주어졌을 때 어떻게 토큰화 할 것인가?
이를 의미하는것이 Token segmenter

token segmenter

  • greedy한 적용: 병합을 학습한 순서대로 적용
  • 자주 나타나는 단어는 하나의 토큰으로 병합됨
  • 드문 단어들은 subword 토큰들로 분할됨

하나의 단어 "n e w e r "은 하나의 토큰 "newer"로 토큰화됨

하나의 단어 "l o w e r "은 두개의 토큰들 "low er"로 토큰화됨

subword가 의미를 가지고 있으므로, 이 방식이 도움이 될것임.

또 다른 Subword Tokenization - Wordpiece

기호들의 쌍을 찾을 때 빈도수 대신에 likelihood를 최대화 시키는 쌍을 찾는다.

likelihood 문장을 확률적으로 해석하는 것
하나의 문장이 있을 때 그 문장이 나타날 확률?

각각의 코퍼스를 가지고 likelihood를 계산
likelihood 계산은 어떻게? 문서 또는 문장이 주어졌을 때 확률을 구하는 것을 언어모델이라고 함. 이것은 다음시간에...

P(C1) > P(C2) 이면 C1에서 합쳐진 심볼을 생성한다.

또 다른 Subword Tokenization - Unigram

확률(언어모델)을 사용한다.
학습데이터 내의 문장을 관측 확률변수로 정의한다.
tokenazation을 잠재latent 확률변수로 정의한다.
연속적인 변수
데이터의 주변 우도를 최대화 시키는 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

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

Lemmeatization(여러개의 다른 형태의 단어가 하나의 의미 공유)

어근을 사용해서 표현
am,are,is -> be
car,cars,car's,cars' -> car

최근경향

단어정규화가 필요한 근본적인 이유
단어들 사이의 유사성을 이해해야하기 때문
단어정규화 작업을 같은 의미를 가진 여러 형태의 단어들을 하나의 단어로 대응시키는 것으로 이해할 수 있다.

단어를 vocabulary로 정의된 공간이 아닌 저차원 밀집 벡터로 대응시킬 수 있다면?
단어임베딩을 사용해서 단어를 표현하게 되면 단어 정규화의 필요성이 줄어들게 된다.
word2vector 같은것 인듯?

profile
오늘부터 열심히 산다

0개의 댓글