N-gram이란 통계적 자연어 처리 및 언어 모델링에서 사용되는 기법이다.
N-gram은 연속된 N개의 단어나 문자열의 시퀀스를 의미한다.
일반적으로 N-gram은 문장 내 단어를 기반으로 나올 단어를 예측하는데 사용된다.
문장에 대해 수학적으로 표현한다면 단어들의 순열로 이루어진 확률분포로 생각할 수 있다.
"n-gram은 통계적 기법입니다." 라는 문자은 P(n-gram은, 통계적, 기법)에서 가장 확률이 높은 그럴듯한 문장이라는 것이다.
이렇게 문장이 나타날 확률을 구한다면 그럴듯한 문장을 확률로 나타낼 수 있다.
그러나 세상에는 정말 많은 단어들의 조합이 있고, 실제 데이터에서 이 확률들을 구한다면 확률들은 0에 가깝다.
Data Sparsity 문제라고도 하는데, 이러한 문제는 다음 단어를 잘 예측하지 못하게 하는 문제가 있다.
모든 단어를 생각하지 않고, 단순하게 생각을 한다면 하나의 단어의 곱으로 생각할 수 있다.
P("Nice to meet you") = P("Nice", "to", "meet", "you") = P("Nice") X P("to") X P("meet") X P("you")
각 단어가 나타날 확률을 단어 별 빈도수를 계산해서 구하고, 문장 전체의 확률을 단어의 곱으로 곱해주는 모델이다.
이는 unigram 모델이다. 계산이 단순하지만, 단어의 순서를 생각하지 않아서 BOW(bag-of-words) 모델과 다르지 않다.
이러한 단점 대신 단어의 조합에 대해서 확률을 구한다.
P("Nice"|[Start]) X P("to"|"Nice") X P("meet"|"to") X P("you"|"meet") X P([END]|"you")
조건부 확률을 통해서 해당 문장을 표현할 수 있다. 하지만 단어가 늘어나면 희소성 문제가 커지기 때문에 대부분 bigram, trigram까지 사용하고 그 이후로는 잘 사용하지 않는다.
-
긴 문맥을 고려하기 어렵다. N-gram은 고정된 개수의 이전 단어만을 고려해서 다음 단어를 예측한다. 그렇다면 한국어와 같이 주어와 동사가 먼 경우에는 둘의 특성을 고려하기 어려워질 수 있다. 이러한 장기문맥의존성을 해결하기 위해서 LSTM 등을 사용할 수 있다.
-
문법적인 구조를 파악하기 힘들다. N-gram은 단어의 순서에만 의존해서 문법적인 구조를 파악하기 어렵다.