Как рассчитать абсолютное дисконтирование, используемое в n-граммовой модели? - PullRequest
1 голос
/ 06 апреля 2020

Могу ли я задать несколько вопросов о реализации абсолютного дисконтирования? Спасибо за любую помощь!

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

  f(a_z)  = (c(a_z) - D) / c(a_)
  p(a_z)  = (c(a_z) > 0) ? f(a_z) : bow(a_) p(_z)
  bow(a_) = (1 - Sum_Z1 f(a_z)) / (1 - Sum_Z1 f(_z))

Однако результат откатывания веса, напечатанный моей программой, не совпадает с ARPA-файлом, сгенерированным ngram-count , Я думаю, что это вызвано моим неправильным пониманием формулы. Вот как я понимаю. Предположим, что для вычисления лука (a, b):

  bow(ab) = (1 - Sum_Z1 f(abz)) / (1 - Sum_Z1 f(bz)) = (N(ab) / C(ab)) / (N(b) / C(b))

, где N (ab) обозначает количество уникальных n-грамм, таких как 'ab c' и 'abd'.

Я прав? И когда дело доходит до лука (а), как рассчитать знаменатель, поскольку в «а» нет суффикса?

Заранее спасибо!

1 Ответ

0 голосов
/ 08 апреля 2020

Я нашел ключевой фактор для моего собственного вопроса. Это поощряет! Вот ответ:

Отправленная формула неверна

bow(ab) = (1 - Sum_Z1 f(abz)) / (1 - Sum_Z1 f(bz)) = (N(ab) / C(ab)) / (N(b) / C(b))

, а правильная -

bow(ab) = (1 - Sum_Z1 f(abz)) / (1 - Sum_Z1 f(bz)) = (N(ab) * D / C(ab)) / (1 - Sum_Z1 f(bz))
...