Как можно использовать модель Лапласа (add-one) для генерации предложений? - PullRequest
0 голосов
/ 07 марта 2020

Я работаю над генерацией предложений с использованием различных языковых моделей, одной из которых является модель 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, и я не ожидаю, что это так.

Правильно ли я предположить, что в моих рассуждениях что-то не так? Что это?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...