Featured image of post 언어 모델

언어 모델

언어 모델과 자기회귀 언어 모델의 개념과 활용

언어 모델

언어 모델 (Language Model)은 입력된 문장을 기반으로 각 문장이 생성될 확률을 계산하는 모델이다. 문맥을 이해하고, 문장 구조를 예측하는 역할을 한다. 자동 번역, 음성 인식, 텍스트 요약 등에 활용된다.

문장 전체를 완벽히 예측하는 것은 어렵기 때문에 조건부 확률을 이용한 방식이 필요하다.

자기회귀 언어 모델

자기회귀 언어 모델 (Autoregressive Language Model)은 이전 단어들의 조건부 확률을 이용하여 다음 단어를 예측하는 모델이다. 문장 내의 모든 단어 시퀀스를 고려하여 다음 단어가 등장할 확률을 계산한다.

자기회귀 모델에서는 문장의 확률을 다음과 같이 표현할 수 있다.

$$ P(W_1, W_2, …, W_n) = P(W_1) \ P(W_2 | W_1) \ P(W_3 | W_1, W_2) \ … \ P(W_n | W_1, …, W_{n-1}) $$

즉, 전체 문장의 확률은 각 단어의 조건부 확률의 곱으로 나타낼 수 있다. 이는 연쇄법칙(Chain Rule)을 적용한 결과로, 각 단어의 확률을 이전 단어들의 조건부 확률을 이용해 순차적으로 계산하는 방식이다.

통계적 언어 모델

통계적 언어 모델 (Statistical Language Model)은 언어의 통계적 구조를 분석하여 단어 시퀀스를 생성하거나 분석하는 기법이다. 가장 기본적인 방식은 마르코프 체인(Markov Chain)을 활용하여 확률을 예측하는 것이다.

문장에서 특정 단어가 등장할 확률을 단어 빈도수를 기반으로 계산할 수 있다.

예를 들어, 말뭉치에서 안녕하세요라는 단어가 1000번 등장했고, 그다음 만나서가 700번 등장했다면 아래와 같이 계산할 수 있다.

$$ P(만나서 | 안녕하세요) = \frac{P(안녕하세요 만나서)}{P(안녕하세요)} = \frac{700}{1000} = 0.7 $$

하지만, 한 번도 등장한 적이 없는 단어에 대해서는 확률을 정확하게 예측할 수 없는 문제(데이터 희소성, Data Sparsity) 가 발생할 수 있다.

N-gram 언어 모델

N-gram 모델은 연속된 N개의 단어를 하나의 단위로 취급하여 문장을 분석하는 방식이다. N의 값에 따라 다음과 같이 구분할 수 있다.

  • Unigram (N=1): 단어 하나씩 독립적으로 분석
  • Bigram (N=2): 두 개의 연속된 단어를 분석
  • Trigram (N=3): 세 개의 연속된 단어를 분석

N-gram 모델에서 특정 단어의 확률은 이전 (N-1)개의 단어를 고려하여 계산된다.

$$ P(W_t | W_{t-1}, W_{t-2}, …, W_{t-N+1}) $$

즉, 이전 N-1개 단어의 조합을 기반으로 다음 단어의 확률을 예측하는 방식이다.

nltk을 사용하여 N-gram을 간단히 사용할 수 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import nltk

def ngrams(sentence, n):
    words = sentence.split()
    ngrams = zip(*[words[i:] for i in range(n)])
    return list(ngrams)

sentence = "안녕하세요 만나서 진심으로 반가워요"

unigram = ngrams(sentence, 1)
bigram = ngrams(sentence, 2)
trigram = ngrams(sentence, 3)

print(unigram)
print(bigram)
print(trigram)

unigram = nltk.ngrams(sentence.split(), 1)
bigram = nltk.ngrams(sentence.split(), 2)
trigram = nltk.ngrams(sentence.split(), 3)

print(list(unigram))
print(list(bigram))
print(list(trigram))
1
2
3
4
5
6
[('안녕하세요',), ('만나서',), ('진심으로',), ('반가워요',)]
[('안녕하세요', '만나서'), ('만나서', '진심으로'), ('진심으로', '반가워요')]
[('안녕하세요', '만나서', '진심으로'), ('만나서', '진심으로', '반가워요')]
[('안녕하세요',), ('만나서',), ('진심으로',), ('반가워요',)]
[('안녕하세요', '만나서'), ('만나서', '진심으로'), ('진심으로', '반가워요')]
[('안녕하세요', '만나서', '진심으로'), ('만나서', '진심으로', '반가워요')]