?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share Next Entry
Генеративная модель чатбота, основаная на правилах
kelijah
Добавил для эксперимента в движок чатбота поддержку генеративной грамматики (описание тут) для создания реплик в ответ на не-вопрос собеседника:


B:> Добрый день
H:> я поиграл в компьютерную игру
B:> Как называется эта компьютерная игра?






Последняя реплика бота не задается нигде явно, но создается движком генеративной грамматики по заданным шаблонам. В файле rules.yaml это правило выглядит так:

    - rule:
        if:
            text: 'ты поиграл в компьютерную игру'
        then:
            generate:
                - 'Как называется эта подлежащ,жен ?'
                - 'Как называется этот подлежащ,муж ?'
                - 'Как называются эти подлежащ,мн ?'
                - 'Как называется подлежащ,ед ?'
                - 'Как называются подлежащ,мн ?'






Опорная часть правила (if text ....) сопоставляется с фразой собеседника с помощью модели синонимичности, а продуктивная часть содержит варианты шаблонов генерации с нетерминальными токенами. Все нетерминалы заданы в отдельном файле и выглядят так:

подлежащ0,ед = [сущ,им,ед,одуш] [сущ,им,ед,одуш]
подлежащ0,ед = [сущ,им,ед]
подлежащ0,ед = [прил,им,ед,муж,~кр] [сущ,им,ед,муж]
подлежащ0,ед = [прил,им,ед,жен,~кр] [сущ,им,ед,жен]
подлежащ0,ед = [прил,им,ед,ср,~кр] [сущ,им,ед,ср]
подлежащ0,ед = [нареч,модиф_прил] [прил,им,ед,муж,~кр] [сущ,им,ед,муж]
подлежащ0,ед = [нареч,модиф_прил] [прил,им,ед,жен,~кр] [сущ,им,ед,жен]
подлежащ0,ед = [нареч,модиф_прил] [прил,им,ед,ср,~кр] [сущ,им,ед,ср]

подлежащ1,ед = подлежащ0,ед
подлежащ1,ед = подлежащ0,ед род_доп
подлежащ1,ед = подлежащ0,ед предл_доп

подлежащ,ед = 1 подлежащ1,ед
подлежащ,ед = подлежащ1,ед
...






Правила рекурсивно задают грамматику русского языка, точнее небольшого его подмножества. Мне очень не нравится, что эти правила пришлось описывать руками, но unsupervised режим получения грамматики по эталонным текстам пока у меня нет.

Алгоритм берет фразу человека, складывает ее слова в мешок, добавляет однокоренные слова и грамматические формы, а затем с помощью правил грамматики формирует множество вариантов предложений. Из них рандомно выбирается одна, с учетом вероятностей сгенерированных фраз. Важное достоинство этого алгоритма - рандомизация диалога, который перестает выглядеть механическим и безвариантным. Например:

B:> Добрый день
H:> а я сегодня в компьютерные игры играл
B:> В какую игры ты играешь сейчас?


Хотя, конечно, это не делает его чем-то умнее пресловутой китайской комнаты.

  • 1
Может попробовать не напрямую саму фразу простым рандомом, а её образ ("траекторию смыслов") в пространстве GloVe.

Вот некие варианты эмбединсга для фраз https://medium.com/explorations-in-language-and-learning/how-to-obtain-sentence-vectors-2a6d88bd3c8b


фишка генеративной грамматики в том, что без каких-либо усилий получаем сразу много вариантов фраз, а не одну:

входная: Миша вчера много играл на компьютере

генерация:
Во что он играл?
Он часто играет?
Как называется игра, в которую он играл?
Ему нравится играть на компьютере?
С кем он обычно играет?
...

Сомневаюсь, что какое-то векторное встраивание позволит одним вектором описать такие разные по семантике и лексике фразы.

Ну и восстанавливать фразу из вектора это то еще удовольствие. У меня всегда получались всевозможные артефактыю

Я наверное не очень точно сформулировал :)

Предложение у каждого сгенерированного предложения поставить в соответствие вектор. И выбирать среди векторных представлений фраз, например сравнивая их с векторными представлениеми последовательности уже прозвучавших фраз в диалоге.

Обратной задачи "достать из вектора фразу" при этом не возникает. Просто появляется некоторый "вектор смысла" по которому можно тренировать выбор вариантов отличный от чисто случайного.

Edited at 2019-06-04 09:58 am (UTC)

>Просто появляется некоторый "вектор смысла" по которому можно тренировать выбор вариантов отличный от чисто случайного.

Угу теперь понял.
Да, есть такая задумка, именно чтобы ранжировать сгенерированные фразы по их релевантности текущей беседе. Даже без дополнительной тренировки - предсказывать вектор по последним репликам диалога (это bert делает, например), и сравнивать векторы сгенерированных фраз с ним через косинусную меру. Но не пробовал еще в живую.

  • 1