#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. не могу прокомментировать код — в любом случае это очень слабая форма сглаживания.