본문 바로가기

지난 기록/TIL

Bigram Model 구현해보기

  책을 보고 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 단어 중 하나를 선택