Я работаю над генерацией предложений с использованием различных языковых моделей, одной из которых является модель laplace / add-one. Для стандартной биграмной модели (без сглаживания) мои вероятности хранятся в словаре.
"he": {
"sat": 0.5,
"did": 0.2,
"stopped": 0.2,
"enjoyed": 0.1
}
, где P ("sat" | "he") = 0,5. Сумма значений каждого члена сумма до 1. Аналогично, я сохраняю модель сглаживания следующим образом.
"he": {
"sat": 0.1
"did": 0.04
"stopped": 0.04
"enjoyed": 0.01
}
Конечно, из-за сглаживания сумма значений не суммируется до 1 Термины, которые не встречаются после «он», не находятся непосредственно в модели [«он»]. Вместо этого, после запроса P (s | "he"), программа проверяет, есть ли термин s в модели ['he'], и если нет, возвращает оставшуюся вероятность, разделенную на термины, не включенные в модель ['he' '].
Я предполагаю, что до сих пор понял это правильно.
Мой вопрос касается генерации предложений. Мне удалось добиться стандартного генерирования предложений с использованием моделей ванильного языка, но когда дело доходит до моделей на лапласе, я не слишком уверен, правильно ли я это делаю. Я записал следующее. Приведенная ниже функция случайным образом выбирает следующий термин из некоторого словаря.
def choose(d):
r = random.random()
total = 0
for k, v in d.items():
total += v
if r <= total:
return k
# if it arrived to this point, it went outside the scope (and thus resorting to other words in the corpus)
while True:
R = random.choice(d_terms)
if R not in d.items(): return R
По сути, она пытается выбрать слово, которое, как известно, следует за набором терминов, если нет, то прибегает к выбору любого термина в корпус, которого нет в исходном наборе известных слов.
Это приводит к гиббери sh и имеет смысл, почему. Рассмотрим один последний раз:
"he": {
"sat": 0.1
"did": 0.04
"stopped": 0.04
"enjoyed": 0.01
}
Чтобы сгенерировать термин после «он», он сначала проходит через известные термины, следующие за ним, которые накапливаются с общей вероятностью 0,2 выбора. Если случайное число не в пределах 0,2, оно обращается к другим терминам в корпусе. Вероятность того, что это произойдет, составляет 0,8.
Мой вопрос, это, очевидно, очень неправильно, нет? Вероятность получения неизвестных терминов выше, чем вероятность известных терминов. В результате этого последовательности, сгенерированные таким способом, в основном представляют собой gibberi sh, и я не ожидаю, что это так.
Правильно ли я предположить, что в моих рассуждениях что-то не так? Что это?
Спасибо.