책을 보고 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 단어 중 하나를 선택
'지난 기록 > TIL' 카테고리의 다른 글
[ Java Spring ] CRUD Repository vs JPA Repository (0) | 2022.12.04 |
---|---|
DB 외부 접속 포트 포워딩 문제 (0) | 2022.11.21 |
[ 인생퍼즐 ] TypeORM Transaction 사용 (0) | 2022.09.04 |
객체 지향 설계 - SOLID(2) (0) | 2022.03.14 |
객체 지향 설계 - SOLID(1) (0) | 2022.03.06 |