다음 문장은 몇 개의 단어를 가지고 있나?
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)
음성인식을 하는 경우에 uh um 이후에 문장의 일부분을 다시 반복할 가능성이 생긴다.
그렇다면 예측에 도움이 되는 경우가 있다?
말하는 방식은 사람에 따라 다른 습관에 기인하기에 사람을 구분하는 데에 도움이 될 수도 있다.
텍스트로 옮겨야하는 경우에는 제거하는 것이 맞다.
"Seuss's cat in the hat is different from other cats!"
표제어lemma : 여러 단어들이 공유하는 뿌리단어
단어형태wordform : 같은 표제어를 공유하지만 다양한 형태를 가질 수 있음
cat cats는 두가지의 형태를 가지고 있지만 동일한 표제어 cat을 공유 한다.
Vocabulary : 단어의 집합
Type : vocablulary의 한 원소
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 3times)
하나의 말뭉치는 일반적으로 대용량의 문서들의 집합이다.
말뭉치의 특성은 아래의 요소들에 따라 달라지게 된다.
-언어 : 7097개의 언어가 존재
-방언
-장르 : 뉴스, 소설, 과학기술문서, 위키피디아, 종교문서 등
-글쓴이의 인구통계적 속성 : 나이, 성별, 인종 등
다양할 말뭉치에 적용할 수 있는 NLP 알고리즘이 바람직하다.
모든 자연어 처리는 텍스트 정규화를 필요로 한다.
토큰화tokenizing words
단어정규화normalizing word formats
문장분절화segmenting sentences
# 텍스트 파일 안에 있는 단어들 토큰화
tr -sc 'A-Za-z' '\n' < hamlet.txt
# 알파벳 외의 모든 글자들을 new line으로 교체해준다.
# 빈도수로 정렬
tr -sc 'A-Za-z' '\n' < hamlet.txt | sort | uniq -c | sort -n -r
단순한 방법에는 문제점들이 있다.
1.문장 부호punctuation들을 항상 무시할 수는 없다.
-단어안에 나타나는 문장부호들 : m.p.h., AT&T, Ph.D.
-화폐단위($13), 날짜(15/03/2022), URLs(https://velog.com), hashtags(#ml), 이메일주소(@)
-문장부호가 단어의 이미를 명확하게 하는 경우는 제외시키지 않는 것이 좋다.
2.접어clitics : 다른 단어에 붙어서 존재하는 형태, we're
3.여러 개의 단어가 붙어야 의미가 있는 경우 : New York, rock'n roll
중국어는 한 문장 중간에 띄어쓰기가 없다.
나중에 vector로 만들어주는 것을 생각하면 단어를 글자로 다 나누어서 처리하는 것도 괜찮을 수 있다.
띄어쓰기가 잘 지켜지지 않고 띄어쓰기가 제대로 되었더라도 한 어절은 하나 이상의 의미 단위들이 있을 수 있다.
형태소morpheme : 뜻을 가진 가장 작은 말의 단위
-자립형태소 : 명사, 대명사, 부사 등
-의존형태소 : 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사 등
열심히 코딩한 당신, 연휴에는 여행을 가봐요
'열심히','코딩','한','당신',',','연휴','에는','여행','을','가봐요'
단어보다 작은단위subword로 토큰화가 필요함을 알 수 있다.
vocabulary는 학습데이터를 통해 만들어진다.
학습데이터 : low, new, newer
테스트데이터 : lower
-er, -est 등과 같은 형태소를 분리할 수 있으면 좋을 것이다
단어를 세부적으로 쪼개서 vocab을 만드는 것이 유리하다.
Byte-Pair Encoding
WordPiece
Unigram language modeling
Token learner : 말뭉치에서 vocabulary(token들의 집합)을 만들어 냄
Token segmenter : 새로운 문장을 토큰화함
1.vocabulary를 단일 문자들의 집합으로 초기화한다.
2.다음을 반복한다.
-말뭉치에서 연속적으로 가장 많이 발생하는 두 개의 기호들(vocab 내의 원소들)을 찾는다.
-두 기호들을 병합하고 새로운 기호로 vocabulary에 추가한다.
-말뭉치에서 그 두 기호들을 병합된 기호로 모두 교체한다.
3.위 과정을 k번의 병합이 일어날 때까지 반복한다.
기호병합은 단어 안에서만 이루어진다. 이것을 위해서 단어 끝을 나타내는 특수기호 을 단어 뒤에 추가한다. 그리고 각 단어를 문자 단위로 쪼갠다.
새로운 단어가 주어졌을 때 어떻게 토큰화할 것인가
greedy한 적용 : 병합을 학습한 순서대로 적용('e''r' => 'er')
자주 나타나는 단어는 하나의 토큰으로 병합됨
드문 단어는 subword 토큰들로 분할됨
l o w e r 는 두개의 토큰들 'low' 'er'로 토큰화 됨
기호들의 쌍을 찾을 때 빈도수 대신에 likelihood를 최대화시키는 쌍을 찾는다.
확률모델(언어모델)을 생성한다
학습데이터 내의 문장을 관측observed 확률변수로 정의한다
tokenization을 잠재latent 확률변수로 정의한다. 연속적인sequential 변수
데이터의 주변우도marginal likelihood를 최대화 시키는 tokenization을 구한다.
-Expectation Maximazation을 사용
-Maximization step에서 Viterbi 알고리즘을 사용(Wordpiece는 greedy하게 likelihood를 향상)
단어들을 정규화된 형식으로 표현
모든 문자들을 소문자화함
-일반화를 위해서 사용 : 학습데이터와 테스트데이터 사이의 불일치 문제에 도움
-정보검색, 음성인식 등에서 유용
-감성분석 등의 문서 분류 문제에서는 오히려 대소문자 구분이 유용할 수 있음(나라 US vs 대명사 us)
어근을 사용해서 표현
be -> am, are, is
car -> car, cars, car's
단어들 사이의 유사성을 이해해야하기 때문
단어정규화 작업을 같은 의미를 가진 여러 형태의 단어들을 하나의 단어로 대응시키는 것으로 이해할 수 있다.
단어 임베딩을 사용해서 단어를 표현하게 되면 단어정규화의 필요성이 줄어들게 된다.