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은 다음과 같은 한계가 있습니다.
첫 번째로 긴 문맥을 고려하기 어렵습니다. N-gram은 고정된 개수의 이전 단어만을 고려해서 다음 단어를 예측합니다. 그렇다면 한국어와 같이 주어와 동사가 먼 경우에는 둘의 특성을 고려하기 어려워질 수 있습니다. 이러한 장기문맥의존성을 해결하기 위해서 LSTM 등을 사용할 수 있습니다.
두 번째로 문법적인 구조를 파악하기 힘들다는 것입니다. N-gram은 단어의 순서에만 의존해서 문법적인 구조를 파악하기 어렵습니다.