Добавить 1 сглаживание Лапласа для реализации биграммы

#python #nlp #n-gram #smoothing

#python #nlp #n-грамм #сглаживание

Вопрос:

Я выполняю упражнение, в котором я определяю наиболее вероятный корпус из нескольких корпусов при задании тестового предложения. Я пытаюсь протестировать модель сглаживания и-1 (Лапласа) для этого упражнения. Обычно я думаю, что у меня не работает алгоритм, но мои результаты очень искажены. Я знаю, что and-1 не является оптимальным (если не сказать больше), но я просто хочу быть уверенным, что мои результаты основаны на самой методологии and-1, а не на моей попытке.

Теперь метод сглаживания And-1 / Лапласа стремится избежать вероятности 0, по сути, забирая у богатых и отдавая бедным. Следовательно, биграмма, вероятность которой равна нулю, становится:

  1/V, V=the number of types 
  

Это означает, что вероятность любого другого биграма становится:

  P(B|A) = Count(W[i-1][W[i])/(Count(W[i-1]) V) 
  

Затем вы должны взять предложение для тестирования и разбить каждое на биграммы и протестировать их на соответствие вероятностям (выполнив вышеуказанное для 0 вероятностей), затем умножить их все вместе, чтобы получить конечную вероятность появления предложения.

Я реализую это на Python. Мой код выглядит так, все вызовы функций проверены на работоспособность:

  #return is a counter of tuples containing ngrams: {('A','B'):C} 
 #this means ('A','B') means (B|A) in probabilistic terms 
 bigrams[0]=getBigrams(corpus[0]) 
 ... 
 bigrams[n]=getBigrams(corpus[n]) 

 #return is a dictionary of the form P['A']=C 
 unigrams[0]=getUnigrams(corpus[0]) 
 ... 
 unigrams[N]=getUnigrams(corpus[n]) 

 #generate bigram probabilities, return is P('A','B')=p, add one is done 
 prob[0]=getAddOneProb(unigrams[0],bigrams[0]) 
 ... 
 prob(n)=getAddOneProb(unigrams[n],bigrams[n]) 

 for sentence in test: 
      bi=getBigrams(sentence) 
      uni=getUnigrams(sentence) 
      P[0]=...=P[n]=1 #set to 1 
      for b in bi: 
           tup=b 
           try: 
                P[0]*=prob[tup] 
           except KeyError: 
                P[0]=(1/len(unigrams[0]) 
           #do this for all corpora 
  

Тогда я бы сравнил все корпуса от P [0] до P [n] и нашел тот, который имеет наибольшую вероятность

Мои результаты не так уж велики, но я пытаюсь понять, является ли это следствием плохого кодирования, неправильной реализации или врожденных проблем и-1.

Комментарии:

1. В чем ваш вопрос? Вам нужна помощь в его реализации?

2. не могу прокомментировать код — в любом случае это очень слабая форма сглаживания.