자연어 처리란?
자연어의 의미를 컴퓨터로 분석해 특정 작업을 위해 사용할 수 있도록 하는 것
- 응용 분야
- 기계 번역
- 감성 분석
- 문서 분류
- 질의 응답 시스템
- 챗봇
- 언어 생성
- 음성 인식
- 추천 시스템
단어 (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
- 주어진 텍스트파일 안에 있는 모든 단어들에 대해 newline으로 replace를 해준다.
- tr -sc 'A-Za-z' '\n' < ooo.txt
- 빈도수로 정렬
- 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_
- corpus
- 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" 생성
- ex)
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
- ex)
- 검색엔진에서 문서들을 추출할 때 유용할 수 있다.
- Case floding
- 모든 문자들을 소문자화함
- 일반화(generalization)를 위해 유용. 학습데이터와 테스트데이터 사이 불일치 문제에 도움
- 정보검색, 음성인식 등에서 유용
- 감성 분석 등의 문서 분류 문제에선 오히려 대소문자 구분이 유용할 수 있음.
(ex) 국가이름 US / 대명사 us)
- 모든 문자들을 소문자화함
- Lemmatization
- 어근을 사용해 표현
- ex)
am, are, is -> be
car, cars, car's, cars' -> car
- ex)
- 어근을 사용해 표현
- 최근 단어 정규화 경향 -> 가능하면 하지 않으려고 한다.
- 단어 정규화가 필요한 근본적 이유
- 단어들 사이 유사성을 이해해야하기 때문
- 단어 정규화 작업을 같은 의미를 가진 여러 형태 단어들을 하나의 단어로 대응시키는 것으로 이해할 수 있음
- 단어를 Vocabulary로 정의된 공간(고차원 희소 벡터)이 아닌 저차원 밀집 벡터로 대응시킬 수 있다면?
- ex)
car => [0.13, 0.52, 0.01]
cars => [0.15, 0.49, 0.02] - 단어임베딩을 사용해 단어를 표현하게 되면 단어정규화 필요성이 줄어들게 됨.
- ex)
- 단어 정규화가 필요한 근본적 이유
'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 |