책을 보고 Unsmooth Bigram Model 구현 코드를 Python으로 코드를 작성했다. Unknown Word와 특정 단어의 반복 문제 등이 있는 Model이다. 개념을 코드로 구현해보기 위한 것이니 고려해서 보면 좋을 것 같다.
1. Train Corpus 로딩
with open(Corpus 파일 경로, 'r') as fr:
contents = fr.read()
2. Bigram 단어 개수 Dictionary 생성
Corpus을 줄과 White Space(' ')기준으로 분리해 Bigram Model에 사용할 단어 개수 Dictionary를 생성
lines = contents.split('\n')
word_count_for_bigram_dic = {}
for line in lines :
sequence_words = tokenization(line.lower())
for index, word in enumerate(sequence_words) :
if index == len(sequence_words) - 1 : continue
n_minus_one_words = word_count_for_bigram_dic.keys()
n_minus_one_word = word
n_word = sequence_words[index + 1]
if n_minus_one_word in n_minus_one_words :
n_words = word_count_for_bigram_dic[n_minus_one_word].keys()
if n_word in n_words :
word_count_for_bigram_dic[n_minus_one_word][n_word] += 1
else :
word_count_for_bigram_dic[n_minus_one_word][n_word] = 1
else :
word_count_for_bigram_dic[n_minus_one_word] = {n_word : 1}
3. Bigram 확률 Dictionary 생성 [ Model ]
Bigram 단어 개수 Dictionary 기반으로 MLE(Maximum Likelihood Estimation) 계산하여 Bigram 모델 생성
word_prob_for_bigram_dic = {}
n_minus_one_words = word_count_for_bigram_dic.keys()
for n_minus_one_word in n_minus_one_words :
denominator = 0
n_words = word_count_for_bigram_dic[n_minus_one_word].keys()
word_prob_for_bigram_dic[n_minus_one_word] = {}
for n_word in n_words :
bigram_n_word_count = word_count_for_bigram_dic[n_minus_one_word][n_word]
denominator += bigram_n_word_count
for n_word in n_words :
bigram_n_word_count = word_count_for_bigram_dic[n_minus_one_word][n_word]
word_prob_for_bigram_dic[n_minus_one_word][n_word] = (float)(bigram_n_word_count)/denominator
4. BIgram Model 기반 테스트
시작을 나타내는 기호(<s>)를 입력하여 끝을 나타내는 기호(</s>)를 만날 때까지 확률 Top3 단어 중 하나를 선택
