자연어 처리 소개
자연어의 의미를 컴퓨터로 분석해서 특정 작업을 위해 사용ㅎ할 수 있도록 하는 것
문장은 몇개의 단어를 가지고 있나?
문장부호를 단어에 포함시켜야할까?
구어체 문장의 경우
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)들은 항상 무시할 수 없다.
접어(clitics) : 다른 단어에 붙어서 존재하는 형태
we're -> we are
여러개의 단어가 붙어야 의미가 있는 경우
New York, rock'n'roll
토큰화
한국어의 경우 토큰화가 복잡함
띄어쓰기가 잘 지켜지지 않고 띄어쓰기가 제대로 되었더라도 한 어절은 하나 이상의 의미 단위들이 있을 수 있다.
형태소(morpheme): 뜻을 가진 가장 작은 말의 단위
Subword Tokenizartion
만약 학습데이터에서 보지 못했던 새로운 단어가 나타난다면?
Subword tokenization algorithms
두가지 구성요소
Byte-Pair Encoding
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
하나의 단어 "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를 향상)
단어정규화
단어들을 정규화된 형식으로 표현
검색엔진에서 문서들을 추출할 때 유용할 수 있다.
Case folding
모든 문자들을 소문자화함
일반화를 위해서 유용: 학습데이터와 테스트데이터 사이의 불일치 문제에 도움
정보검색, 음성인식 등에서 유용
감성분석 등의 문서분류 문제에서는 오히려 대소문자 구분이 유용할 수 있음.(국가이름 US 대명사 us)
Lemmeatization(여러개의 다른 형태의 단어가 하나의 의미 공유)
어근을 사용해서 표현
am,are,is -> be
car,cars,car's,cars' -> car
최근경향
단어정규화가 필요한 근본적인 이유
단어들 사이의 유사성을 이해해야하기 때문
단어정규화 작업을 같은 의미를 가진 여러 형태의 단어들을 하나의 단어로 대응시키는 것으로 이해할 수 있다.
단어를 vocabulary로 정의된 공간이 아닌 저차원 밀집 벡터로 대응시킬 수 있다면?
단어임베딩을 사용해서 단어를 표현하게 되면 단어 정규화의 필요성이 줄어들게 된다.
word2vector 같은것 인듯?