본문 바로가기

NLP/코드

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