eubinecto/politely

Implement `Scorer` with Ngram Language Models

eubinecto opened this issue · 1 comments

Why?

#105 에서 Word2Vec 모델 학습이 잘 되지 않음을 확인함. 애초에 score 함수를 실험 삼아 써보기 위해 선택한 모델이기에, 나에게 크게 필요한 모델은 아니었음. Word2Vec는 엄밀한 의미에서 언어모델이 아님.

때문에 가장 단순한 언어모델인 Ngram을 사용해서 일단 MVP를 구현해보고자 한다.

What?

Ngram. 시작은 Bigram으로, 문장이 주어졌을 때 그 문장의 확률을 계산하는 로직을 짜도록 한다.

How?

Word2Vec와 비슷하다. 그냥 객체를 생성하면 바로 학습이 시작되는 형태. 이 코드를 한번 따라해보자. Word2Vec의 Phrases는 내가 찾던 것이 아니다.
내가 찾고 있었던 건 Language Model 인데. 이를 위해선 nltk가 가장 적합할 것 같다.

예를 들면 이런 식으로?

train_model = NgramModel(train_counter)
train_model.train()
print(train_counter.counts[('he', 'was', 'a')]) # 39
print(train_counter.counts[('he', 'was')]) # 536
print(train_model.probs[('he', 'was', 'a')]) # 0.0727 = 39/536

그런데 NgramModel이라고 부르는 것의 구현은 내가 직접 해야하는 것 같다. 뭐, 어렵지는 않지만, 일단 이걸 쉽게 할 수 있는 라이브러리는 없는 것으로 보임

그냥 내가 밑바닥부터 구현하는 편이 나을수도 있다. 음.. 어차피 그냥 scorer만 만들고 싶은 것이었는데. 최소한의 코드를 사용해서 그냥 이게 제대로 동작은 할지를 보고 싶었던 것 뿐. 내가 직접 구현하는 것까지는 좀 그럼. 그렇다고 해서 바로 GPT3를 사용한다? 이건 토크나이저가 안 맞음. 사전학습된 걸 사용할 수는 있을 것 같은데..

  1. kiwi.join
  2. 다시 토크나이즈
  3. 점수 계산

토크나이저 호환이 되지 않으므로... 1번과 2번을 거치면 속도가 많이 떨어질 것임. 뭐.. 일단, 한번 해보는 것도 나쁘지 않다.
시간이 얼마나 걸리던, 일단 하나는 마무리해보자!