LSA: 카운트 기반으로 단어의 의미를 벡터화 하는 알고리즘
Word2Vec: 단어를 벡터공간으로 표현(거리계산 단어들 간 의미 이해)
Seq2Seq, RNNLM, ...
기계가 언어를 이해할 수 있게 할 수 있도록 하는 모델
- Vocabulary: 기계가 학습한 단어의 집합
- OOV(Out of Vocabulary): 기계가 학습하지 않은 단어의 집합
만약 기계가 학습하지 않은 단어가 있으면, 어떻게 접근할 수 있을까요?
예를 들어, 뼈다구 해장국 먹으러 가자라고 기계한테 말했는데 기계는 뼈다귀는 아는데 뼈다구는 모른다면, 어떻게 학습시켜야 할까요?
어떻게 뼈다구와 뼈다귀가 같다는 것을 인지시킬 수 있을 까요?
문맥의 의미를 먼저 파악한 다음 단어가 무엇일 것이다 하고 접근하는 n-gram(bi-gram, tri-gram) 방법이 있습니다.
기계가 방금 위와 같은 것을 알도록 하는 알고리즘들은 BPE와 WPM이 있습니다.
BPE 알고리즘을 사용하면 OOV에 대한 문제점을 어느정도 해결할 수 있습니다.
BPE 알고리즘은 원래 압축 알고리즘인데, 자연어 처리 쪽에서 사용되고 있습니다.
압축할 때는 run-length 기법으로 압축하는 방법이 있습니다.AAAAA => A5
BPE: 연속으로 가장 많이 등장한 글자의 쌍 => 한 글자로 표현
https://arxiv.org/pdf/1508.07909
문자열: aaabadaaabac
Z = aa
문자열: ZabadZabac
Y=ab
문자열: ZYadZYac
X=ZY
문자열: XadXac
W=Xa
문자열: WdWc
하지만, 허프만 인코딩(트리)가 효율 짱 좋음!
문자열 처리쪽으로는 KPM 알고리즘과 보이어 무어 알고리즘이 많이 쓰이는데, 특히 보이어 무어 알고리즘이 많이 사용됩니다. 레벤슈타인 거리도 중요합니다.
-
모든 단어들을 글자로 분리
{'low': 5, 'lower': 2, 'newest': 6, 'widest':3}
=> l, o, w, e, r, n, w, s, t, i, d
-
빈도가 가장 높은 문자들의 쌍을 검색
-
많이 등장한 ㄷ
- est가 가장 많이 등장(9번) => est를 묶음
-
빈도가 가장 높은 문자들의 쌍을 검색
- lo가 가장 많이 등장(7번) => lo를 묶음
- {lo w e r: 2, 'w i d est': 3}
-
위의 과정을 반복(10번)
=> l, o, w, e, r, n, s, t, i, d, es, est, lo, low, ne, new, newest, wi, wid, wid, widest
=> lowest -> l, o, w, e, s, t
-> l, o, w, e, r, n, s, t, i, d
9 -> es, est,
7 -> lo, low,
6 -> ne, new, newest,
3 -> wi, wid, widest
lowest -> l, o, w, e, s, t