Category: лытдыбр

Category was added automatically. Read all entries about "лытдыбр".

Чатбот: полная переделка модели генерации ответа на seq2seq with attention

Репозиторий проекта чатбота: https://github.com/Koziev/chatbot
Докер-образ: https://github.com/Koziev/chatbot/releases/tag/0.0.2.10-alpha

Доработки в новом релизе чатбота

1. Полностью переработан код, строящий ответ на основе вопроса и предпосылок. Вместо нескольких моделей, делавших это для разных типов вопросов, теперь оставлена единственная sequence2sequence модель с "классическим" attention. На текущем датасете из ~81000 троек предпосылка-вопрос-ответ эта модель учится около 10 часов, что намного меньше суммарного времени старого ансамбля моделей. К тому же, качество новой модели выше.
Collapse )
Тестовый диалог с ботом

Вопросы идут без особого порядка, только для тестирования отдельных частей пайплайна бота и моделей. Реплики бота идут с префиксом B, фразы человека предваряются префиксом H.

Collapse )

Текущие концептуальные проблемы, над которыми предстоить серьезно поработать

1. У чатбота нет психического (эмоционального) состояния. Поэтому он не может устать от однотипных вопросов, обидиться на оскорбительные замечания, удивиться необычному факту и так далее. Ответы бота зачастую стереотипны.

2. В дополнение к предыдущему, бот не умеет предсказывать психическое состояние собеседника по его ответам. Поэтому он не знает, доволен ли собеседник его ответами, не сердится ли он и т.д.

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

4. Движок бота имеет ограниченные возможности по интерпретации неполных ответов человека, анафоры, элипсиса. Вопросы типа "зачем?", "почему?", "а еще?", а также местоимения 3-го лица (он, она etc) обычно ставят его в тупик, выражающийся в нерелевантном ответе.

5. В диалоговый движок заложена возможность строить ответ на основе 2х и более предпосылок. Таким образом, бот теоретически может выполнять сложные рассуждения, используя части и взаимосвязь множества фактов. Но текущая реализация механизма подбора релевантных фактов нормально работает только для случая, когда для ответа вообще не нужны дополнительные предпосылки (Чему равно 2 плюс 2?) или достаточно найти одну релевантную предпосылку в базе данных.

Использование статистики аргументной структуры для генерации рэпа

Цель

Овладеть искусством (или мастерством) генерации рэпа на заданную тему.

Я ожидал, что это будет попроще, чем онегинская строфа, но не тут-то было :) Приходится идти небольшими шагами, перебирая множество подходов.
Collapse )
PS: и немного свежей выдачи стихогенератора на тему программистов-лингвистов:
Collapse )

А вот как выглядит "примерно правильное решение" в исполнении естественного интеллекта

Продолжение темы "Чатбот в первом классе: склонность понемногу ошибаться как отличительная черта" возникло совершенно случайно, что делает его еще более ценным. Естественному интеллекту почти 7 лет, решал и потом снимал он сам, я просто сегодня случайно увидел в его фотках вот это:
Collapse )

Получение sparse distributed representation для слов с помощью автоэнкодера

Ранее (http://kelijah.livejournal.com/197813.html) я описывал алгоритм получения SDR из word2vec векторов через факторизацию матрицы.

Далее опишу более прямой и проще модифицируемый способ получения SDR для слов с помощью deep learning автоэнкодера.
Collapse )

Сеточная регрессия char-векторов в word2vector встраивания

При использовании word2vector представлений слов для синтаксического парсинга реальных текстов, а не искусственно подобранных предложений, всегда возникает проблема out-of-vocabulary слов. Эти несловарные токены возникают по разным причинам, включая опечатки, слияние соседних слов, ошибочное разделение одного слова на несколько, образование новых слов с помощью продуктивных приставок или составных слов:
Collapse )

Датасет для unsupervised обучения синтаксической модели для русского языка

Мой "текстоперегонный" куб сделал очередную итерацию, скушав пару десятков гигабайтов текстов из википедии, новостей и так далее, и выдав примерно 6 Гб с очищенными предложениями.

Если посмотреть на группу самых маленьких предложений по 4 токена, то с одной стороны 90 Мб файл ничего интересного не показывает:

Collapse )

Поищем теперь среди этих предложений перестановочные ДУБЛИКАТЫ. То есть нас интересуют пары (или группы) предложений, в которых русский почти свободный порядок слов показывает себя во всей силе:

Я был счастлив!
Счастлив я был!
Я счастлив был!

Исходный список содержит почти 3 миллиона предложений, так что он слишком большой для решения задачи в лоб перебором всех со всеми. Но, к счастью, умные дяди давно разработали подходящий алгоритм, см. краткую инфу https://en.wikipedia.org/wiki/MinHash или подробнейшее описание тут http://infolab.stanford.edu/~ullman/mmds/ch3.pdf

Описанный в доке алгоритм нужен для быстрого поиска дубликатов документов в интернете, и умеет даже нечеткое сравнение через Жаккардову меру с заданной релевантностью. Нам пока нечеткое сравнение не нужно, за исключением порядка слов.

Я сделал реализацию алгоритма на C#. Более того, я потом реализовал эту вкусняшку на pl/sql для поиска дублей в базе, хотя мучения с переводом матричных вычислений на временные таблицы отравили все удовольствие. Как бы то ни было, C# реализация кушает многомиллионные коллекции строк и выдает группы дубликатов, которые для коротких предложений очень похожи просто на bag-of-words:

Collapse )

На некоторых группах уже видны более сложные синтаксические правима - склонность слов образовывать автономные группы, которые при перестановках сохраняют относительную целостность, то есть образуют семантически неделимые единицы:

Collapse )

Как нетрудно видеть, каждая такая группа представляет семантически эквивалентное высказывание. То есть любое предложение в группе с точки зрения латентных семантических репрезентаций эквивалетно любому другому. Что приводит нас к задаче sequence2sequence. Как говорят математики в таких случаях - задача сводится к решенной, бинго.

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

Синтаксис в такой модели представляет собой набор трансформационных правил, которые сохраняют семантику исходной цепочки. Предполагаю, что это 50% "функционального" определения синтаксиса естественного языка. Недостающая часть связана с тем, что латентные репрезентации высказывания должны позволять ответить (сгенерировать ответ) на вопрос к любой части предложения, а также выполнить более сложную перефразировку. Но для таких задач у меня пока нет датасетов подходящего размера, так что сосредоточимся на трансформационном синтаксисе...